11 de noviembre de 2015

Cómo crear un juego ganador: así se hizo Space Moves para CPC

Hacer nuestro propio juego es un sueño para muchos de nosotros; sueño que no está al alcance de la mano de cualquiera que no tenga tesón, interés y capacidad de aprendizaje. Cumplir nuestro sueño y, a la vez, ganar el concurso de programación de juegos para Amstrad CPC más importante de la actualidad con nuestra primera creación, está al alcance de todavía menos gente. Space Moves se ha alzado con el primer premio en la categoría PRO del #CPCRetroDev por méritos propios, con un soberbio homenaje a la compañía Dinamic. Hemos hablado con Toni Ramírez sobre el parto de su criatura. Ésta es la historia de Space Moves.

Space Moves comienza a fraguarse en 2014 cuando se dan dos afortunadas coincidencias. Por un lado, Toni Ramírez, autor de la criatura, redescubre la serie Amstrad CPC después de más de 20 años: "Allá por el 91 o 92 regalé a un familiar el CPC 464 que tan bueno ratos me había dado. Una visita al RetroMadrid del 2014 volvió a despertar en mí el gusanillo de tal manera que a día de hoy mi despacho está inundado de máquinas". Ya teníamos el combustible, sólo faltaba la chispa; ésta llegó en forma del anuncio de la edición del CPCRetroDev de 2014 por parte de Fran Gallego, que no pudo llegar en un mejor momento de motivación.

Pantalla de carga de Space Moves

No obstante, una cosa es querer hacer algo y otra muy distinta saber hacerlo. Toni acudió en un primer momento a los tutoriales de Mochilote en CPCMania y empezó a preparar el entorno de desarrollo necesario para poder compilar código, tarea que no fue nada sencilla. Por desgracia, ahí acabó la aventura: "Pero mi gozo en un pozo. Temas personales derivaron en una falta de tiempo absoluta para dedicar a este asunto y no me quedó más opción que abandonar antes de empezar a programar." Nadie dijo que las cosas tuvieran que salir bien a la primera.

Cinta con los juegos del #CPCRetroDev 2014

A estas alturas, todos sabemos que esta historia tiene final feliz, así que prosigamos: "Cuando se publicó la cinta con todos los juegos presentados a concurso durante 2014, a parte de hacerme con una inmediatamente, pensé qué guay sería ver mi propio juego publicado en una cinta y que hubiera valido la pena participar sólo por tener mi juego ahí, entre los demás". El terreno estaba más que abonado y sólo faltaba nuevamente una chispa para terminar de arrancar esta historia.

CPCtelera y #CPCRetroDev 2015

Llegamos a 2015 y se anuncia la tercera edición del #CPCRetroDev. Para esta ocasión, la Universidad de Alicante, con Fran Gallego al frente, tira la casa por la ventana y se anuncian 900 euros en premios. La noticia del concurso corre como la pólvora entre los aficionados a las máquinas de Sugar y, en secreto, pesos pesados de la escena se preparan para intentar hacerse con alguno de los suculentos premios. Por aquel entonces nadie podía imaginar el tremendo éxito que tendría esta edición, con 35 participantes y títulos de gran calidad. Pero me estoy adelantando...

27  de los juegos presentados al #CPCRetroDev están hechos con CPCtelera

"Estaba al corriente de que poco tiempo antes el propio Fran había publicado CPCtelera y, si bien no le había hecho mucho caso, decidí comprobar qué ofrecía y si podría ahorrarme pasar por todo el proceso que había pasado el año anterior para montarme un entorno de desarrollo. Y vaya que sí". Toni se refiere aquí a la librería CPCtelera, un conjunto de herramientas y funciones que permite desarrollar de una manera más sencilla juegos para Amstrad CPC. Toni prosigue con su historia: "En cuestión de minutos tenía en mi máquina un entorno de desarrollo completo, con herramientas para diseñar gráficos fácilmente convertibles en código, herramientas para crear música y una librería con funciones para sprites, audio y teclado (entre otras muchas cosas) que ponían a mi alcance el poder desarrollar un juego sin tener que preocuparme demasiado por el bajo nivel."


CPCtelera creando el archivo DSK de Space Moves

Ahora sí, se unieron el hambre con las ganas de comer, y con la herramienta adecuada en sus manos, Toni podía ya acometer su sueño: "CPCtelera fue un cambio bestial respecto a lo que había probado antes. Un paso de gigante. Fue el empujón definitivo para animarme a crear mi juego y participar en la CPCRetroDev de este año". Tenemos ya la ecuación perfecta: un desarrollador motivado, un objetivo alcanzable y las herramientas adecuadas. Nada puede salir mal...

