Tabla de contenido

Hola de nuevo,
Tras varios meses sin escribir nada en el blog, va siendo hora de volver con algo nuevo.

Esta es la primera de una serie de entradas que detallarán el proceso de desarrollo de un pequeño proyecto creado sobre Project Creation FX. Esta biblioteca es un pequeño motor de desarrollo de juegos en 2D en Java que estoy desarrollando de forma paralela. Mi intención es publicar la versión 1.0 este año, pero por desgracia el proceso de pulido requiere más tiempo del que dispongo. A pesar de todo, es posible usar lo que tengo hasta ahora para algún que otro proyecto, y además sirve para realizar pruebas a más alta escala con todos los módulos funcionando en sinergia.

En concreto, se desarrollará un shooter 2D en vista cenital. La intención es que sea un juego visual con algunos efectos de cámara, partículas y sonidos, rápido y ágil tanto en menús como en gameplay y sobretodo divertido, pero que requiera de cierta estrategia debido a los distintos comportamientos y condiciones que tenga cada enemigo.

El estilo visual no lo tengo muy claro aún y creo que se irá creando sobre la marcha. De todos modos, la idea inicial es crear algo simplista y basado en formas geométricas. Más fácil de crear para mí y de entender para el jugador.

Es posible que el nombre del proyecto dé una idea del tipo juego que se me ha ocurrido. Se trata de un juego de disparos (shooter) en el que los enemigos son números, en concreto potencias (power) de dos. El jugador es solo un número más, y debe destruir a los enemigos usando proyectiles que puede disparar con diferentes armas para ganar puntos. Siguiendo con la idea que usé en Run for your Life habrá una tabla de puntuaciones global y compartida por todos los jugadores para almacenar las 10 mejores partidas.

Vamos a ver algunos detalles del juego para hacernos una idea de lo que tenemos entre manos:

Elementos jugables

El jugador

El usuario comienza siendo un número 2 y podrá aumentar su valor, y sus probabilidades de supervivencia, destruyendo enemigos. El jugador podrá moverse con el teclado y apuntar y disparar usando el ratón, de forma similar a juegos como Nuclear Throne.

Cada vez que un proyectil del jugador golpea a un enemigo, éste recibirá daño que variará en función del arma usada. El daño se acumulará en el enemigo e irá dividiendo su valor por 2 cada vez que haya suficiente daño acumulado. Si el valor de cualquier entidad vale 1 o menos, la entidad es destruida. Las condiciones de muerte para el jugador son las mismas que para los enemigos, si el valor es menor o igual a uno, la partida termina.

Los enemigo vencidos pueden dejar en el escenario diferentes objetos para ayudar al jugador en la partida: potenciadores, multiplicadores o modificadores. Estos elementos se detallarán en fases posteriores de desarrollo.

El jugador puede recibir daño de los enemigos de dos formas distintas, a través de los proyectiles disparados por los enemigos, o al entrar en contacto con ellos. Tocar un proyectil enemigo divide el valor del jugador por dos, sin embargo, entrar en contacto con un enemigo significa dividir el valor del jugador por el valor actual del enemigo. El contacto con un enemigo puede significar el fin de la partida si el enemigo tiene un valor igual o superior al del jugador.

Se contempla el uso de varias armas para el personaje principal. En concreto, y para tirar de tópicos: una pistola, una ametralladora, y una escopeta. Las características de cada una son también sencillas de intuir, siendo la pistola la más equilibrada, con una cadencia media, daño medio y dispersión reducida; la ametralladora con una cadencia mucho mayor, daño reducido y una dispersión mayor; y la escopeta con una cadencia mucho menor, daño superior y múltiples proyectiles simultáneos en forma de abanico.

Los enemigos

Los enemigos son bastante más interesantes que el jugador en sí. Si listamos la serie de las potencias de dos, puede observarse ciento patrón en la misma:

2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, …

Se aprecia la serie 2, 4, 8, 6 repitiéndose como cifra final de cada uno de los posibles valores. Esto nos ofrece una oportunidad fantástica para implementar diferentes comportamientos de los enemigos basados en ese número final. Como nota para la implementación, para obtenerla última cifra de cualquier número, basta con hacer módulo 10 del mismo.

Esta cifra final también puede llevar asignado un color, de modo que el jugador puede relacionar cada apariencia con el comportamiento del enemigo. Dado que el valor que aparece en pantalla en cada enemigo irá cambiando conforme recibe daño, el color, y por lo tanto su comportamiento se determinará en función del valor inicial del enemigo.

Otra característica fantástica de los números es que cuanto más avanzan más cifras tienen, y por lo tanto, más espacio ocupan. Esto es particularidad hará que la dificultad del juego aumente progresivamente. Conforme el jugador avanza en la partida, los enemigos que aparezcan serán más fuertes, es decir, tendrán un valor mayor, y por lo tanto serán necesarios más proyectiles para destruirlos. Cuanto mayor sea el número, más ancho será, y por lo tanto, será necesario que el cuerpo del enemigo sea más grande para que el número quepa en él. Por cierto, si se usa una fuente de ancho fijo para mostrar los números en pantalla, será sencillo calcular dicha anchura. Esto aumento de tamaño hace que la posibilidad de que el enemigo toque al jugador aumente, lo que acerca el final de la partida. En Java, quizás la forma más sencilla de calcular el número de cifras de un número sea convirtiéndolo a String y obteniendo la longitud de la cadena resultante. Ir dividiendo por 10 y contar cuantas veces hay que hacerlo me parece más complejo.

El número de cifras del valor inicial de los enemigos se puede utilizar para parametrizar muchos más aspectos del enemigo, como puede ser su velocidad de movimiento, su habilidad de esquivar o su velocidad y patrón de disparo.

El escenario

El nivel dónde se desarrollará el juego no tendrá límites en ninguna de las dos dimensiones, es decir, el jugador podrá moverse indefinidamente en cualquier dirección. Tengo la idea de usar una función de ruido tridimensional para generar obstáculos y agujeros conforme va avanzando la partida, de modo que se generará alguna especie de muros que impedirán el paso tanto al jugador como a los enemigos, y huecos en el suelo que provocarán la muerte por caída de cualquier entidad que pase por encima de ellos.

Al inicio de la partida, el terreno será prácticamente liso, pero conforme avance, se volverá mucho más abrupto y lleno de obstáculos. En principio, esto únicamente hará que la dificultad aumente y no se proporcionará ningún tipo de ventaja al jugador, salvo la de usar el escenario en su beneficio.


Creo que lo detallado en las líneas anteriores puede servir para hacerse una idea del proyecto que se va a desarrollar en esta serie de entradas. Quiero dejar clara la idea de que no se trata de una guía paso a paso, si no de un diario de desarrollo en el que se irán indicando los avances y problemas encontrados conforme avance el proyecto.

Eso es todo por ahora, espero que vaya todo bien y nos vemos en la siguiente entrada.

Muchas gracias por leerme,
Lázarus Surazal.


Perfil
prLázarus logo info
Carlos J. Peláez Rivas (Lázarus Surazal)
Graduado y Máster en Ingeniería Informática por la Universidad de Málaga. Actualmente trabajando como desarrollador de aplicaciones en Java usando Vaadin.
Apasionado de los videojuegos, la música y alguna que otra tecnología, siempre buscando cosas nuevas que aprender y hacer.
Más sobre mi...
Contacto
Notificaciones