Segundo videojuego publicado: Ninja room. Making of.

Hay una norma no escrita que dice que "tus 10 primeros juegos serán malos", y creo que es cierto, es certísimo. Lo he acogido como mi nuevo mantra (tal vez para sobrellevar mejor lo malo que son mis juegos). Así que será mejor quitármelos de encima cuanto antes, y no hay nada mejor que aprovechar una ludumdare para ello.

Así que participé en la Ludumdare 37 (9-11 de Dic) para terminar un videojuego en un fin de semana (como viene siendo de costumbre).

El resultado fue Ninja Room, podeis jugarlo aquí. Solo disponible para Windows.

Esta vez trabaje junto con @chaos_migu. Yo me encargué de la programación y él de los gráficos y sonido (además de hacer la "intro").

En las jams es tiempo para probar prototipos nuevos o arriesgados, así que quise imitar la técnica pseudo3D (es 2D imitando 3D) que usa Moppin en su último juego NIUM:

Y me salió algo así:

Como se consigue este efecto.

Se trata de representar el modelo por capas. Como si fueras cortándolo en rebanadas, desde la parte mas baja, a la más alta, y todo visto desde la parte arriba. Como resultado final el sprite se ve así:

Cargado en el editor de Game Maker:

En un editor de dibujo:

Pero claro, dibujar capa a capa, es un tanto engorroso y complejo, lo suyo es trabajar con algo como MagicaVoxel:

Y con esta otra herramienta pasarlo a formato de ".vox" a ".png". Todo apto para cargar directamente como sprite "cortado en rebanadas": Descargar aquí.
Abre la consola de windows y ejecuta "vox2png.exe nombredefichero.vox nombreficherosalida.png"

*Nota: Al haber subido el .exe directamente puede saltar el aviso del antivirus, pero os lo podéis descargar tranquilamente, pasadlo por virustotal.com si lo deseáis.

Código GML

Esto iría en el objeto donde queremos representar el efecto 3D y tenemos asignado dicho sprite previamente:

Create Event:

image_speed = 0;

Step Event:

// Calculamos profundidad var newy = 0+(lengthdir_y(x, view_angle) + lengthdir_y(y, view_angle - 90));
depth = -newy;

Draw Event:

for (var i=0; i<image_number; i++) { draw_sprite_ext(sprite_index, i, x+lengthdir_x(i*1, (view_angle[0]*-1)+90), y+lengthdir_y(i*1, (view_angle[0]*-1)+90), image_xscale, image_yscale, image_angle, c_white, image_alpha); } `

Para rotar el muñeco usamos su propiedad image_angle, y para rotar la cámara usamos la variable view_angle.

Conclusión

Tengo que decir que estoy muy muy satisfecho con el resultado, que trabajar con @Chaos_migu estuvo muy bien, estuvimos trabajando codo con codo las 72 horas y no lo oí quejarse ni una sola vez, en cambio yo sí, cuando iba llegando la hora de entrega y veía que no llegábamos xD Pero bueno, todo salió bastante bien según lo planeado. Y he aprendido mucho de este juego/experiencia. Seguiré informando!

Algunas imagenes del proceso

View post on imgur.com

josemwarrior

Read more posts by this author.

Subscribe to @josemwarrior

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!