Prototipo descartado de Hufimu

¡Error! Como casi todo en esta vida, las cosas se dominan con la práctica, no de la noche a la mañana. CPCtelera es un conjunto de herramientas sobresaliente pero de nada sirven sin el talento adecuado. Toni no tardaría en darse cuenta de ello: "Mi idea sin realizar del año pasado fue mi primera opción. Ésta consistía en hacer un juego musical del estilo DJ Max para PSP. No tenía ni idea de si esto era realizable en un Amstrad, pero me puse a ello." Dos semanas después llegaría el chasco: "La verdad es que ahora mismo que he probado el juego en el emulador no lo veo tan malo como lo recordaba, pero fueron las palabras de dos personas a las que se lo mostré (mi padre y mi pareja) las que me animaron a hacer otro juego. Ambas por separado coincidieron en que Hufimu era 'cutre'". Pero de todo lo malo se aprende, así que el experimento con Hufimu sirvió a la larga para lograr el objetivo ya que permitió a Toni:
  • Desoxidar su C, ya que era un lenguaje que hacía muchísimo que no tocaba.
  • Aprender la principales funcionalidades de CPCtelera para activar modos de vídeo, pintar sprites y tiles, así como hacer sonar música y controlar el teclado.
  • Crear sus primeros sprites. La pantalla de Space Moves tiene un marco similar a Hufimu y las fuentes y números son los mismos.
  • Hacer sonar música utilizando CPCtelera.
  • Desarrollar la función de animación del texto con el mensaje de Game Over.
 

SPACE MOVES

 
Después de la pequeña decepción que supusieron los comentarios negativos respecto a la primera idea, llegó el momento de replantearse las cosas. Tocaba buscar idea nueva y desarrollarla; por suerte, la temática vino prácticamente sola: "No sé por qué, pero lo primero que me vino a la cabeza fue la película Gravity. La he visto varias veces y siempre me ha encantado. No entiendo a la gente que dice que es lenta y aburrida, menuda tensión sentí yo la primera vez que la vi". Ya teníamos temática, pero había que concretar más.

Parte de la colección personal de Toni

Toni nunca ha ocultado su admiración por el sello Dinamic, uno de los grandes de la edad de oro del software español. Tocaba volver a hacerse preguntas: "¿Qué juegos fueron los que más me gustaron? ¿Qué tenían esos juegos? ¿Cuál era su esencia? Así a la cabeza me vinieron dos nombres: 'Navy Moves' y 'Phantis'. De pronto lo vi. Un juego de la saga Moves ambientado en el espacio".

Y así comenzó Space Moves
 
Con la temática definida tocaba empezar a diseñar el homenaje: "La primera fase debía ser de saltos y disparos, como los jeeps de Army Moves y la lancha de Navy Moves, la segunda de naves, como Phantis. Abrí una ventana de terminal en mi ordenado y tecleé: 'cpct_mkproject Space', y ya tenía como por arte de magia el esqueleto del que sería mi juego. Copié los pocos gráficos, básicamente el marco y las fuentes, de mi anterior juego que podría reutilizar."

Tocaba ponerse nuevamente manos a la obra con CPCtelera y Space Moves empezó a avanzar a buen ritmo. En poco más de una hora ya había implementado un scroll enmarcado en la ventana de juego y un fondo de estrellas. Era el turno del protagonista, para el cual se tomó como base el batiscafo de Navy Moves con los correspondientes retoques en Retro GamesAssets Studio, incluido en CPCtelera, para darle un aspecto de nave espacial. Llegaba el momento de la verdad y volver a pasar por la dura prueba familiar: "Un trabajo de un par de horas y un comentario de 'Solo eso ya mola más que todo el otro juego'. Palabras duras, pero motivadoras".

Unos retoques por aquí y por allá y ya tenemos nave

Ya tenemos bien encaminada la fase 2 de Space Moves pero, ¿dónde se ha visto un juego con fase 2 y ninguna fase 1? Manos a la obra, pues. Toca diseñar una fase terrestre que sirva de homenaje a otros dos juegos de Dinamic, Army y Navy Moves: "Como lo mío no es el arte, como quería que los gráficos fueran de estilo Dinamic y tras ver que el batiscafo convertido en aeronave daba más o menos bien el pego, decidí inspirarme en gráficos de juegos de Dinamic".

Antes y después de la protagonista

