jueves, 27 de septiembre de 2012

STEAMPAC 3D - Videojuego arcade

Tras un tiempo de pausa, estoy de vuelta con vosotros con un juego completamente realizado con Blender y que utiliza su motor de juegos.

Vídeo con SteamPac 3D 1.0 en funcionamiento

steampac01

Características generales:
Steampac es un juego de laberinto inspirado por el popular Pac-man (también conocido en España como "Comecocos"), aunque con una estética diferente (mezcla de estilo "Toon" y "Steampunk") y con personajes y escenas en 3D.
Este juego está totalmente desarrollado con Blender y utiliza su motor de juego.
Salvo un par de líneas de código en Python, toda la programación se ha llevado a cabo mediante "logic bricks".

steampac01 steampac01
Capturas del videojuego en funcionamiento

Características técnicas:
El reproductor autónomo tiene una resolución de 640x480 y utiliza un sombreado GLSL.
El Lenguaje OpenGL Shading (GLSL) necesita una tarjeta gráfica y controladores que lo soporten. Consulta la lista de tarjetas gráficas admitidas en el documento "readme.html" que se incluye en el juego.

steampac01 steampac01
Capturas del videojuego en desarrollo

A título personal:
Tras algún tiempo sin tocar el módulo de juegos de Blender (desde su versión 2.49) y con ganas de probar algunas de sus novedades, me adentré en lo que "a priori" parecía un proyecto sencillo: la realización de un videojuego de laberinto que siguiera el esquema de juego del Pac-man, aunque modificando los elementos visuales y dotándolo de un escenario en 3D.

Esto que parece algo relativamente fácil ha ido complicándose por momentos hasta adquirir rasgos de proyecto inalcanzable (No me quiero imaginar a la gente que se embarca en la realización de juegos tipo FPS en solitario).

La preparación del material que lo compone (personajes, texturas, animación, etc.) quizás ha sido la parte menos pesada puesto que estoy más acostumbrado a manejarme con ello. Aunque, claro, siempre surgen ciertas cuestiones: retoques de modelos para bajar la densidad de la malla, ajustar las texturas en las nuevas mallas, etc.

El apartado de programación en Blender ha sido la parte más "entretenida". A partir de unos esquemas en los que se abordaban cuestiones como el propio diseño y los comportamientos de jugador y enemigos, fui construyendo toda la lógica. Pero el reto más importante era que sólo debería emplear "logic bricks". Quería ver si un juego aparentemente sencillo podría construirse sólo mediante los bloques lógicos de Blender, sin utilizar python (o al menos, haciéndolo en su mínima expresión).

La buena noticia es que, efectivamente, es factible hacer un juego de este tipo empleando sólo "logic bricks" (de hecho, al final sólo he incluido dos líneas de código en python para mostrar y ocultar el cursor en determinados momentos). La mala noticia es que, o tienes las ideas muy claras en la organización y desarrollo de tu proyecto o éste "morirá entre terribles sufrimientos". Es vital utilizar distintos "estados" en los personajes para mantener cierta coherencia en la construcción y, sobretodo, tener un mínimo de organización. Además, como suele pasar con este tipo de trabajos, cuando arreglas una cosa aparecen otros problemas que irremediablemente te conducen a otros en una espiral casi infinita de problemas o fallos (en este punto es donde te darás cuenta si has organizado adecuadamente tus elementos, ya que intentar localizar un problema dentro de un caos de objetos y "logic bricks" puede acabar con tu salud mental).

Otra cuestión que me ha dado bastantes quebraderos de cabeza ha sido la optimización del juego. Efectivamente, en mi equipo (no muy potente, pero con una gráfica reciente) no hay mayores problemas a la hora de ejecutarlo: fácilmente alcanza los 60 FPS y se nota fluido. Ahora bien, al realizar las pruebas con otros equipos de menores prestaciones, los FPS pueden llegar a caer a la mitad. El mayor problema está en la utilización de "GLSL" como "shader" en lugar de "Singletexture" o "Multitexture" para poder visualizar materiales complejos realizados con nodos (el efecto "Toon" de los personajes). Además, tuve que crear librerias de materiales y cambiar el formato de las texturas de .jpg y .png a .dds (direct draw surface) puesto que parece que se mejora la carga de imágenes.
steampac01 steampac01
Esquemas de trabajo

Descargas:
Ahora que ya sabéis algo más sobre este proyecto, podéis descargarlo desde sourceforge.net, o desde los enlaces que aparecen más abajo, en sus versiones para Linux y Windows (pronto espero tener preparada una versión para Mac OS X).

Si estáis interesados en más detalles concretos sobre este él, no dudéis en comentar y cuando disponga de tiempo intentaré resolver dudas o postear más material relacionado con este trabajo.

Saludos.

Actualización con bugs conocidos:
  • Si el jugador entra en la zona de nacimiento de de los enemigos, caerá hacia abajo a través del mundo virtual y se tendrá que reiniciar el juego (corregido, cambios en la próxima versión).
  • Problema en el cambio de apariencia de los enemigos en el momento del parpadeo del "warning" que confunde sobre su verdadero estado. Al añadir nuevos estados en la sustitución de las mallas se soluciona el problema. (corregido, cambios en la próxima versión). 
  • Puede suceder que en ocasiones no se contabilice la colisión del "jugador" con el "punto" de modo adecuado. Si esto sucede, no se alcanza el "marcador" necesario para cambiar el nivel y se quedará atrapado en dicho nivel. Ese fallo de colisión puede pasar cuando la "física" del juego trata de interpretar varios "contactos" con apenas diferencia de tiempo y al juego no le da tiempo a contabilizarlos.

Observaciones:
  • No se trata de un "bug" sino de una característica no implementada, pero en el cambio de nivel NO se produce un cambio de apariencia del escenario, en realidad acorta el tiempo de caza de los enemigos y los hace algo más activos. Si dispongo de tiempo intentaré añadir algún escenario más en la próxima versión.

AddThis