En el último tiempo, estuve muy interiorizado en la programación de aplicaciones web utilizando Frameworks como Ruby on Rails y Joomla Framework (me refiero al Framework PHP detrás del CMS). Ambos tienen una característica en común, que están diseñados siguiendo una filosofía Model-View-Controller (Modelo-Vista-Controlador).
Este tipo de arquitectura se basa en separar una aplicación en tres módulos independientes. El Modelo son los datos que se manejan en la aplicación, las Vistas son las distintas formas de presentar los datos al usuario, el Controlador es la forma que tiene el usuario de manipular los datos. También se suele agregar un Mediador que no es mas que un objeto que se encarga de coordinar la comunicación entre los componentes. De esta forma se evitan dependencias fuertes entre las interfases de cada componentes, y mas importante, se genera una reusabilidad sorprendente en las aplicaciones que programamos.
Hace poco, con un amigo decidimos empezar un pequeño proyecto para probar distintas técnicas de inteligencia artificial en tiempo real. La idea es comenzar con los clásicos Steering Behaviors de Craig Reynolds, extenderlo a Flocking y Squads y después implementar técnicas mas avanzadas (aunque tampoco totalmente novedosas) como Automatas Celulares, para simulación de fenómenos físicos como explosiones, y filtros de partículas para simular el conocimiento que tiene la AI del mundo que la rodea. Todo esto, ejemplificado con pequeños juegos que muestren las técnicas. Voy a ir mostrando en este blog las distintas técnicas, ejemplificandolas con Applets cuando sea posible.
El primer problema que hace años que no programo en Java y no tenía ganas de empezar inmediatamente a refrescar esos conocimientos. En lugar de eso me propuse utilizar Python, un lenguaje que permite programar en forma veloz, generalmente para realizar prototipos de programas que luego pueden ser reimplementados en lenguajes "de gente seria" o, mi preferida, optimizados implementando solamente partes críticas en lenguajes de mejor rendimiento.
Otra ventaja que tiene Python, es la posibilidad de crear Applets Java mediante la utilización de Jython. Utilizando esta implementación de Python en Java, es posible compilar código Python puro (que no depende de bibliotecas externas) e incluso utilizar bibliotecas externas de Java (imprescindible si se quiere mostrar gráficos y acceder al mouse).
Mientras tanto, y hasta tener algo para mostrar en este blog, voy a utilizar Python para programar, Pygame para acceder al hardware (mouse, teclado, display y reloj del sistema) y numpy para los cálculos que requieran mayor eficiencia.
Viendo ese spaghetti de requerimientos, necesitábamos asegurarnos una buena separación de lo que es Pygame y Numpy (librerías externas que no pueden ser llevadas a Java) de lo que es código Python puro. Y a la vez, necesito que sea fácil introducir Java y sus bibliotecas cuando decidamos implementar Applets.
Elegir una arquitectura MVC pareció la solución mas atinada. De esta forma, el View principal y los Controllers del mouse y el teclados serían implementados usando Pygame, heredando de una clase abstracta general. En un futuro se puede reimplementar la misma clase abstracta en Java. El modelo y el mediador, por otro lado, no tendría ninguna dependencia de este tipo de librerías.
Veamos ahora la estructura mas concreta y los dilemas típicos que surgen al utilizar MVC para juegos. Voy a utilizar como ejemplo la aplicación que tengo desarrollada hasta el momento. Por supuesto que iré refactorizando en el futuro y cuando sea necesario explicaré los cambios en este blog. El código al día se puede descargar en el repositorio SVN, no soy ningún gurú de programación, con lo cual se aceptan sugerencias e ideas.
En el siguiente post voy a explicar a grandes rasgos como diseñé la primer versión de la aplicación (Casi un esqueleto con capacidades mínimas en el momento de escribir este post) utilizando MVC.
Ver siguiente post.
Ver siguiente post.