Inicialmente el personaje de la fase 1 llevaba casco, igual que el de los enemigos, pero de color azul. Después se decidió cambiarlo por la cabeza de una chica, principalmente porque al moverse el pelo daba un toque de más dinamismo y, además, servía como nuevo guiño a Phantis, donde el programador puso a una protagonista en su juego para que éste tuviera una buena carátula de Azpiri. Una vez listos los sprites de la protagonista toca hacer los enemigos: iguales pero de color rojo. Los ojos más avezados ya se habrán dado cuenta que los chasis de estos vehículos son iguales al de los jeeps de Army Moves.

¡Enemigo diseñado!

En un principio Toni planteó que los enemigos disparasen, incluyendo un cañón en el diseño de los vehículos enemigos, pero finalmente descartó dicha posibilidad "para acotar el nivel de dificultad. Fácilmente podrían haber disparado, pero decidí que la mayor dificultad deberían ser los saltos y matar algún enemigo de vez en cuando. Haber introducido balas a esquivar hubiera resultado un tanto complejo para el jugador". Los saltos a su vez sufrieron un proceso de calibrado hasta dar con la dificultad actual, en la que es la rueda trasera la que marca si hemos superado correctamente un salto o no.

Fase 1, homenaje a Navy y Army Moves

Tenemos sprites, tenemos saltos, colisiones y el resto de parafernalia - turno para diseñar el suelo, pintando dos tiras de tiles en función de una definición incluida en el código. Aquí está el trozo de código que correspondería al mapa de la fase 1:

const u8 g_floorTilemap[FLOOR_WIDTH * FLOOR_HEIGHT] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 1, 1, 3, 0, 0, 0, 5, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 5, 1, 1, 1, 1,1, 1, 9, 3, 0, 0, 0, 5, 1, 3, 0, 0, 0, 5, 1, 3, 0, 0, 0, 0, 5, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 9, 1, 3, 0, 0, 0, 0, 0, 0, 5, 1, 1, 1, 1, 1, 9, 1, 1, 1,1, 1, 3, 0, 0, 0, 5, 1, 1, 3, 0, 0, 0, 5, 3, 0, 0, 0, 0, 5, 1, 3, 0, 0, 0, 0, 0, 0, 5, 1, 3, 0, 0, 0, 5, 3, 0, 0, 0, 5, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1,1, 1, 9, 3, 0, 0, 0, 5, 1, 3, 0, 0, 0, 5, 1, 1, 1, 1, 3, 0, 0, 0, 0, 5, 1, 1, 1, 1, 1, 9, 3, 0, 0, 0, 5, 1, 1, 1, 3, 0, 0, 0, 0, 5, 1, 1, 1, 1, 1, 9,1, 1, 3, 0, 0, 0, 5, 1, 1, 3, 0, 0, 0, 5, 3, 0, 0, 0, 0, 5, 1, 3, 0, 0, 0, 0, 0, 0, 5, 1, 3, 0, 0, 0, 5, 3, 0, 0, 0, 5, 1, 1, 1, 1, 1, 1, 1, 9, 1, 1,1, 1, 9, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 3, 0, 0, 0, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 1, 3, 0, 0, 0, 0, 5, 1, 1, 1, 1,1, 1, 1, 3, 0, 0, 0, 5, 1, 3, 0, 0, 0, 5, 1, 3, 0, 0, 0, 0, 5, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 5, 1, 1, 1, 1, 1, 1, 9, 1, 1,1, 1, 9, 3, 0, 0, 5, 1, 1, 3, 0, 0, 0, 5, 3, 0, 0, 0, 0, 5, 1, 3, 0, 0, 0, 0, 0, 0, 5, 1, 3, 0, 0, 0, 5, 3, 0, 0, 0, 5, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1,1, 1, 9, 3, 0, 0, 0, 5, 1, 3, 0, 0, 0, 5, 1, 1, 1, 1, 3, 0, 0, 0, 0, 5, 1, 1, 1, 1, 1, 9, 3, 0, 0, 0, 5, 1, 1, 1, 3, 0, 0, 0, 0, 5, 1, 1, 1, 1, 1, 1,1, 1, 3, 0, 0, 0, 5, 1, 1, 3, 0, 0, 0, 5, 1, 1, 3, 0, 0, 0, 5, 1, 1, 1, 3, 0, 0, 0, 5, 1, 1, 3, 0, 0, 0, 0, 5, 1, 3, 0, 0, 0, 0, 5, 1, 3, 0, 0, 0, 0,5, 1, 1, 3, 0, 0, 5, 1, 1, 3, 0, 0, 0, 5, 3, 0, 0, 0, 0, 5, 1, 3, 0, 0, 0, 0, 0, 0, 5, 1, 3, 0, 0, 0, 5, 3, 0, 0, 0, 5, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1,1, 1, 9, 3, 0, 0, 0, 5, 1, 3, 0, 0, 0, 5, 1, 1, 1, 1, 3, 0, 0, 0, 0, 5, 1, 1, 1, 1, 1, 9, 3, 0, 0, 0, 5, 1, 1, 1, 3, 0, 0, 0, 0, 5, 1, 1, 1, 1, 1, 1,1, 9, 3, 0, 0, 0, 5, 1, 1, 3, 0, 0, 0, 5, 3, 0, 0, 0, 0, 5, 1, 3, 0, 0, 0, 0, 0, 0, 5, 1, 3, 0, 0, 0, 5, 1, 3, 0, 0, 0, 5, 1, 1, 1, 1, 1, 1, 9, 1, 1,9, 1, 1, 1, 1, 9, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1, 3, 0, 0, 0, 5, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 5, 1, 1, 1, 1,1, 9, 1, 3, 0, 0, 0, 5, 1, 3, 0, 0, 0, 5, 1, 3, 0, 0, 0, 0, 5, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 5, 1, 1, 1, 1, 1, 1, 1, 9, 1,1, 1, 1, 3, 0, 0, 5, 1, 1, 3, 0, 0, 0, 5, 3, 0, 0, 0, 0, 5, 1, 3, 0, 0, 0, 0, 0, 0, 5, 1, 3, 0, 0, 0, 5, 3, 0, 0, 0, 5, 1, 1, 1, 1, 1, 1, 1, 1, 9, 1,1, 9, 1, 3, 0, 0, 0, 5, 1, 3, 0, 0, 0, 5, 1, 1, 1, 1, 3, 0, 0, 0, 0, 5, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 5, 1, 1, 1, 3, 0, 0, 0, 0, 5, 1, 1, 1, 1, 1, 1,1, 9, 3, 0, 0, 0, 5, 1, 1, 3, 0, 0, 0, 5, 1, 1, 3, 0, 0, 0, 5, 1, 1, 1, 3, 0, 0, 0, 5, 1, 1, 3, 0, 0, 0, 0, 5, 1, 3, 0, 0, 0, 0, 5, 1, 1, 1, 1, 1, 9,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

