jueves, 21 de julio de 2011

¡Ya parió la "burra"! - Como programar un videojuego y no morir en el intento

(Leer el siguiente párrafo con voz de trailer de peli mala de ciencia ficción de los años 50) "En anteriores episodios, dejamos a nuestro héroe (ejem...) con una primera beta de su juego y dándo la brasa en distintos foros para darse a conocer... pero ¿qué peligros le aguardarán a partir de ahora? ¿Superará el duro escrutinio de los temibles beta-testers Urindil, Laser y Nai? ¿Terminará felizmente su misión o acabará deshauciado en un manicomio de Miskatonik?" (Ea, ya podeis volver a poner vuestra voz habitual :P)





¿Y ahora, qué?

Llegar a esta primera beta no fue un camino fácil precisamente. Aunque el concepto del juego no varió esencialmente desde las primeras etapas del desarrollo, sí que es cierto que mis muchas limitaciones a la hora de programar hicieron que el juego sea mucho más sencillo de lo que me hubiera gustado... y más teniendo en cuenta mi anterior "trayectoria" como "programador" (os recuerdo que dos de mis primeros "juegos" optan al premio al peor juego del año en Spectrum :P).

En la primera reunión (informal) con mis compañeros, se fueron apuntando una serie de ideas interesantes, que algunas pudieron ser ejecutadas y otras no. El primer palo fue cuando me propusieron que tanto el protagonista como los enemigos pudieran pasar por encima de los charcos: Aahku se movería más lento, mientras que los enemigos no perderían velocidad.... eeeeem... mola... pero va a ser que no. Como alguno de vosotros sabreis, queridos lectores, para pintar los "sprites" (termino que no existe en el BASIC del Spectrum), debemos hacer trabajo doble: pintar el personaje y, una vez desplazado, pintar el fondo que hubiera borrado este gráfico; esto supone que el programa sepa en todo momento qué es lo que estamos borrando para volverlo a reemplazar, lo que en un "sprite" de 2x2 caracteres suponen 14 combinaciones distintas de hierba-agua (para mi juego, se entiende). Este hecho, que podemos ver como se ejecuta sin problemas en otros juegos hechos en BASIC como "Insert Coins" de Octocom o "Relatos de Ahion" de Beyker Soft (entre otros...), por mis limitados conocimientos, aquí no lo vemos. Con lo cual, todo el fondo que no sea hierba, o no deja pasar o simplemente mata :S






Otro asunto fue el de los personajes, tanto su diseño como su movimiento. En principio, los diferentes enemigos iban a tener patrones distintos de movimiento (tanto en horizontal, como en vertical) y tan solo uno, "el tío la porra", iba a ir directamente a por tí... no sé en qué momento ni a quién se le ocurrió que casi todos los enemigos tuvieran el patrón de seguimiento (rutina, que dicho sea de paso, fue el germen de este juego). Al que sí se le ocurrió la idea del movimiento del gusano fue al amigo Nai... que joío, no veas el "porculo" que da el puñetero bicho XDDD. Respecto al diseño, tras la primera beta, mi colega Urindil no "terminaba de ver" el diseño de personajes; si es cierto que en la primera beta se ven muy "abocetados"; así que, tras un buen lavado de cara, creo que el resultado final está un poco más definido y hace un mejor uso del color, intentando minimizar las limitaciones tinta-papel que tiene el Spectrum... es curioso, porque me volvió a decir lo mismo de la versión de Amstrad, y aquí no le quito la razón por las mejores capacidades cromáticas que tiene el ordenador de Alan Sugar, pero el Locomotive Basic tiene la misma limitación tinta-papel y si queremos sprites multicolor tenemos que usar código máquina.

El último apunte me lo hizo mi gran amigo Laser: tiempo límite... un concepto que, a decir verdad, no lo tuve mucho en cuenta en un principio, ya que pensaba que el juego iba a tener un buen nivel de dificultad... pero un poquito más no está de más, ¿no, Jesús? ;) Con todo esto, y mientras buscaba un poquillo más de tiempo libre para ir implementando estas mejoras, la cosa fue avanzando... hasta que hice una cosa que complicó enooooormemente el desarrollo (aunque, visto ahora, me alegro un montón).

Música, maestro!!!

O como la expresión "meterse en camisa de once varas" adquiere aquí una nueva dimensión. Tras presentar mi primera beta, me dió por ver y probar otros juegos que habían sido desarrollados en BASIC (fuesen compilados o no)... ¿pa qué, Dios mio, pa qué? Juegos de Mojon Twins, Beyker Soft, Octocom... dos lagrimones se me caían cada vez que veía que mi juego no iba a hacerles ni sombra a éstos. La puntilla me la puso "Insert Coins II" (el JUEGO hecho en Basic para Spectrum): diferentes fases, dos personajes a elegir y ¡música durante el juego!... vamos, que se me cayeron los palos del sombrajo :S. Tenía que darle un plus al juego, algo que lo hiciera un poquillo mas vistoso. La música fue la elección.





Estos dos grandes juegos tienen la culpa...

