24 diciembre 2010

Creando un juego más modular usando C# y Tao.SDL

En entregas anteriores he comentado cómo dar crear el esqueleto de un juego usando C# y Tao.SDL. El problema de este planteamiento es que dejar todo el proyecto en un único fuente hace que sea cada vez más incómodo de manejar cuando se va haciendo más grande, y además imposibilita (casi) repartir trabajo entre varias personas.

Por eso, una alternativa más razonable cuando el proyecto no es muy pequeño, es descomponerlo en una serie clases que interaccionan.

Por ejemplo, en un juego de plataformas clásico, tendríamos un "Personaje" al que manejamos, una serie de "Enemigos" que nos atacan, "Premios" que recoger, quizá "Disparos" (o armas de otro tipo) con las que defendernos, todo ello coordinado por una clase "Juego", que se encargara de la lógica del juego: no sólo de repetir el bucle de juego sino de tomar las decisiones como:

  • Cuando nos toca un enemigo, ¿perdemos una vida o parte de la energía?
  • ¿El enemigo muere también cuando nos toca?
  • ¿Cuando se cambia de nivel? ¿Hay que recoger todos los premios? ¿Llegar a alguna puerta?
  • ¿Hay tiempo límite para acabar de recorrer un nivel? ¿Al agotar el tiempo perdemos una vida o toda la partida?
  • ...

Además, podríamos afinar un poco más y distinguir entre una "Partida" (una sesión de juego) y el conjunto del "Juego" (que también podría contener una pantalla de presentación, una de créditos sobre los autores, opciones para personalizarlo...).

Si somos prácticos, podríamos incluso crear una clase "Imagen", que ocultara los detalles de la manipulación de imágenes con SDL, y una clase "Hardware", que ocultara los nombres en inglés de las funciones y que simplificara alguna tarea tediosa, como la escritura de texto. Así, además, costaría menos trabajo portar nuestro juego a otra biblioteca gráfica, como Allegro. Y por encima de estas clases auxiliares podríamos crear otras más versátiles. Por ejemplo, por encima de "Imagen" podríamos crear una clase "ElementoGrafico", que permitiera figuras animadas (formadas por una secuencia de imágenes), que tuviera comprobaciones básicas de colisiones, etc.

¿Y como se puede hacer todo esto? ¿Hay algún fuente de ejemplo? Por supuesto, pero como sería demasiado largo leer todos los fuentes aquí, puedes descargar un proyecto de ejemplo en la página del "remake de Manic Miner", alojada en Google Code.

La versión 0.01 es sólo un esqueleto básico que muestra cómo podrían ser las clases antes mencionadas, tanto las "de infraestructura" (Hardware, Imagen, ElementoGrafico y alguna otra para manejo de tipos de letra y de sonidos) como las de "lógica de juego" (Juego, Presentacion, Creditos, Partida, Personaje). Versiones posteriores irán ampliando este proyecto poco a poco hasta llegar a algo que realmente sea "jugable":