Un 1 indica que hay suelo normal, un 0 indica agujero. Los 3 y los 5 son suelo, pero con el sprite de inicio y final, que es en forma de ángulo. Por último los 9 indican que hay que pintar suelo, pero también que ha de aparecer un enemigo en esa posición.

Tras muchas partidas de prueba hasta alcanzar la dificultad deseada, toca turno para remates que le dan más sensación de redondez y acabado al juego: "Luego fue añadir los sprites de fondo y las nubes con scroll para dar más dinamismo y detalle al juego. Por último la estrella roja, que aparece también en la pantalla de carga y quienes hayan leído las instrucciones del juego sabrán que representan la estación espacial a la que debemos llegar al final de la fase 2."

Transiciones entre fases

Con una fase terminada y otra encaminada, surgió una nueva necesidad: crear el elemento de enlace que permita pasar de un nivel a otro y mantenga cierta coherencia con el juego. ¿Qué mejor manera que utilizar la nave de la fase dos como elemento de unión? Dicho y hecho, Toni decidió colocar la nave de la fase dos encima de una plataforma de lanzamiento, aunque esta decisión derivó en un nuevo problema: "El problema fue que al hacerlo resultó que proporcionalmente el tamaño de la nave era ridículo comparado con el sprite de la fase 1, por lo que tuve que hacer un sprite el doble de alto y ancho para mostrar la nave al final de la fase 1. Todo un derroche de espacio en memoria, pero me gusta el aspecto pixelado que quedó y la forma en que enlaza ambas fases".

 
Escena de transición de Fase 1 a 2

Una vez solucionado el enlace entre las dos fases surgió una nueva idea: ¿por qué no utilizar el mismo recurso para enlazar con el final del juego? Dicho y hecho, en la fase 2 la nave llegaría hasta la estación espacial y entraría en ella. Tocaba ponerse manos a la obra y realizar un primer boceto, realizado con el dedo en la pantalla del móvil de Toni.

Boceto de estación espacial

Faltaba un pequeño remate final para seguir con los guiños a Dinamic, y éste llegó con un código para jugar a una hipotética segunda carga del juego, al más puro estilo "FX Doble Carga" que tan buenos ratos nos dio. De paso, Toni mataba dos pájaros de un tiro, introduciendo un guiño a la película "Regreso al futuro", lo que daba algún punto extra en el concurso #CPCRetroDev.

