Descripción del Problema
Slug War es la adaptación de un juego de mesa a un videojuego multiplataforma. Las reglas del juego son simples: Se dispone de un tablero con hexágonos y pueden participar dos jugadores, cada uno con su propio color. En cada turno, los jugadores tienen dos opciones, crear una babosa en algún hexágono disponible o mover alguna de las que ya están en el tablero a alguna posición adyacente a su posición actual. Independiente de la decisión que tome el jugador, todas las babosas adyacentes a la posición donde termine la babosa serán conquistadas por el jugador que haya realizado la jugada. El juego termina cuando todo el tablero está ocupado y gana quien tenga más hexágonos conquistados.
Las aplicaciones del proyecto se centran particularmente en el área del entretenimiento virtual.
Análisis del Problema
Para desarrollar este proyecto se utilizó el framework LibGDX, que permite el desarrollo de aplicaciones para múltiples plataformas. Este framework proporciona una serie de clases útiles para el modelamiento de juegos en 2D y en 3D.
Por simplicidad, se modeló el juego en 2D. Los elementos básicos son: casillas (hexágonos) que conforman el tablero, las piezas (babosas que se colocan en las casillas) y los menús. Para representarlos se utilizaron principalmente tres de las clases proporcionadas por libGDX: Texture, Actor, Stage y Screen. Estas clases permitieron modelar al juego como un conjunto de pantallas o Screens, cada una de las cuales contiene un Stage que a su vez agrupa una serie de Actors cuya interacción permite definir la lógica del juego. La reacción a las entradas táctiles o clicks del Mouse del jugador son detectados mediante un InputListener(EventListener implementado por libGDX para reaccionar a múltiples entradas con mouse, pantalla táctil y teclado). Cada action listener es capaz de generar eventos de dicha naturaleza que son capturados por el InputListener.
Diagramas
A continuación se presenta el diagrama de clases:
Pruebas
Al ejecutar el programa se abre la siguiente ventana:
Si dentro de esta ventana se selecciona Jugar, se iniciará el juego pidiendo los nombres de los jugadores con textos de díalogo como los siguientes:
Una vez iniciado el juego la pantalla será como la siguiente:
En esta pantalla el mapa es desplazable y la interacción con el tablero es completamente táctil. Una vez terminado el juego, se mostrará una pantalla con los puntajes y el nombre del ganador. Su apariencia será la siguiente:
Por último, si en el menú principal se selecciona la opción de instrucciones, se mostrará la siguiente pantalla con las instrucciones del juego:
Dificultades Encontradas
La principal dificultad encontrada estuvo relacionada con los hexágonos del tablero. LibGDX utiliza elementos de la clase Actors para crear elementos capaces de generar eventos que puedan ser capturados por ActionListeners. El problema, es que la representación gráfica de éstos elementos obligatoriamente es un rectángulo. Originalmente, se utilizaron rectángulos más grandes que los hexágonos (imágenes con fondo transparente), sin embargo, al intercalar los hexágonos para construir el tablero, se solapaban las puntas de los rectángulos con el área sensible a eventos de los rectángulos de los hexágonos adyacentes. Para solucionar este problema se decidió utilizar áreas sensibles a eventos rectangulares más pequeñas que los hexágonos, de esta manera no se solapan las puntas al generar el mapa. Esto se ejemplifica mejor en el siguiente diagrama:
Listado de Bugs Presentes
El principal Bug fue causado por la solución al problema del solapamiento descrito en la sección anterior. Esto es porque, al disminuir el tamaño del área sensible a eventos de cada hexágono, ocurre que éstos solo reaccionarán si son tocados o clickeados cerca del centro. Por lo tanto si se intenta interaccionar tocando o clickeando las puntas laterales de los hexágonos estos, no desencadenarán la ejecución del Action Listener, y por tanto no habrá resultado.
Compatibilidad
En este caso se utilizó el lenguaje Java para solucionar el problema. Particularmente se hizo uso del framework open source libGDX que permite desarrollar el código del juego una vez en lenguaje Java y exportar el resultado a distintas plataformas como: Android, iOS, Windows, Linux y HTML5.
El proyecto puede ser descargado aquí