Circled
Sinópsis
Un personaje flotando en el cosmos sujeto a un corazón y que está atrapado en un bucle infinito de anillos que se cierran sobre él.
Cómo jugar
Muévete haciendo clicks en pantalla para evadir los anillos tanto como puedas. La mecánica click and drag (clic y arrastrar) no está implementada.
Desarrollado para la Game Jam Ludum Dare 47 con el tema "Stuck in a Loop" por:
Sobre el desarrollo de este juego
El 2 de Octubre del 2020 se celebró la game jam Ludum Dare 47, un evento en el que hay que hacer un juego en 72 horas basado en una temática elegida por sorteo. El tema de la jam fue «Stuck in a loop» que significa atrapado en un bucle. Participamos en un equipo de tres personas.
La mayor parte del evento estuve transmitiendo en vivo lo que iba haciendo en mi ordenador y también las conversaciones que fuimos teniendo para ponernos de acuerdo. Transmití un total aproximado de 32 horas y en el siguiente vídeo puedes ver todas esas horas de trabajo resumidas en 5 minutos.
40 horas de transmisión en directo resumidas en minutos
Brainstorming previo
Unos días antes de que empiece la jam nos reunimos a proponer ideas en base a las temáticas candidatas, eran tres rondas de votación con 16 temáticas cada una, tomamos la primera ronda y elegimos 4 temas al azar. Luego cada uno se tomó 5 minutos para pensar una idea con una mecánica simple. Casualmente el tema «Stuck in a loop» estaba entre nuestros elegidos así que para la jam ya teníamos una idea previa.
Arte
La estética general del juego está basada en el estilo Synthwave, con colores saturados y fuentes acordes a ese estilo.
Los sprites están hechos en estilo Pixel Art usando el software Aseprite.
Detalles técnicos
Este juego es un proyecto 2D desarrollado con el motor Unity.
Estructura de escenas
Este juego está montado en dos escenas, la primera escena es la del menú principal que cuenta con algunos botones, uno para empezar el juego, otro para la ventana de créditos en la que se ve información de los desarrolladores, tenemos otro botón para cerrar el juego y un botón para iniciar la partida.
Mecánicas
El personaje se controla pulsando en el lugar de la pantalla a donde se quiere mover el jugador. El personaje comienza a acelerar en esa dirección hasta llegar a una velocidad máxima y luego comienza a detenerse, esto hace que por cada pulso el personaje se mueva una distancia predecible.
Durante todo el juego se generan anillos concéntricos cada uno con el doble de escala que el anterior, hay distintos tipos de anillos que tienen una o más aberturas de salidas. Mientras el anillo está activo irá reduciendo su tamaño hasta hacerse minúsculo. El personaje debe desplazarse para poder escapar por las aberturas ya que, si es tocado por un anillo, el personaje muere.
Este es el primer juego al que le implementé un sistema de traducción el cual tiene un registro de cada texto que aparece en pantalla y arrays que contienen las traducciones para cada una, al pulsar el botón de cambio de idioma pasamos al siguiente idioma del sistema y este se encarga de actualizar cada uno de los textos en pantalla.
El juego está montando en dos escenas, la primer escena es la escena inicial del menú principal en la que también se puede ver la pantalla de créditos. Al pulsar el botón «Play» cambiamos a la escena del juego. Ya que en la escena del juego tenemos textos en pantalla, fue necesario pensar en un sistema para transferir datos entre escenas y así poder asignar el texto en el idioma apropiado.
En las versiones de Android y Windows el sprite del sol que aparece al fondo en la escena del juego cambia de tamaño dependiendo de la amplitud de la música, esto se hace leyendo un trozo de los bytes del clip de audio y promediándolos para sacar un valor que luego se relacionará a la escala del sprite. No es posible hacer esto en WebGL debido a que una de las funciones que nos permite analizar el clip de audio no se puede usar en WebGL. Una alternativa podría ser precalcular estos valores para cada canción y tenerlos organizados estos datos en listas para ir aplicándoselos a la escala del sprite.
En este juego se hace un guardado de datos usando PlayerPrefs para recordar cuál fue la puntuación máxima y actualizarla en caso de superarla.