Vuelta a la fase 2


Con la fase 1, la transicion, y el final de la fase 2, quedaba rematar la segunda fase para tener el juego prácticamente acabado. Nuevamente serían el Retro Game Assets Studio junto a la inspiración de Dinamic los que permitirían crear los sprites de los enemigos de la carga 2. Para la IA de los enemigos Toni decidió apostar por un simple patrón de coordenadas debido a que Space Moves suponía su primer reto al respecto.

Fase 2, homenaje a Phantis

Toni profundiza en el asunto: "Al final se me ocurrió utilizar un listado de patrones, donde cada patrón era una serie de coordenadas que la nave debería seguir en orden. Yo ponía una nave en una posición de la pantalla y le asignaba un patrón de movimiento, entonces la nave seguiría este conjunto de coordenadas uno tras otro hasta llegar al último o bien ser eliminado por el láser del jugador. Esta solución finalmente dio buen resultado. Decidí asignar un tipo de nave distinto a cada patrón."
 

Música y FX

 
A dos semanas de cumplirse el plazo de entrega de los juegos, nos encontramos con Space Moves prácticamente terminado pero sin música ni efectos de sonido. En un primer momento se entrega el juego así, tal cual, debido a la imposibilidad de Toni de componer nada que sonara medianamente decente, pero a todas luces Space Moves merecía una banda sonora a la altura del juego. Es aquí donde entra en juego un viejo conocido de la escena Amstrad en nuestro país: McKlain.

Dejemos que sea el propio Toni el que nos cuente cómo surgió la colaboración: "Sabía de alguien que podría componer música para mi juego, pero pensaba que quizá no podría, no querría o bien consideraría que mi juego no era digno de su música. Estoy hablando de McKlain, conocido en la scene por sus composiciones de grandísima calidad. Al final decidí que no tenía nada que perder por preguntar y decidí contactar con él y hacerle llegar el juego para que viera de qué estábamos hablando".

Tema de Space Moves, cargado en Arkos Tracker

Toni continúa con alabanzas a su nuevo compañero de aventura: "No tengo más que palabras de agradecimiento hacia McKlain, pues no sólo se animó a ayudarme, sino que compuso un par de temas y los FX que el juego luce ahora mismo y que le dieron un empujón de calidad que, sin lugar a duda, supusieron la diferencia para alcanzar la primera posición en la CPCRetroDev". Por suerte, la herramienta favorita de McKlain para componer es el ArkosTracker, el mismo tracker que CPCtelera soporta plenamente al estar perfectamente integrado. Integrar la música en el juego utilizando CPCTelera fue algo trivial.

El propio McKlain rememora como surgió esta colaboración: "Toni se puso en contacto conmigo diez días antes de la fecha de entrega para ver si podía ponerle música a su juego. Me mandó un enlace a una demo y me gustó lo que vi. Como tengo la fea costumbre de no decir que no, un par de horas después de haber probado la demo le mandé una versión preliminar del tema principal. Seguimos intercambiando mensajes en los días posteriores y al final, con cambios en la CPCtelera incluidos, metimos el tema del menú, el tema principal y los FX en unos 1.800 bytes, que era lo que quedaba libre en la memoria principal. Y por supuesto que la música es un homenaje descarado a las de Navy Moves y Army Moves, pero en versión épico-espacial."

Por suerte Fran Gallego introdujo la gestión de interrupciones en la última versión de CPCtelera, que apareció esa misma semana y que permitió sincronizar la llamada a la función de reproducción de sonido con interrupciones del sistema. De nuevo CPCtelera demostró que es una librería que, a pesar de su juventud, abarca prácticamente la totalidad de lo necesario para desarrollar un buen juego para Amstrad CPC. La prueba, sin lugar a dudas es Space Moves. Luego se envió la versión definitiva que participó en el #CPCRetroDev; el resto ya es historia.

Muchas gracias a Toni Ramírez y a McKlain por su colaboración en este artículo.


Sigue a Toni Ramírez en Twitter
Descárgate Space Moves y el resto de juegos participantes del #CPCRetroDev
Consulta la lista de ganadores del #CPCRetroDev
Más información sobre los trabajos de McKlain en su web

3 comentarios:

  1. Menuda historia de superación. Es increíble q su primer juego en la cpctelera y casi uno de los primeros para cpc tenga esta calidad. Los entresijos q se cuentan aquí le dan ganas a uno de intentarlo, aunq de bien seguro q no es tan fácil como parece. Felicidades por el artículo a quien proceda y a Toni, por el juego, q ya me he pasado y del q espero una segunda parte.

    ResponderEliminar