De entre las distintas alternativas existentes, fuí a quedarme en primera instancia con la peor de todas: Arkos Tracker, un software de composición musical para el chip AY-3-8912 de sonido que comparten Spectrum, Amstrad y MSX, desarrollado para Windows... un tracker bastente bueno y sencillo de utilizar que esconde un caramelo envenenado en su interior: su player (o reproductor)... un auténtico trozo de mierda escrito en ensamblador que te complica enormemente el poder hacer algo útil con la canción que tan alégremente has compuesto... porque sí, alégremente compuse la melodía que escuchais en el menú: en solo una tarde y mientras hacía pruebas para familiarizarme con el programa... pero claro, la melodía no es para escucharla en el PC, es para un juego de Spectrum... y aquí es donde empiezan los problemas. Para no aburrir mucho al personal con cuestiones muy técnicas, diré que la versión del player para Spectrum tan solo permitía cargar la canción en una posición de memoria inamovible y la reproducía en un loop interminable e ininterrumpible que ocupaba todos los recursos de la máquina. Sabe Dios que me harté de mirar tutoriales (entre ellos, uno buenísimo en la página de Sromero) para programar en ensamblador sin tener ni p... idea, a ver si encontraba una solución... nada, como dar palos de ciego... lo único que conseguí fue que tras la pulsación de una tecla se interrumpiera la canción para, acto seguido, quedarse colgado el ordenador.

Con la desilusión de no poder meterle una triste melodía a mi Aahku (que mal suena eso XDDD), ví, desanimado, diversas opciones que me resultaron harto complicadas por el uso de conocimientos en ensamblador que conllevaban... hasta que dí con Sound Tracker y su compilador de canciones, que te transforman tu composición a un archivo en código máquina que incluye la canción y el player juntos y que, con unos sencillos randomizes, pauses y gotos en el listado BASIC te permiten reproducir tu canción, digamos, "por interrupciones"... Un rayito de esperanza volvió a "iluminarme" (por favor, que expresiones XDDD), aunque también tuve a habituarme a la nueva "herramienta" (buena, pero un poco limitada en cuanto a "instrumentos" y "samples"). El cambio, como no, trajo variaciones en la música. En el foro de FaseBonus.net, en la entrada de mi presentación, podeis encontrar un archivo mp3 con la música tal como se compuso originalmente con el Arkos... misma melodía, distintos resultados...

La avaricia rompe el saco

Mientras luchaba con el tema musical e iba avanzando con el juego, mis miras, de pronto, se desviaron hacia otras plataformas... mmm, ¿qué tal quedaría el juego en Amstrad? Cuando me dí cuenta de donde me metía, ya me estaba leyendo el curso de BASIC de Nacho Cabanes... pero como todo, lo complicado es programar las rutinas de colisión. En Amstrad, la instrucción Copychr$ es la que está más orientada para colisión; sin embargo, en los modelos 464 dicha expresión no existe, con lo cual le tuve que buscar un "sustituto" en código máquina, a base de Datas, que hace su función como el p...o culo: en el archivo que encontrareis en FaseBonus está incluida la versión alpha del juego en CPC... pa llorar... Eso sí, algún día la termino, por mis coj... ¿alguna ayudita?

Fugazmente pasó también por mi cabeza ideas de una versión MSX, ya que sabía que su BASIC tenía instrucciones para el manejo de sprites. Tras mucho buscar documentación en la red, di con un par de manuales en portugués y un monton de revistas que incluían tutoriales y listados de programas (¿MSX Club puede ser?), pero se me planteaban más preguntas que respuestas. La instrucción que maneja la colisión de sprites en MSX es On Sprite Gosub... pero, ¿cómo distinguir entre los sprites de, por ejemplo, los enemigos y la llave? ¿Qué hago con los charcos? ¿Los trato como sprites o como fondo? ¿Si son fondo, cómo hacer que los detecte? Preguntas, preguntas... La idea de la versión de C64 duró -2 segundos. Tras ver un manual de su BASIC y comprobar que toooodo se hace a base de Pokes, dije "paso".

Things to come

Como el disco de Triana... "Y llegó el día"... El juego tuvo sus gráficos remodelados, sus bugs corregidos (no todos, ya os he dicho que mis conocimientos son limitados), su música en el menú (lástima que no durante el juego) y su promoción por todo lo alto: FaseBonus, El Mundo del Spectrum y su entrada en World of Spectrum... tengo que agradecer enormemente el interés que ha puesto Tbrazil (webmaster de El Mundo del Spectrum) en el desarrollo y el convencerme en hacer una promo algo más "ruidosa" que una simple entrada en un foro... Gracias, Javi ;)

En cuanto a qué futuro le espera a este pequeño proyecto que es Kabuto Factory... pues, de momento, unas vacaciones de puta madre que voy a tirar XDDD ... y un par de sorpresillas que llegarán muy pronto... una de ellas, proveniente de nuestro amigo Nai ;) ... pero eso, es otra historia.

Fine.

P.D.: Gracias a todos aquellos que hayais tenido la paciencia de leeros el tocho entero sin cagarse en todas mis muelas XDDD

1 comentario:

  1. Ya te lo he dicho pero te lo vuelvo a decir, me alegro un montón y me tengo que quitar el sombrero por el pedazo de frikazo que eres programando para una maquina muerta y enterrada y que aún así quieras seguir avanzando, chapó tío.

    Sigo esperando la versión Amstrad, que el spectrum por mucho ke digais siempre pa mi ha sido peor :D

    ResponderEliminar