9.28.2009

"Making of" de cubyshot

Este año he presentado un pequeño juego a artfutura, en realidad hemos presentado, ya que wonder es el creador de la música. Se trata de un juego mata-mata, hecho exclusivamente con cubos, procedural y en <96kb.

Antes de nada el video y los links, después la miga.

cubyshot from javisantana on Vimeo.



codigo fuente: cubyshot en github
exe: cubyshot (ojo, si tienes antivirus es posible que te de un toque por la auto-descompresión del ejecutable). Puedes compilarlo con el visual c++ express.

El juego lo empecé allá por enero y en unas tardes saqué un pequeño prototipo (video). Partí del framework de 4kb de iq (muy bueno aunque no sea para una 4kb) y sobre él empecé a trabajar basándome sobretodo en los juegos de kenta cho, aunque luego lo deje hasta retomarlo hace un par de semanas más o menos.

El código es bastante simple (a pesar del sprint de los últimos dos días antes de art futura está bastante limpio), está en C, aunque está "orientado a objectos" conlos típicos punteros a funciones. Hay partes que me gustaría destacar:

- Todo está sobre el objeto actor_t, cualquier cosa que se mueva "implementa" ese interfaz, de forma que con un pool de objetos y unas pocas funciones tienes todo moviendose. La separación entre controlador y vista es, creo yo, bastante clara :).

- La mayoría de las animaciones son fijas, esto es, son una función matemática. normalmente basada en sin/cos. Por ejemplo el movimiento de los enemigos finales es:

a->pos[0] = 10.0f*perlin2d(a->time*0.001f, a->time*0.001f)*sinf(a->time*0.4f);
a->pos[1] = 14.0f + 3.0f*sinf(a->time*0.4f);

Esto da bastante libertad, porque siempre hay una fórmula matemática que más o menos se ajusta a lo que quieres. El mago de esto es iñigo quilez, te aconsejo que leas el making of de elevated.

- Para la mayoría de elementos en la pantalla no hay posiciones prefijadas, símplemente se situan en posiciones aleatorias, lo único que varía es el seed, dicho de otra forma, es el ADN de cada objeto.

- Casi ningún movimiento es directo, casi todos los movimientos de objectos están filtrado paso bajo, por ejemplo, el cambio del color del escenario.

- He usado fixed timestep, de esa forma simplifica mucho la lógica, no tienes que preocuparte del dt.

- Los efectos de sonido son sintetizados (puedes leer un tutorial que escribí hace años de como está hecho) y la música (XM) se reproduce con minifmod. La música se lleva el 80% del peso del exe :).

- Los enemigos finales están calculados proceduralmente con un efecto mirror. De hecho si arrancas el juego y no comienzas, cada 20 segundos más o menos se genera una nave nueva. Entre una nave y otra solo varía la semilla de números aleatorios. Para generarlas me he basado en invader fractal.

- Curiosidades. El código de la ciudad procedural (video) está en el código pero no me ha dado tiempo a usarlo... y parte de las ñapas de inicialización de direct sound están tomadas del código fuente del quake1 :)

Partes de las que no estoy contento son la generación de los enemigos, apenas hay variabilidad, la dificultad, el poco uso que le di a la paleta (fundamental en juegos con gráficos de coder), no haber preparado un objeto timer, etc, etc.

Todo se andará.

5 comentarios:

r3D dijo...

Gracias por la detallada explicación :). ¡Y suerte!

Jorge Romero González dijo...

Ay dios, la mitad me suena a chino XD

Lo que si que he pillado me ha parecido super interesante. Voy a tener que ponerme a investigar esos enlaces.

fdfblog dijo...

Genial, Javi... tú si que sabes.

Enhorabuena por la idea y por el trabajo; ojalá tuviera la mitad de iniciativa y ganas de las que tú demuestras.

roger dijo...

Así que menos de 100k? Suena interesante, tendré que revisar el código a ver qué aprendo.

Mars Attacks dijo...

Deja de quejarte y acábalo con lo que dices que falta. Esa ciudad como fondo... mmm... :D