78
http://calentamientoglobalacelerado.net/zxopensource RAFAEL LOMEÑA VARO MaRaF SOFT ©© MMXVIII Guía Rápida de Desarrollo basada en la versión 0.37b del juego tipo El Chatarrero Galáctico 1 de 78 GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA SINCLAIR ZX-SPECTRUM Edición 1.0

GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

RAFAEL LOMEÑA VARO MaRaF SOFT ©© MMXVIII

Guía Rápida de Desarrollo basada en la versión0.37b del juego tipo El Chatarrero Galáctico

1 de 78

GUÍA RÁPIDA #01

DESARROLLO DE VIDEOJUEGOS PARA SINCLAIR ZX-SPECTRUM

Edición 1.0

Page 2: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

# 00 // Prólogo del autor# 01 // Génesis del proyecto# 02 // Requisitos de conocimientos previos# 03 // Objetivos de la Guía Rápida# 04 // Cómo enfocar nuestro proyecto# 05 // Vías Técnicas de desarrollo# 06 // Hardware y Software necesario# 07 // Otras herramientas de apoyo# 08 // Primer vistazo superficial al código# 09 // Mapa estructural del código# 10 // Análisis profundo del código# 11 // Técnicas básicas de optimización # 12 // Rutinas útiles para videojuegos# 13 // Taller de descarga de recursos# 14 // Documentos Anexos

2 de 78

# 00Indice temático

# 00Indice temático

Page 3: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

Hace muuuuuucho tiempo, algunos jóvenesadolescentes tuvieron un sueño que no pudieronhacer realidad, hoy, treinta y cinco años después, talvez ese sueño pueda resucitar gracias a la retroescenay a humildes proyectos como ZXOpenSource.

A todos aquellos jóvenes entusiastas que un díapersiguieron con pasión la felicidad y la encontraronfrente a una máquina llamada Spectrum, estádedicada esta Guía Rápida de Desarrollo, a todos ellosy también, a esos jóvenes intrépidos que quieranaventurarse a vivir hoy en primera persona lo queun día fue el origen de la mayor industria de lahistoria.

Por ello, y por el considerable esfuerzo que ha supuestopara mí escribir estar humilde obra, solo espero quepuedas encontrar en ella una puerta experimentalde entrada al mundo del desarrollo homebrew paraplataformas de 8 bits.

3 de 78

# 00Prólogo del autor

# 00Prólogo del autor

Page 4: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

La extravagante idea de crear una guía rápida para eldesarrollo de videojuegosdestinada a la plataforma de 8bits ZX-Spectrum surgió,como otras tantascasualidades de la vida, a raízde un sencillo programa cuyocódigo escribí sobre mireluciente Spectrum +3 unaamena tarde de domingo y dela que también surgió elwebzine FINDE's RETRO1.

Casualidades de la vida que a veces, nos sorprenden. Esel azar en su estado puro, fruto y origen de latranscendencia vital que nos rodea. Mi Spectrum +3lo recuperé de un centro de tratamiento de residuosantes de que fuera destruido y mi fantástica TV de14' la recogí milagrosamente junto a un contendorde basura cuando pasé de milagro por una calle demi ciudad. Ahroa que lo pienso, tal vez, toda esta

1 FINDES RETRO es un magazine digital y disponible online en formato web 1.0 sobre contenido diverso relacionadocon la retrocomputación y publicado en la url https://calentamientoglobalacelerado.net/findesretro

4 de 78

# 01Génesis del Proyecto

# 01Génesis del Proyecto

Page 5: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

chatarra electrónica tan valiosa para mi, tuvo algunainfluencia subliminar con el nombre del juego al queestaba a punto de dedicarle los próximos meses demi vida.

Lo cierto, es que andaba yo trasteando estos viejoscacharros con esa pasión característica propia decualquier retro-nostálgico que se precie cuando, almover la palanca de un joystick Sinclair conectado ami flamante +3 (yo nunca tuve uno para jugar conmi gomas al Túneles Marcianos y por eso memataban), me resultó curioso ver como semostraban secuencias de números sobre la pantalladependiendo de la dirección en la que movía lamisma ... ¡¡Uaaaaaauu!! En ese preciso instantecomenzó a volar mi imaginación exactamente igualque cuando, siendo casi un niño, me sentaba aprogramar frente a mi gomas y el televisor de tubode 14', y cuando me quise dar cuenta estaba picandocódigo como un poseso disfrutando de mi flamante+3... ¡Y volví a sentir las mariposas en el estómago!!

En un pequeño espacio de tiempo, aunque esta es laprimera noción que sueleperderse cuando laprogramación de unSpectrum te absorbe, ya teníael esqueleto de un graciosojueguecillo de 1 Kbyte quehacía uso de la palanca de

5 de 78

Page 6: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

juegos y al que decidí bautizar con el rimbombantenombre de EL CHATARRERO GALÁCTICO.

Ahora, será el EL CHATARRERO GALÁCTICO el quenos llevará a adquirir el conocimiento práctico que,junto a dosis necesarias de imaginación de la que talvez vayas sobrado, te permitirán adentrarte en elapasionante campo que ya se ha dado en llamar laescena retro o homebrew2.

2 Homebrew es el término inglés internacionalizado y utilizado para referirse a la escena retro o retroescena(retroscene) que enmarca el desarrollo de software para antiguas plataformas informáticas comercializadas durantelas décadas de 1980, principalmente de 8 y 16 bits.

6 de 78

Page 7: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

Probablemente, para iniciar el desarrollo de un juegorelativamente serio para el microordenador ZX-Spectrum habrás comenzado preguntándote: ¿Puedorealmente programar un juego de calidadaceptable sin ser un mago del código máquina? Larespuesta a esta pregunta es SÍ, en mayúsculas, perocon matices.

El lenguaje de programación BASIC de Sinclair, al quesimplemente llamaremos ZXBASIC en lo sucesivo,adolece de ciertas limitaciones infranqueables quedeberás sortear con algo de ingenio y, otras muchasveces, con el uso de compiladores de código comoHIBASIC ó MCODER. Este último en concreto es elque usaremos en nuestra guía rápida, pero tambiénexisten otras alternativas interesantes como son loscompiladores cruzados para plataformas Windows óLiNUX, de forma que, si un día decides desarrollarjuegos para ZX-Spectrum utilizando otro lenguajede programación distinto al ZXBASIC, puedesexplorar nuevos y potentes lenguajes compiladoscomo el BASIC BORIEL o el uso de la librería Z88

7 de 78

# 02Requisitos de Conocimientos Previos

# 02Requisitos de Conocimientos Previos

Page 8: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

para compiladores C que genera código máquinacompatible con el procesador Z80A3 del Spectrum(muy recomendable el Curso Z88DK de RADASTANen speccy.org), o incluso, por qué no, valorar elaprendizaje del propio ensamblador para Z80 queademás te servirá para conocer a fondo otrasplataformas de 8 bits y quién sabe si para aprobaralguna que otra asignatura si eres estudiante deinformática. La programación en código máquinapodrás hacerla igualmente sobre la máquinaoriginal (con el uso de un ensamblador nativo) obien mediante el uso de compiladores cruzadossobre Windows o LiNuX que generan códigomáquina para Z80, como PASMO.

En nuestro caso, el lenguaje que vamos a utilizar en todomomento será el BASIC nativo del Sinclair ZX-Spectrum, al que de ahora en adelantedenominaremos ZXBASIC, y aunque sería absurdoincluir toda la documentación relativa a este lenguajey sus comandos dado que ese conocimiento ya seencuentra recogido de forma magistral en numerosaspublicaciones técnicas y revistas especializadas de laépoca, sí te recomiendo tener a mano el manualoficial del usuario de cualquier ordenador SINCLAIRZX-Spectrum, en donde encontrarás todos loscomandos disponibles de este lenguaje y la forma deutilizarlos. En este sentido, quiero dejar constancia

3 Z80A es la variedad del microprocesador de 8 bits Z80 con una frecuencia mayor que el Z80 original (3.58 Mhz en elcaso del Spectrum frente a 2.5 Mhz de las primeras versiones) lanzado por la compañía Zilog en julio de 1976 y quemontaban los microordenadores ZX-Spectrum. Existen versiones que alcanzan los 20 Mhz.

8 de 78

Page 9: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

de que la detallada lectura del manual orignal queacompañaba a los microordenadores ZX-Spectrumsuele ser una buena base para adentrarse en eldesarrollo. En la red existen numerosos repositoriosen los que se hallan preservados todos estos libros ydocumentos de forma digital. Puedes encontrar unacompleta lista de estos repositorios en la direcciónweb del proyecto GUTENBERG 3.04 o descargardirectamente el manual del ZX-Spectrum desde elTaller de Descarga de Recursos que encontrarás al finalde esta guía.

Por otro lado, aunque puede que no sea estrictamentenecesario que domines ningún lenguaje deprogramación antes de entrar en materia,seguramente será más fácil para ti si ya hasprogramado algo previamente, si sabes lo que es unavariable y un bucle, por ejemplo, o si tienes algunasnociones de programación en cualquier lenguaje,aunque sean mínimas.

Aún así, si no has programado nunca, prontodescubrirás con esta guía rápida que laprogramación es siempre un reto trepidante yespecialmente enriquecedor para desarrollar lacreatividad y en cualquier caso debes saber que elesfuerzo es un pilar básico y necesario con el quedeberás contar si quieres obtener progresos en el

4 Gutenberg 3.0 es un proyecto personal abierto de preservación digital de manuales técnicos de computadorasclásicas accesible en la dirección web https://calentamientoglobalacelerado.net/gutenberg30 y que cuenta con más de1000 manuales digitalizados en formato PDF.

9 de 78

Page 10: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

avance del reto que te has planteado y en el que teacompañaré.

10 de 78

Page 11: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

La presente Guía Rápida no es ni un curso deprogramación en lenguaje BASIC, ni mucho menosun tutorial de Ensamblador/Código Máquina5. Estaguía está basada en la creación y análisis de unsencillo juego arcade tipo cuyo código, escrito enZXBASIC, estudiaremos a fondo y nos servirá desoporte para conocer las técnicas más básicas a lasque deberás enfrentarte para abordar cualquierdesarrollo de estas características.

Cómo podrás comprobar a medida que vayas avanzadoen la guía, no se trata de un folleto en el queconsultar la sintaxis de un lenguaje o una listadetallada de comandos, sino de un documento en elque se analizan conceptos diferentes a los de unmero manual técnico o de programación. Por otrolado, resulta obvio que, dado su volumen, seránecesario un tiempo y dedicación para asimilar sucontenido. Esto te llevará tiempo, tal vez en unasemana a fondo, o algo más si partes de cero.

5 ENSAMBLADOR / Código Máquina es el nombre con el que se denomina al lenguaje de programación de bajonivel ligado directamente al procesador. Frente a la altísima velocidad de ejecución de sus programas y el control totaldel hardware se encuentra la enorme dificultad de programación que supone y el profundo conocimiento delprocesador que se requiere para ello.

11 de 78

# 03 Objetivos de la Guía Rápida

# 03 Objetivos de la Guía Rápida

Page 12: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

Siempre dependerá del entusiasmo con el que te lotomes y de los conocimientos previos que poseas,pero en cualquier caso y a grandes rasgos, con elconocimiento y experiencia que adquirirás alestudiar en profundidad esta guía rápida espero quepuedas conseguir:

Escribir sencillos juegos con un acabado y calidadsuficiente para conseguir que sean difundidos através de La Red y reconocidos, por ejemplo, enconcursos de desarrollo hombrew e indizados en losrepositorios oficiales online de software para ZX-Spectrum.

Aprender más sobre la mítica plataforma ZX-Spectrum, saboreando la intensa y nada desdeñablesatisfacción personal de crear un juego por timismo, o incluso, por qué no ...

¡¡Hacer historia con un juego espectacular que seaelegido GOTY (game of the year) 2025 en el grandiosoportal www.elmundodelspectrum.com !!

Para lograr estos objetivos, nuestra guía rápida nosaportará de forma detallada:

Una visión global de nuestras posibilidadesde desarrollo conociendo las limitacionesdel BASIC de Sinclair (ZXBASIC) para eldesarrollo de videojuegos así como elsoporte y las ventajas ofrecidas por el

12 de 78

Page 13: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

compilador nativos de código ZXBASICcomo MCODER3.

Comprensión y uso de los comandos másfrecuentes del lenguaje ZXBASIC necesariospara el desarrollo de sencillos videojuegos,LET, PRINT, PLOT, DRAW, INK, PAPER,INKEY$, GOTO, BEEP, FOR...NEXT, etc.

Comprensión y uso de las variables típicaspara el desarrollo de un juego, destinadasprincipalmente al control de coordenadas ycontadores, así como la interpretación y usode éstas mediante la lógica condicional quenos ofrece el lenguaje.

Distribución de la pantalla del ZX-Spectrumen 2 dimensiones, tanto en alta como en bajaresolución (Ver anexos).

Técnicas sencillas de control y movimientode objetos/personajes en pantalla medianteel teclado o la palanca de juegos/Joysick.

Técnicas posibles para la detección deobjetos en pantalla para lograr lainteracción funcional del personaje con elescenario y posibles colisiones con objetos.

Elaboración y uso de los sprites/GDUsmediante herramientas específicas de apoyo

13 de 78

Page 14: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

al diseño y gestión tales como ZX-DRAW óGDUCalc.

Refresco de variables durante el juego (Fuel,Score, coordenadas, etc.) y visualización enpantalla de barras de progreso(combustible) en tiempo real .

Técnica básica utilizada para la introducciónde música background con intercepción deteclado.

Depuración de errores y pulido del aspectovisual del programa al máximo mediante lacontinua revisión de código.

Última revisión del código paraoptimización máxima y mejora delrendimiento, especialmente del motorprincipal del juego. Llevar el código allímite.

Compilación y ensamblado del códigofuente Sinclair-BASIC mediante elcompilador nativo MCODER3. Algo con loque muchos soñamos un día lejano pero noconseguimos en su momento.

Elaboración de pantalla de carga paraversión de cinta física o en formato de cintavirtual (archivos de extensión TAP)

14 de 78

Page 15: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

mediante herramientas cruzadas o nativas.

Elaboración y montaje final del juego enversiones digitales y/o físicas y supublicación/venta/intercambio en portalesespecializados o retroeventos.

La mayor parte de estos conocimientos serán adquiridosde forma muy práctica, deshilachando línea a línea elcódigo completo de nuestro juego EL CHATARREROGALACTICO, estudiando a fondo la funcionalidad decada orden y a través de los comentarios de las mismasen los que iremos viendo su forma de uso y finalidad.

15 de 78

Page 16: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

A la hora de abordar el desarrollo de un juego, loprimero que necesitamos es la semilla. Con semillame refiero a una idea más o menos clara de lo quedeberá ser nuestro juego una vez acabado, o almenos, por dónde vamos a comenzar nuestrotrabajo. Dibujarlo en nuestra mente y tomar notas detodo cuanto se nos ocurra es siempre buena ideapara dar comienzo a un desarrollo.

En esta fase tan creativa como trepidante, esfundamental tener consciencia de las limitaciones alas que el harwdare y el software6 nos someterápara no acabar dando al traste con nuestrosproyectos. Podemos soñar con juegos maravillosospero lo mejor es comenzar por algo sencillo comopor ejemplo nuestro proyecto EL CHATARREROGALÁCTICO. Pienso que una idea sencilla yprimitiva puede ser una forma adecuada decomenzar a conocer una plataforma y de ofrecernosciertas garantías de éxito.

6 HARDWARE y SOFTWARE: ambos conceptos representan la dualidad en la esencia del ordenador, el cuerpo y elalma de la computadora que conforman cualquier sistema informático. El hardware es referido a la parte física queconforma la máquina (circuitos, baterías, procesadores, etc.) mientras que el concepto de software abarca toda la parteinmaterial del sistema tales como archivos y programas.

16 de 78

# 04Como Enfocar Nuestro Proyecto

# 04Como Enfocar Nuestro Proyecto

Page 17: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

La idea sobre El Chaterrero Galáctico no puede ser mássimple. No en vano, en su primera versión selimitaba a una letra O que circulaba por la pantalla

tragándose asteriscos y uncontador de objetosrecogidos. Después, hay quetrabajar en enriquecer laidea con una historia,menús, gráficos, sonidos ycualquier cosa que se nos

ocurra para mejorar nuestro juego funcional yvisualmente hasta conseguir darle un atractivo, unapersonalidad propia que sea capaz de despertar elinterés de algún usuario que no sea el propio padrede la criatura. Por ejemplo, en nuestro juegoconvertiremos la pantalla en una ventana delespacio sideral y los objetos en residuos eléctronicos.

Por otro lado, y aunque el detalle sea más técnico queotra cosa, el movimiento de nuestro personaje sehará carácter a carácter ya que el movimiento píxel apíxel queda reservado, casi en exclusiva, para laprogramación en código máquina. No obstante, nodebemos obviar que algunos títulos comerciales degran éxito en su momento tampoco gozaron en sudía de un fluido movimiento píxel a píxel. Paracomprender la diferencia entre ambos tipos demovimientos puedes ojear la distribución depantalla en ambos modos (alta y baja resolución) enla sección de anexos.

17 de 78

Page 18: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

En este aspecto, un detalle también a tener en cuenta esla ventaja que ofrece el Spectrum al poder utilizar deforma simultánea los modos de baja y altaresolución, que pueden coexistir sin problemas. Estono ocurría en otras plataformas como ORIC, en elque la visualización de objetos en modo de altaresolución no era compatible con el modo de bajaresolución o modo texto.

Para estructurar bien el juego, puede ser buena ideaestablecer de alguna forma diferentes niveles dedificultad, por ejemplo, en nuestro juego tipo, enfunción del número de objetos a recoger se podráaumentar la dificultad dado que contamos con uncombustible limitado.

Además de estas cuestiones, existen ciertas fórmulaspara imprimir mayor dinamismo a nuestro juego,como por ejemplo:

▪ Representar al protagonista con una imagendinámica que se vaya alternando mientras estáparado.

▪ Incluir un efecto de sonido al recoger cadaobjeto o residuo electrónico que vayaincrementando el tono a medida que vayarecogiendo aportando algo más de tensión alambiente.

▪ Experimentar bastante con los colores con la

18 de 78

Page 19: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

idea de conseguir una ambientación adecuada.

Resumiendo ya el guión básico de nuestro juego, elprotagonista irá recorriendo la pantalla (el espaciosideral) recogiendo los objetos (residuos de chatarraelectrónica) y podrá superar los niveles establecidosal limpiar completamente cada sector.

19 de 78

Page 20: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

Una vez clara la idea de lo que queremos hacer, nos tocadecidirnos entre diversas vías técnicas para crearnuestro juego y que a veces vendrá determinada enfunción de las características del propio desarrollo(tipo de juego) y/o de nuestras propias preferenciasde trabajo (lenguajes o herramientas preferidasprincipalmente).

Dado el colapso informativo al que a veces nos somete laRed, vamos a intentar resumir, grosso modo, lasdistintas alternativas posibles:

1. ARCAICA o purista: La antigua usanza está recomendada

especialmente parapequeños desarrollos, gentecon mucho tiempo libre u"ortodoxos radicales" (sinintención de ofensa).Básicamente consiste en eldesarrollo mediante el uso

de la plataforma original (gomas, +2, +3, etc.) y

20 de 78

# 05Las Vías Técnicas de Desarrollo

# 05Las Vías Técnicas de Desarrollo

Page 21: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

con todos los encantos y limitaciones que estosupone. Dependiendo dellenguaje o herramientasoftware que se utilice,dentro de esta opciónarcaica se puede optar pordiversas vías de desarrollo.

Si por ejemplo no queremos meternos conZXBASIC ó Código Máquina, también podemosrecurrir a software nativo de la época dorada comoGame Designer (I y II) de Software Studios (1983), elcual nos permite crear sencillos videojuegos detipo arcade a partir de modelos predefinidos. Enel caso concreto de Game Designer, se trata de undiseñador de juegos dotado de un motor encódigo máquina y un robusto interface que nospermitirá producir sencillos juegos arcades tipo(marcianitos, tanques, etc.) con calidad comercialaceptable (genera juegos muy optimizados) y contiempos de desarrollo cortos al no escribir unasola línea de código, pero por otro lado, bastanteencorsetados en cuanto a la estructura o guión deldesarrollo.

2. INTERMEDIA o equilibrada: Esta opción es la recomendada para seguirnuestra guía rápida y apuesta por el desarrollo"casi directo" sobre la plataforma ZX-Spectrumpero corriendo en un emulador comoSpectaculator o el poderoso entorno cruzado de

21 de 78

Page 22: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

desarrollo BASINc. Con el emuladorSpectaculator editamos el código de forma"nativa" pero trabajando en nuestro sistemaWindows, y ya puestos, lo más cómodo es

seleccionar desde elemulador cualquiermodelo de Spectrum 1287

aunque nuestro juego finalse vaya a compilar para

máquinas de 48K. Para ello solo debemosseleccionar en el menú de arranque el BASIC 128BASIC ó +3 BASIC, aunque cada vez quequeramos compilar el código con MCODER3 seránecesario conmutar desde el MODO 128 alMODO 48 tecleando el comando SPECTRUM),ya que así podemos teclear las órdenes de formanatural a diferencia delMODO 48 que solo permitela entrada de órdenesmediante las teclas asignadaspor la ROM (tokens delSpectrum 48), además de aprovecharnos de lapotente función RENUM que nos permitereordenar todas las líneas de código de nuestroprograma, actualizando también los saltos de loscomandos GOTO y GOSUB. En esta vía también

7 SPECTRUM 128: Estas máquinas consituyen la segunda generación de Spectrum y podemos encontrar dos modosdiferentes de trabajo, el modo 128 y el anterior modo 48K (por mantener la compatibilidad con el sistema original).Para ello, disponen de una suerte de "sistema operativo" que nos permite seleccionar diferentes los distintos modos detrabajo y/o otras funciones. Lo realmente interesante es que, aunque vayamos a compilar nuestro programa paracorrer en ordenadores de 48K, podemos escribir nuestro código desde el modo 128K y aprovecharnos de la mayorversatilidad y potencia del editor del 128.

22 de 78

Page 23: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

podemos editar nuestro código con BASINc ycombinar esta versátil herramienta con el uso delemulador Spectaculator (o cualquier otro),siempre que utilicemos para ello un formatocompatible al guardar nuestro programa en unfichero como puede ser .SNA. Al optar por estavía de desarrollo, podremos disfrutar la potenciainfinita y el tacto exquisito de emuladores comoSpectaculator, ZEsarUX, FUSE, y otros muchosdisponibles hoy día para prácticamente cualquierplataforma, o como he dicho anteriormente, delmágico entorno de desarrollo BASINc paraWindows que nos permitirá trabajar en modo casiSPECTRUM sobre un editor cruzado con todaslas comodidades que ello conlleva, copiar, cortar,pegar, etc. así como de otras muchas utilidadesaccesorias que veremos con mayor detalle en estasecció n de herramientas de apoyo . Entiendo quees ésta sin duda (la vía intermedia) una opciónbastante atractiva y equilibrada para los que sesienten cómodos y gustan saborear del viejolenguaje ZXBASIC trabajando con la máquinaoriginal (los más viejunos) pero sin renunciar aalgunos privilegios exclusivos no disponibles ennuestra querida plataforma de ocho bits. Algunasde las ventajas a las que me refiero sonprincipalmente carga y salvado inmediato,velocidad de frecuencia del procesador Z80Aconfigurable (muy interesante para compilar elcódigo a velocidad de la luz), ajustes de

23 de 78

Page 24: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

visualización, edición automatizada de GDUs,emulación de todo tipo imaginable de periféricosy un larguísimo etc.

3. VANGUARDISTA o revolucionaria: Recomendada para gurús dispuestos a llevar elhardware de 8 bits al límite y hacer historia, optapor escoger el uso de modernas herramientascruzadas específicas para el desarrollo devideojuegos y que corren sobre plataformas PC(Windows/LiNuX), tales como La Churrera (de losMojons Twins - MK1/MK2) ó AGD (de JonathanCauldwell). La potencia de algunas de estasherramientas nos permiten llevar a cabodesarrollos de calidad comercial muy alta sinnecesidad de escribir todo el código de nuestroproyecto desde cero y prácticamente sinlimitaciones. De hecho, una gran parte de juegosdesarrollados en la actualidad están siendocreados con estas potentes herramientas y entreéstos se incluyen géneros tan diversos que vandesde sencillos arcades clásicos hasta isométricos3D, un espectro al que solo la imaginación puedeponer límites. Sin embargo, la potencia de estasherramientas de desarrollo está ligada a sucomplejidad y exprimirlas al máximo puederequerir de un conocimiento exhaustivo de lasmismas más allá del mero conocimiento delZXBASIC. Además, como te comenté al inicio deesta guía, si un día decides desarrollar juegos

24 de 78

Page 25: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

para ZX-Spectrum utilizando otro lenguaje deprogramación distinto al ZXBASIC, y conmayores posibilidades, puedes explorar nuevos ypotentes lenguajes compilados como elmaravilloso BASIC BORIEL o el uso de la libreríaZ88 para compiladores C (recomendable el CursoZ88DK de RADASTAN en speccy.org) que generaun código máquina ejecutable compatible con elprocesador Z80A8 del Spectrum y bastanteoptimizado. Por otro lado, la programacióndirecta en código máquina, aunque puede queresulte demasiada complicada como para abordarun proyecto completo, también podrás hacerlatanto sobre la máquina original (con el uso de unensamblador nativo o el propio ZXBASIC) comoa través del uso de compiladores cruzados paraWindows ó LiNuX que generan código máquinapara el procesador Z80, PASMO es el másconocido.

En cualquier caso y sea cual sea la vía por la que nosdecidamos, de lo que se trata al fin y al cabo es demodelar nuestra idea e ir dándole forma poco apoco hasta pasar de algo sencillo y casi espartano:

8 Z80A es la variedad del microprocesador de 8 bits Z80 con una frecuencia mayor que el Z80 original (3.58 Mhz en elcaso del Spectrum frente a 2.5 Mhz de las primeras versiones) lanzado por la compañía Zilog en julio de 1976 y quemontaban los microordenadores ZX-Spectrum. Existen versiones que alcanzan los 20 Mhz.

25 de 78

Page 26: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

A un producto final algo más refinado y atractivo:

Para lograr este objetivo simplemente iremos yañadiendo y depurando código que mejore nuestroprograma a medida que se nos vaya ocurriendo, yno solo centrados en el aspecto visual, sino tambiénen lo que afecta al guión o la funcionalidad deljuego, ya sabes, dificultad, niveles, jugabilidad ycualquier otra cosa que se nos ocurra.

Estas notas son, a modo de ejemplo, algunas de las queyo describí durante el desarrollo de ELCHATARRERO GALÁCTICO y tal vez puedandarte una idea bastante aproximada de lo quepretendo explicarte:

Se crea menú principal de juego que dará

26 de 78

Page 27: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

acceso a los distintos niveles de dificultad.

Se implementan GDUs (elaborados conZX-Draw) de caracterización del personaje yobjetos chatarra. Para ello se guardan los diseñosen archivo con formato .TAP y se MERGEaluego con el código principal del proyecto o biense pega (probar) el código generado directamentesobre el programa usando el entorno BASINc.

Se dibuja al chatarrero en alta resolución(con ZX-Draw) y se muestra en el menúprincipal. Después modificar atributos de zonasde pantalla del dibujo mediante POKEdir.screen,atributo y se encierra en bucleprincipal del menú para producir efectodestellante.

Revisar código e incluir comentariosaclaratorios para la fase de desarrollo.

Se mejora el sonido simulado del motor dela nave del chatarrero (usando RND) y seimplementan sprites dinámicos para nuestranave que varíen en función de la dirección y enen posicionamiento estático/inmovil.

Implementar sencilla rutina que simulacuerpos celestes del espacio profundo.

Se incorpora barra de estado que muestra

27 de 78

Page 28: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

nombre juego y nivel en curso.

Se implementa código que evita el borradode las estrellas cuando pasa el sprite delchatarrero.

Se implementa melodía final del juego alsuperar el nivel, introduciendo comandos deinterrupciones de teclado entre la secuencia deBEEP's para poder salir de la música al pulsaruna tecla.

Se implmenta efecto sonoro de recogida dechatarra que va incrementando el tono a medidaque va limpiando el sector (parece aumentartensión;)

Revisión general de parámetros de color.

Se modifica el juego de caracteres (tipo deletra) por defecto mediante minúscula rutina encódigo máquina que se carga al inicio delprograma. Ojo! no ejecutar en modo 128.

Se realiza compilado de todo el códigofuente con MCODER 3.

Tras compilar el código, se guarda todo elprograma resultante en un archivo .TAPmediante la orden SAVE "NOMB-PRG" ygenerando el fichero .TAP (en

28 de 78

Page 29: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

SPECTACULATOR hay que activar/mostrar lagrabadora y poner un fichero vacío con extensión.TAP) en el interior de la grabadora virtual (sepuede arrastrar y soltar dentro).

29 de 78

Page 30: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

Considerando que hemos optado por la segunda vía delapartado anterior o vía intermedia, el únicohardware que necesitas para comenzar a seguir laguía o empezar tu proyecto es un ordenadorcompatible PC con el sistema operativo Windows de 32bits (XP como mínimo aunque otros más antiguostambién podrían funcionar). Incluso un viejo PC conprocesador iPentium ó AMD K6 puede convertirseen una potente estación de trabajo y desarrolloaunque resulte difícil de creer. Por otro lado, sitrabajas en LiNuX tampoco tendrás problemas paraencontrar las herramientas necesarias, sobre todo unbuen emulador. Según he oído en varias ocasiones,FUSE es el mejor emulador de ZX-Spectrum para lossistemas del pingüino (LiNuX).

Como verás, ni siquiera necesitas la máquina originalpara la que vamos a desarrollar, y esto es algo quedebemos agradecer eternamente a los magos yprogramadores que dedican su valioso tiempo a lacreación de esos programas mágicos llamadosemuladores, ellos son los auténticos protagonistas y a

30 de 78

# 06Hardware y Software Necesario

# 06Hardware y Software Necesario

Page 31: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

ellos le debemos prácticamente todo lo que la escenaretro ha llegado y pueda llegar a ser.

Por otro lado, todas las herramientas software que heutilizado para el desarrollo del juego modelo de ElChatarrero Galáctico así como las herramientas yutilidades (gratuitas) que se citan en la presente guía,puedes descargarlas en cualquier momento desde eltaller de descarga que encontrarás al final de lapresente guía. Enumerémoslas:

• Emulador SPECTACOL v5.2 para Windows: una delas últimas versiones libres de este estupendo yversátil emulador de Spectrum para Windows ydisponible también para otros sistemas operativos.

• Compilador MCODER III para ZX-Spectrum:MCODER es un potente compilador nativo decódigo ZXBASIC que otorgará más potencia yversatilidad a tu desarrollo y lo que es mejor, essencillo, muy sencillo. La versión 3 creo que mejoróentre otras cosas el tratamiento de matrices de datos.Jamás he tenido un problema de compilación y solodebemos considerar algunos pequeños detalles paraconseguir una compilación completamente limpia denuestro programa. El Chatarrero Galáctico y muchosotros juegos de la época comercial de la máquinaeran programas en BASIC directamente compiladospara su comercialización, algunos de ellos grandesclásicos como Saimazoon, Babaliba o la aplicación de

31 de 78

Page 32: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

diseño gráfico Artist.

32 de 78

Page 33: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

Cuando hace 35 años alguien con la intención de escribirun programa se sentaba frente a una computadoraconectada a un magnetófono y a un televisor quemostraba un mensaje del tipo "© 1982 SinclairResearch LTD" o similar, era bastante consciente deldesafío al que se enfrentaba y de cuales eran suslímites.

Por suerte o por desgracia, las cosas han cambiadobastante en el ámbito del desarrollo informático.Incluso si nos decidimos por la sofisticada vía"Vanguardista o Revolucionaria" (citada en la sección5 - Vías Técnicas de Desarrollo) para romper lasbarreras del ZXBASIC y por ejemplo, escribirnuestros juegos en C haciendo uso del kit delibrerías Z88, muy pronto percibiremos como el usode librerías mágicas nos permitirán obtenerresultados brillantes con poco esfuerzo.

Esto es bueno en parte, ya que nos permite centrarnuestros esfuerzos en otras tareas más artísticas otrascendentales además de poder conseguir

33 de 78

# 07Otras Herramientas Cruzadas de Apoyo

# 07Otras Herramientas Cruzadas de Apoyo

Page 34: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

resultados más brillantes y profesionales, pero porotro lado abre un debate profundo en ciertosámbitos del desarrollo porque nuestro programaacaba ejecutando procesos que no comprendemos nipodemos controlar totalmente.

En nuestra decisión por la "Vía Intermedia y Equilibrada",optamos por el uso de herramientas que puedenfacilitarnos tareas lentas y tediosas pero sin perderla esencia básica del desafío al que me refería alinicio de esta sección. Podemos compilar a lavelocidad de la luz nuestro programa, abrir 4ventanas simultáneas emulando un 16K, un 48K, un+2 y un +3, copiar y pegar código de un lado a otroo añadir código a nuestro juego para el sintetizadorde voz Currah, pero nunca podremos usar unalibrería mágica para hacer por ejemplo un suaveSCROLL de pantalla... ¿O sí? Bueno, lo cierto es queel uso de rutinas en ensamblador desde ZXBASIC esun tema apasionante (nos permite romper muchoslímites del lenguaje interpretado ZXBASIC) peroque no trataremos en esta guía.

En esta línea de trabajo, encontramos algunasaplicaciones muy útiles para el desarrollo y queconviene explorar en profundidad, tales como:

Aplicación BASINc v1.69 : Potente y completísimoentorno de desarrollo para ZX-Spectrum derivadodel proyecto BASin escrito en Delphi para sistemas

34 de 78

Page 35: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

Windows de 32 bits. BASINc es sin duda la joya dela corona. Probablemente se trate del entorno deedición y desarrollo más cómodo y potente queexiste. Se trata de un entorno completo que integrano sólo un editor de código con todas lasfacilidades propias de los modernos editores, sinoque nos permite ir probando el código en suemulador y ver el resultado cada vez que lonecesitemos. Además del editor de código,BASINc incorpora multitud de funciones extrasque nos permitirán renumerar las líneas denuestros programas, editar nuestros GDUs,guardar nuestros programas en diversos formatos,etc.

ZX-DRAW es un sencillo software cruzado (corresobre cualquier plataforma Windows) pensadopara ayudarnos en el diseño gráfico de pantallasen alta resolución. Se trata de un desarrollo propioque se encuentra actualmente en fase betaavanzada pero completamente funcional y de libredistribución. ZX-Draw es capaz de generar códigoBASIC-ZX reutilizable a partir del diseño quevayamos creando en la pantalla virtual. Lafilosofía de esta utilidad está inspirada en la viejatécnica de dibujo mediante papel carbón (calca) eincorpora algunas funciones especiales comoaerógrafo, relleno de áreas, etc. La última versióndisponible (v0.9b) incorpora un sencillo generadorde GDUs que ha sido utilizado en nuestro

35 de 78

Page 36: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

programa El Chatarrero Galáctico. Si desea másinformación acerca de esta herramienta de apoyopuede visitar la web del programa en:https://calentamientoglobalacelerado.net/zxdraw

GDUCalc es un software cruzado basado en hojade cálculo (corre sobre cualquier plataformaWindows) diseñado para una cómoda gestión degráficos sprites GDUs para el ordenador ZX-Spectrum. GDUCalc corre sobre aplicaciones dehoja de cálculo de los paquetes ofimáticos máspopulares del mercado. Al descargar estaaplicación encontrarás varias hojas de cálculoidénticas que son en realidad versiones paraMicrosoft Office 2003/2007, LibreOffice v4+ yOpenOffice v4+. Si desea más información acercade esta herramienta de apoyo puede visitar la webdel programa en:https://calentamientoglobalacelerado.net/gducalc

Algunas de estas herramientas posiblemente corran sinproblemas en cualquier sistema LiNuX mediante lautilidad WINE que permite ejecutar softwareWindows de forma nativa sobre plataformas LiNuX.

Aunque prácticamente no necesitamos mucho más, si loque deseamos es montarnos un entorno"profesional" de desarrollo para ZX-Spectrum deauténtica vanguardia, no está de más queinstalemos y experimentemos con algunas otras

36 de 78

Page 37: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

herramientas de apoyo que sin duda encontraremosen la Red a poco que hagamos una búsquedaprecisa. Recuerda que trabajar en un desarrollo paranuestro entrañable ZX-Spectrum no tiene por quésignificar darle la espalda a la realidad de lostiempos que corren y a las muchas ventajas que latecnología informática pone a nuestro alcance. Talvez por ello, algunos de los últimos desarrolloslanzados en la actualidad para plataformas retro, yasea en ZXBASIC o en código máquina, comienzan aacercarse e incluso a superar a las obras magistralesde la época. Debemos entender que desarrollarnuestro proyecto, aún programando desde cero ysin servirnos de herramientas específicas para lacreación de videojuegos tales como las MK ó AGD,no significa que debamos renunciar al uso detecnologías y aplicaciones accesorias de apoyo quefaciliten nuestro trabajo.

37 de 78

Page 38: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

Este apartado nos servirá como calentamiento para irestructurando nuestra mente. Digamos que nosprepara para asimilar mejor el contenido de lassecciones siguientes. Sin entrar de pleno en laprofundidad de la programación, haremos primeroun recorrido más ligero sobre el programasobrevolando desde las alturas y examinando todo avista de pájaro intentando comprender elfuncionamiento de todo lo que hace el programa yel esquema general.

Para ello he dividido el código completo en bloques queiremos desgranando poco a poco con el único objetode asimilar mejor el análisis profundo al que nosdedicaremos más adelante.

Es lógico que en cualquier momento puedas volversobre esta sección para releer algunas de susexplicaciones y resfrecar las ideas. Adelante con ello.

38 de 78

# 08 Primer Vistazo Superficial al Código

# 08 Primer Vistazo Superficial al Código

Page 39: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

Líneas de la 1 a la 14Como puedes ver, las líneas del programa están seguidas y, aunque herramientas como BASINc nos permiten unarenumeración automática (incluso actualiza los GOTO’s), he decidido dejarlo buscando una compactación máximadel código y algo de velocidad. En la sección de optimizaciones y pulimentación podrás conoceralgunas sencillastécnicas para conseguir mejorar el rendimiento de tus juegos escritos en BASIC. En esta primera zona de códigoaprovechamos para cargar los GDUs (GOSUB 1000), modificamos el juego de caracteres (GOTO 2000), diseño ypresentación del menú (GOSUB 900), inicialización de variables, etc. Todo ello sirviéndonos de los cómodos saltosofrecidos por las órdenes GOTO (salto sin retorno) y GOSUB (salto a SubRutina).

Líneas de la 15 a la 118Entre la línea 15 y la 50 encontramos el verdadero núcleo del juego. Se trata de un bucle cerrado que solo podráfinaliza cuando se cumplan unas determinadas condiciones. Para ello, es necesario incluir en dicho bucle loscondicionales que comprobarán en todo momento si esas condiciones se cumplen.El resto de contenidos que completan el juego (menú, instrucciones, gráficos, etc.) quedan pues en un segundoplano y por ello deben estar fuera del “motor” principal.

39 de 78

Page 40: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

Líneas de la 900 a la 907Llegamos a la línea 900 desde un salto en la línea 4 GOSUB 900 y justo ahí volvemos a saltar!! con otro GOSUB a lalínea 2000... Algunos programadores de mente fuertemente estructurada estarán pensando ya ¡¡OHH DIOS MIO CREOQUE ESTOY A PUNTO DE VOMITAR!! ¿ESTAMOS LOCOS?? Quizá no tanto. Me explico. En la línea 900 nos disponemosalegremente a preparar el menú principal del juego, pero como el dibujo del fantasma en alta resolución requierebastante código extra y probablemente se nos ocurrió en algún momento de nuestro desarrollo en el que ya nodisponíamos de suficientes líneas libres para insertarlo pues decidimos escribir ese código (el que dibuja el fantasma)en algún otro sitio de nuestro programa (línea 2000) y luego enviar la ejecución allí con un GOSUB 2000. Aunquealgunos puedan tipificarlo de sacrilegio no hay más historia que la que os cuento. Seguimos... La línea 901 dibuja lasbandas diagonales de colores con efecto 3D. La 904 y 905 forman un bucle cerrado (mediante GOTO 904) del que nose sale hasta pulsar una tecla comprendida entre 1 y 5, cuyo valor determinará el nivel de juego y por tanto el númerode residuos (línea 906) que deberá recoger el Chatarrero Galáctico. La 907 muestran instrucciones.

Líneas de la 908 a la 1038En la línea 908 se vuelve a producir un salto a la 1300 (GOSUB 1300) por similares motivos a los que explicaba en elpárrafo anterior. En este caso se trataba de trazar una caja/marco en la pantalla con algunos adornos. Ya finalizadotodo el aspecto visual y mientras se muestra la pantalla de instrucciones previa al inicio del juego, entre las líneas 910y la 920 se establece otro bucle (920 GOTO 910) que muestra a nuestro fantasma protagonista moviéndose de unlado a otro y comprueba si pulsemos una tecla para dar comienzo a nuestra apasionante aventura;-)). Observa que laslíneas 910 y la 914 son prácticamente idénticas y solo difieren en el valor de la coordenada X que posiciona enpantalla al sprite GDU de nuestro protagonista, para que de este modo se produzca el paseo del chatarrero de un ladoa otro de la pantalla. Obviamente el código se puede mejorar ya que se han creado dos bucles distintos paraconseguir la animación del chatarrero hacia ambos lados. Además, cada bucle incluye su propio código que son, elsonido del motor y el condicional que detecta la pulsación de cualquier tecla y que sirve para salir del bucle y

40 de 78

Page 41: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

continuar con la ejecución del programa. A partir de la 1000 se carga en memoria los GDUs (sprites 8x8 píxeles).

Líneas de la 1040 a la 1128Se continúa con la carga de GDUs (gráficos definidos por el usuario). En el Basic del ZX-Spectrum,el usuario puedegenerar hasta 21 GDUs y asignarlos a los códigos ASCII a partir del 144 (que se corresponde con la letra A). Existenmétodos para superar este límite, pero su explicación escapa a la finalidad de la presente guía.Verás que antes de comenzar a definir el gráfico (mediante la órden POKE que escribe en memoria), he incluido unalínea de comentario en la que se indica el código ASCII/carácter necesario para acceder a dicho GDU, y además semuestra el GDU para que visualmente nos resulte más cómoda y rápida su interpretación.La definición de sprites se consigue mediante código binario en el que el valor CERO supone un vacío o píxel apagado,y el UNO lo contrario. En el juego del Chatarrero verás que los sprites representan las distintas posturas o gestos quemuestra el protagonista, además de otros gráficos que representan a la basura, la gasolina, o los bloques diagonalesusados en el menú principal del juego.

Líneas de la 1130 a la 1199Aquí se continúa básicamente con lo mismo, y como verás, los GDUs están definidos de diferentes formas, en unoscasos se designa el carácter directamente entrecomillado, y en otros mediante el valor numérico ASCII equivalente. Elresultado de uno u otro modo es idéntico.Para acceder a todos estos GDUs debemos activar el modo G desde el teclado del ZX-Spectrum (CAPS+9) y luegopulsar la tecla correspondiente al GDU deseado (A, B, C, etc...). Así se accede estos gráficos.Es típico definir todos los GDUs de nuestro programa al final del código del mismo, y luego saltar a la línea dondecomienza la carga de los GDUs mediante un GOSUB, en cuyo caso, siempre deberemos volver mediante lacorrespondiente orden RETURN.Como verás, al final de todos los gráficos, en la línea 1199, una orden RETURN devuelve la ejecución del programajustamente a la línea siguiente al GOSUB que nos trajo hasta aquí. Si quieres comprobarlo, verás que en la línea 2 delprograma se ordena un salto GOSUB 1000 que es precisamente donde comienza la carga de los GDUs.

41 de 78

Page 42: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

Líneas de la 1300 a la 1599La línea 1300 es en realidad una SUBRUTINA en la que se incluye el código para dibujar un marco en alta resolución ycomo ves, también integra ya la orden RETURN al final de la línea, para que así podamos llamar a esta SUBRUTINAdesde cualquier parte de nuestro programa cada vez que neceitemos dibujar un marco (GOSUB 1300) La línea 1305 es similar a la anterior en su funcionalidad, solo que dibuja un marco algo más pequeño y consigue elefecto de marquesina de doble línea.La línea 1400 inicia la rutina de marquesina doble con filigranas de color (arcoiris spectrum) en la esquina inferiorderecha. Esta marquesina es la utilizada en el escenario principal del juego.Las líneas 1500-1599 están destinadas a trazar la imagen en alta resolución del chatarrero galáctico (fantasma) que semuestra en el menú principal del juego.

Líneas de la 2000 a la 5590En la línea 2000 hemos implementado una pequeñísima rutina en código máquina que modifica el juego de caracterespor defecto de nuestro ZX-Spectrum. No quiero decir con esto que la fuente del ordenador milagroso sea fea ni muchomenos, simplemente es un experimento más que muestra las enormes posibilidades de pequeñas rutinas de códigomáquina y que podemos integrar fácilmente en nuestros programas escritos en BASIC sin ningún tipo de conocimientode ensamblador y mejorando su atractivo. A partir de la línea 5500 se inicia el bucle final, con música incluida, que semuestra en pantalla al superar cualquier nivel del juego. Los GOTO's con salto condicional permiten seguir la secuenciade ejecución de la música y comprobar en cada línea si se pulsa la tecla ESPACIO, en cuyo caso el valor numérico alque saltará el GOTO es 4, es decir, el inicio del juego nuevamente. Este técnica, algo enrevesada visualmente, nospermite ejecutar la música y detectar la pulsación de la tecla para romper el bucle, teniendo en cuenta que el BEEP delZX-Spectrum congela literalmente el procesador Z80 mientras suena.

42 de 78

Page 43: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

43 de 78

Page 44: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

Tras la sección anterior, que igual te ha saturado un pocosi te la estudias de sopetón, vamos a tratar algo másliviano huyendo del colapso cognitivo.

A menos que seas extremadamente meticuloso y puristaen la fase de análisis de tu juego o quieras dedicarletiempo al estudio de la creación de organigramas

(también llamados diagramasde flujo) previos a la fase deimplementación (picada decódigo en la máquina), es muyprobable que antes o despuésdebas enfrentarte a unsoberbio problema de

organización de tu código y esta sección te será degran ayuda para poder superarlo. Te cuento.

El día que escribí el borrador de este juego en miSpectrum +3 el código inicial resultó en un tamañoaproximado de 1 KiloByte (estoy convencido de quepodría correr perfectamente en un ZX-81 conmínimas modificaciones) pero finalizado el procesode mejoras gráficas y funcionalidades para convertir

44 de 78

# 09 Mapa Estructural del Código

# 09 Mapa Estructural del Código

Page 45: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

nuestro juego en algo medianamente "serio", en elmomento de desarrollar la presente guía rápida(versión 0.37b) el código ha engordado hastaaproximadamente unos 11 KBytes por lo que, dichosea de paso y al menos en teoría, aún deberíamospoder compilarlo y ejecutarlo sin problemas en unZX-Spectrum 16K.

En contra de lo que muchos puedan imaginar, estosaparentemente ridículos 11 KB de código suponen yaun tamaño considerable de texto para el limitadoeditor de nuestro ZX-Spectrum, y además, el juego seha desarrollado desde el principio sin ningunaprevisión, y lo que algunos programadoresdenominan código espagueti se convierte aquí en unacaracterística de facto. Debes saber que esto teocurrirá a menudo a no ser que seas muyescrupuloso con la elaboración de tu código, pero detodos modos, no está de más recordar siempre queherramientas como BASINc te permitiránreestructurar el código de tu programacómodamente renumerando las líneas de formaautomática.

En este sentido y en relación con el código espagueti, hansido ríos de tinta los que se han vertido paradenostar al antiguo BASIC lineal por estapeculiaridad que otros lenguajes de su época comoPascal, C ó Cobol no ofrecían y que permitía alprogramador novato y/o autodidacta saltar de un

45 de 78

Page 46: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

lado a otro como le venía en gana sin ningún tipo derestricciones, y esa madeja de GOTOs y saltos sincontrol acabó convirtiéndose en un agravio queacompañó a BASIC desde prácticamente sus orígenesremotos y acabó salpicando injustificadamente atodas las variedades posteriores de este hermosolenguaje. Incluso cuando BASIC evolucionó y setransformó en potentes lenguajes más estructurados(ej. AmigaBASIC, SuperBasic de Sinclair-QL) e inclusocompilados (QuickBasic, TurboBASIC, etc) enterrandopara siempre el sistema lineal de ejecución, lacalumnia siguió pesando como una losa para estelenguaje de programación al que la informática engeneral debería estar eternamente agradecida.

Sin embargo, a pesar de todo este tostón que te estoydando con la historia del código BASIC espagueti,veremos como un sencillo esquema de la estructurade nuestro programa puede ayudarnos a mantener almalévolo código espagueti bajo control.

Para el caso de nuestro juego tipo EL CHATARREROGALÁCTICO el esquema de la siguiente páginapodría servirnos perfectamente:

46 de 78

Page 47: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

Línea Descripción general del código

1-14

Inicialización general con llamadas a subrutinasincluye salto a 1000 para cargar sprites GDUs.

incluye salto a 2000 para cambiar tipo de letras.

incluye salto a 900 para presentar menú de opciones.

incluye salto a 1400 para dibujar escenario de juego (marquesina doblecon florituras de colores).

15-50 Núcleo del juego en bucle cerrado (motor)

115-118Comprueba si gana y corresponde premio

incluye salto a 5500 para mantener melodía final.

900

[SUBRUTINA] Muestra Menú de inicio e instrucciones enbucle cerrado. De la línea 907 a 920 se muestrainstrucciones de juego en bucle cerrado y al pulsa tecla seretorna al programa principal para iniciar juego.

incluye al inicio salto a 1500 para dibujar fantasma en alta resolución

1000-1199 [SUBRUTINA] Carga sprites GDU's en memoria

1300-1305[SUBRUTINAS] Se trazan marcos en alta resolución parapantalla de instrucciones (simple) y para pantalla de juego(doble).

1400[SUBRUTINA] Trazan marco de doble línea con filigranas decolores en esquina inferior derecha y que se utiliza en elescenario principal del juego

1500 [SUBRUTINA] Dibuja fantasma del menú en alta resolución

2000[SUBRUTINA] Rutina de código que modifica juegocaracteres del Spectrum

5500[SUBRUTINA] Melodía final de tipo cíclica que suena alsuperar nivel y que detecta pulsación de tecla para salir delbucle y reiniciar juego desde el menú

Este breve "esquema estructural" sustituye de algún modo

47 de 78

Page 48: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

a los odiados y aburridos diagramas de flujo queotrora quitaron el sueño a algunos estudiantes deinformática. Como verás, puedes hacerlo decualquier manera con la única condición de que tesirva realmente a la hora de corregir, modificar oampliar el código.

Ya para terminar te diré que esta práctica no es ni muhcomenos exclusiva del desarrollo de videojuegos ypuedes hacerla extensible a cualquier tipo dedesarrollo cuyo tamaño o complejidad lo requiera. Yes que mantener actualizado un sencillo esquema dela estructura de cualquier programa siempre nosayudará a mantener bajo control el código espagueti y,sobre todo, a retomar el desarrollo de nuestrosprogramas (después de meses o incluso años) connormalidad y sin demasiados traumas. Es posibleque en los modenos lenguajes estructurados esteproblema se haya superado prácticamente medianteel uso de funciones o subrutinas que son llamadaspor su nombre y también por la restricción delcomando/orden GOTO a un uso prácticamenteresidual, pero en ZXBASIC resulta indispensable.

48 de 78

Page 49: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

Y ahora vamos a entrar ya en materia directamente conuna vieja fórmula didáctica que consiste en iranalizando, una a una, todas las líneas del código denuestro programa detallando el efecto que surte. Laestructura del formato que seguiremos no puede sermás simple y si al principio puede parecer que tepierdas con algunos saltos de línea, si echas un ojo alesquema de la sección anterior (ESTRUCTURA DELCÓDIGO) te reecontrarás rápidamente.

Dicho esto, creo que ya estamos preparados paradespegar, así que... Bon Voyage! mon ami!!

Línea 1: Casi tan popular como el HOLA MUNDO!,esta es una de las primeras líneas que debía aprendercualquier jovencito usuario de Spectrum. El comandoREM sirve para incluir cualquier comentario en elcódigo de nuestro programa, y el nombre del juegoparece ser buena idea. Todo lo que se escribe trasdicho comando es ignorado por el programa yúnicamente nos sirve a modo de apunte o aclaración.

49 de 78

# 10Análisis Profundo del Código

# 10Análisis Profundo del Código

Page 50: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

La línea 1 es de tipo simple pues solo incluye uncomando u orden, pero como verás, el ZXBASICpermite el uso de líneas múltiples (con variasórdenes o comandos) separándolas mediante dospuntos : . Esto es útil pues ahorra algo de memoria ypuede mejorar la velocidad de ejecución.

Línea 2: (de tipo múltiple) establecemos el color delfondo y el borde de la pantalla a cero, que equivaleal negro, así como el atributo de brillo por defectoque, al establecer a cero queda desactivado (el brillosolo puede tener dos valores, 0 ó 1). Laorden/comando RANDOMIZE sirve parareinicializar la semilla aleatoria y evitar así que serepitan las sucesiones de números aleatorios porejemplo, al situar objetos en pantalla. A continuaciónse encuentra una orden de salto que envía laejecución del programa (o punto de ejecución9) a unasubrutina situada en la línea 1000 mediante elcomando/orden GOSUB 1000 y que finaliza en lalínea 1199 con la orden RETURN. Tras ejecutarse lasubrutina, con la orden RETURN el control delprograma o punto de ejecución vuelve a la orden o

9 PUNTO DE EJECUCIÓN: es clave en programación y para lo sucesivo comprender el significado de esta expresiónreferida al lugar concreto del programa que se está ejecutando en cada momento, y aunque los tiempos de ejecuciónpuedan ser rapidísimos, no olvidemos que el procesador de nuestra computadora solo puede ejecutar un proceso ocomando en cada momento. De esta forma, podemos decir por tanto que las órdenes de salto alteran el orden lógico(secuencial) del punto de ejecución de un programa.

50 de 78

Page 51: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

línea inmediatamente posterior a la orden GOSUBque ordenó el salto. A continuación se introduce unaorden REM para indicarnos que el salto a la rutina sehará para cargar los gráficos definidos por el usuario(GDUs) o sprites (en su momento ya veremos comofuncionan). También aprovechamos este REM paramostrar los GDUs que se cargan exactamente y enque tecla gráfica quedan asignados cada uno deellos. Esto es muy útil pues nos sirve a modo deíndice.

Línea 3: no debe ejecutarse mientras trabajemos enmodo 128 ya que sirve para cargar una pequeñarutina de código máquina que personaliza el tipo deletra de nuestro Spectrum y da problemas en modo128. Lo mejor mientras trabajas con el programa esignorarla anteponiendo simplemente una ordenREM antes del GOTO. La orden REM nos sirve amodo de advertencia y recordarnos este problema.

Línea 4: CLS nos sirve para borrar la pantalla. Lasórdenes GOSUB sirven para saltar al número delínea indicado y regresar tras ejecutar una subrutina.Todas las subrutinas se finalizan con la ordenRETURN, que devuelve el control del programa(punto de ejecución) a la orden inmediantemente

51 de 78

Page 52: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

posterior al GOSUB que llamó a la rutina. Unarutina (también llamada subrutina) es un trozo decódigo que queremos separar del resto del programa(por legibilidad y estructuración) para llamarlocuando nos interese. Vamos a ver un ejemplo muysencillo para que no te quede ninguna duda:

CÓDIGO DE EJEMPLO:

10 REM PROGRAMA SALUDO MUNDIAL

20 PRINT "SOY AMABLE"

30 GOSUB 200

40 STOP

200 PRINT "HOLA MUNDO!"

210 RETURN

SALIDA EN PANTALLA:

SOY AMABLE

HOLA MUNDO!

En este ejemplo, la orden RETURN de la línea 210 devuelveel control del programa o punto ejecución a la líneainmediatamente posterior al GOSUB 200. Si se tratase de unalínea múltiple (con varias acciones/órdenes separadas por :) laorden RETURN devolvería el control o punto de ejecución a lasiguiente orden dentro de la misma línea que se estaba ejecutandoy desde la que se ordenó la orden GOSUB. Las rutinas enZXBASIC funcionan así, con una llamada o salto hacia la rutina,y, una vez finalizada la ejecución de la rutina y encontrada laorden RETURN , otro salto de retorno para seguir la ejecucióndel programa desde donde se quedó.

Aclarado esto sigamos con lo nuestro. El

52 de 78

Page 53: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

primer salto GOSUB 900 nos lleva al bloque decódigo encargado de mostrar el menú principaldel juego y esperar hasta que se pulse una teclaseleccionando el nivel de juego, traspulsar/selccionar el nivel de juego, se muestra lapantalla de instrucciones y se espera a que sepulse otra tecla para continuar la ejecución delprograma. Cuando se finaliza toda la rutina y seencuentra una orden RETURN (línea 915), elpunto de ejecución vuelve a la línea 4 y continúacon la segunda orden que es GOSUB 1305,encargada de llamar a la subrutina que dibujaun marco doble (de dos líneas) en alta resoluciónen la pantalla de juego. Finalizada esta rutina seretorna de nuevo a la línea 4 para volver a saltarcon GOSUB 1400, rutina que dibuja y completatoda la marquesita que verás durante el juego yque presenta un embellecedor efecto arcoiris en lazona inferir derecha. Esta rutina finaliza en lalínea 1409 con la orden RETURN. Acontinuación una orden REM nos recuerdaque, una vez compilado el código medianteel compilador MCODER3, si queremosreiniciar el juego debemos hacerlo medianteGOTO 4 y no con la orden RUN.

Línea 5: Activa la impresión por pantalla en el canal

53 de 78

Page 54: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

1. Esto es para poder aprovechar las dos líneasinferiores de la pantalla de nuestro Spectrum,exactamente las que usamos para introducir elcódigo cuando trabajamos en modo 48K. Estas doslíneas inferiores no pueden utilizarse como el restode la pantalla mediante coordenadas, por ello esnecesario usar el modificador #1 en la orden PRINT.Verás que toda la línea consta de una sola ordenPRINT seguida de varios modificadores oparámetros separados por punto y coma. Vamos averlo. La orden INK puede usarse de formaindependiente o como operador anexo a una ordenPRINT ó PLOT, y su función es indicar al ordenadorqué color (de la paleta de 8 colores) debe usar paramostrar en pantalla lo que el comando PRINT óPLOT ordenen. En nuestro caso, la orden INK vaseguida de una variable llamada T y que viene yadeterminada por el nivel de juego seleccionadopreviamente en el menú principal. La variable Trepresenta el sector y puede adoptar valores entre 1y 4. Como verás, a ese valor contenido en la variableT le hemos sumado 2 unidades para conseguir unrango de colores más adecuado (más visibles), deforma que del rango de 1 a 4 hemos pasado a otro de3 a 6. Este pequeño detalle nos sirve para diferenciarlas colores que se mostrarán en pantalla en funcióndel nivel de juego y usados con ingenio puedencontribuir a mejorar la experiencia del jugador. Lasórdenes restantes BRIGHT 0 e INVERSE 1complementa también la orden PRINT desactivando

54 de 78

Page 55: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

el brillo (solo puede ser 0 ó 1) y activando la funcióninversa. Ambas admiten solo dos estados. La funciónINVERSE intercambia los colores establecidos parael fondo del texto y el texto en sí. Mira este ejemplo:si activo un color negro para el texto mediante lacorrespondiente orden INK 0 y un color de fondoblanco mediante la orden PAPER 7, a continuacióninvocamos a la función INVERSE 1, el resultado seráéste. ºTras cada punto y coma, vamos pasandovalores a la orden PRINT, los valores entrecomillados se imprimen tal cual, literalmente, y lasvariables, que no van entrecomilladas, se sustituyenpor el valor que posean en ese momento. Ah! otracosa, simpre que usamos punto y coma después deimprimir algo, la siguiente impresión se hace justo acontinuación, sin salto de línea. Si no indicamospunto y coma al final, en la próxima orden PRINT secomienza con un salto de línea o retorno de carro.

Línea 6: Establece el color blanco para tinta (serefiere al texto). La orden PAPER se refiere al fondoo papel. Se activa el brillo. Se inicia un bucle.Bievenidos al maravilloso mundo de la iteración. Losbucles en ZXBASIC son sencillamente geniales ymuy sencillos, en este caso debes tener en cuenta doscosas muy básicas: un bucle se usa para repetir algovarias veces, y todo bucle está formado por dos

55 de 78

Page 56: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

partes, la primera es el FOR....TO en la que seestablecen las características del bucle, y la segundala orden NEXT que cierra el bucle. Todo el códigoque hay entre ambos puntos es lo que se repetirá elnúmero de veces que el bucle indique.

56 de 78

Page 57: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

57 de 78

Page 58: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

58 de 78

Page 59: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

59 de 78

Page 60: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

60 de 78

Page 61: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

En esta sección vamos a estudiar como podemos mejorarla velocidad de nuestro programa simplementepuliendo algunos detalles o, como diría nuestroamigo Juanfra (EMS), abrillantando el código con elpaño mágico. Atento porque, aunque estainformación no venga en los manuales, losresultados te van a resultar poco menos quesorprendentes.

Para nuestro caso, vamos a tomar como código departida una pequeña rutina empleada en nuestrojuego tipo EL CHATARRERO GALÁCTICO y cuyaúnica finalidad consiste en mostrar en la pantalla dejuego los cuerpos celestes o estrellas, simulando asíel firmamento en el que deberá desenvolversenuestro protagonista, de manera que, crono enmano, vamos a intentar mejorar la velocidad de estasencilla rutina. Como verás, he utilizado diferentesestilos de letra (negrita) de forma alternativa en laslíneas del programa para intentar mejorar un poco lalegibilidad del código. Comenzamos:

* OPTIMIZACION DE LA RUTINA CON BUCLE

61 de 78

# 11Técnicas Básicas de Optimización

# 11Técnicas Básicas de Optimización

Page 62: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

UTILIZADA PARA DIBUJAR CUERPOS CELESTESEN EL FIRMAMENTO.

5 PAPER 0: BORDER 0: CLS10 FOR n=1 TO 20011 LET x=INT (RND*29)+112 LET y=INT (RND*19)+115 PRINT AT y,x; INK (RND*4)+3;"'"18 NEXT n20 PRINT "the end!"25 BEEP 1,20

Este trozo de código, prácticamente idéntico al recurridoen nuestro juego tipo, imprime 200 caracteressemigráficos ' (comilla simple) a lo largo de todo elancho y alto de la pantalla, exactamente desde lacoordenada x 1 hasta la 29 (coordenada relativa alancho) y para la coordenada y desde la 1 hasta la 19(coordenada relativa a la altura). Además, estableceun rango aleatorio (mediante la función RND) parael color de la tinta con el que impirmirá la comilla(cuerpo celeste del firmamento) que va de 4 a 7 parautilizar solo los colores más claros de la paleta. Alfinalizar el proceso repetitivo imprime un mensaje enpantalla (the end!) y emite un sonido únicamentepara ardvertirme que el programa ha concluido ydetener el cronómetro. Obviamente hay márgenes deerror, pero son relativamente pequeños y no alteranla finalidad del experimento. De manera que ...

15,5 sg invierte en la ejecución completa de estasencilla rutina nuestro querido Sepectrum,

décima arriba décima abajo.

62 de 78

Page 63: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

Toda nuestra optimización se va a centrar en el bucle,que obviamente es el código que más veces se repiteen la rutina. Así, entramos ya en materiareagrupando todo el código que encierra el bucle (osea, entre el comando FOR y el NEXT) en una únicalínea múltiple en la que separamos las distintasórdenes por : (dos puntos). Aunque no quede tanclaro a la vista suele ahorrar memoria y tambiénalgunos ciclos de procesador. La reagrupación devarias órdenes en líneas múltiples suele ser un buenhábito siempre que se utilice en su justa medida.

5 PAPER 0: BORDER 0: CLS10 FOR n=1 TO 200: LET x=INT(RND*29)+1: LET y=INT(RND*19)+1: PRINT AT y,x; INK RND*4+3;"'": NEXT n

19 BEEP 1,2020 PRINT "the end!"

14,8 sg Bueno, fíjate que con esta sutilmodificación el mismo proceso ya tarda algo

menos. Vale, pensarás que esta primera pasada deplumero no es para lanzar cohetes pero menos dauna piedra. Ahora probemos a prescindir del uso delas variables X e Y (que hemos empleado comovalores de coordenadas para la pantalla) y usamoslos valores directos, de este modo vamos a ahorrarleal procesador dos asignaciones en cada ciclo delbucle. Ya que estamos, suprimimos también lafunción INT que calcula la parte entera de unnúmero ya que no resulta imprescindible para elfuncionamiento correcto de la orden PRINT AT x,y :

63 de 78

Page 64: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

5 PAPER 0: BORDER 0: CLS10 FOR n=1 TO 200: PRINT AT RND*19+1,RND*29+1;INK RND*4+3;"'": NEXT n

19 BEEP 1,2020 PRINT "the end!"

14,2 sg Perfecto. Como estamos usando valoresaleatorios con la orden/comando INK para

conseguir un spectro/rango de colores determinado(del 4 al 7), ahora vamos a tratar de conseguiridéntico efecto a partir de la variable N que no esotra cosa que el valor del bucle que vaincrementando su valor desde 1 a 200. Paraconseguir el rango de valores que necesitamos paralos colores, podemos dividir el valor de N por unnúmero adecuado para que nos de resultados entre 0y 4, a cuyo resultado le sumaremos 3 para hacerlocoincidir con el rango deseado de colores (4 a 7) yque el color inicial nunca sea cero, uno, o dos. Esevalor que necesitamos para dividir el bucle será 50,así, a medida que vaya incrementándose el valor dedel bucle N iremos obteniendo los valores que nosinteresan. Mira los cambios del código siguiente y locomprenderás:

5 PAPER 0: BORDER 0: CLS10 FOR n=1 TO 200: PRINT AT RND*19+1,RND*29+1;INK (n/50)+3;"'":NEXT n

19 BEEP 1,2020 PRINT "the end!"

11,8 sg ¡Vayaaaa!! Esto va pintando bien. Ahoravamos a indicarle al intérprete ZXBASIC que

tanto los valores aleatorios que estamos usando para

64 de 78

Page 65: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

coordenadas como el valor N/50 que obtenemos parael color de los cuerpos celestes del firmamento (y quepuede ser a veces un valor decimal), son del tipoentero. Así comparamos la diferencia de usar a nousar esta función que descarta la parte decimal de unnúmero. Para ésto, usaremos la función INTcombinándola con la función RND. ó directamentedelante del valor que queremos (N/50). Veamos enqué resulta nuestra ocurrencia...

5 PAPER 0: BORDER 0: CLS10 FOR n=1 TO 200: PRINT AT INT(RND*19)+1,INT(RND*29)+1;INK INT(n/50)+3;"'": NEXT n

19 BEEP 1,2020 PRINT "the end!"

11,2 sg ¡¡Buenooooo!! No está mal. En cuatropasadas con nuestro paño mágico y algo de

insistencia hemos logrado reducir el tiempo deejecución de nuestra rutina desde los 15,5 sginiciales a los actuales 11,2 sg . Si crees que no esdemasiado, veamos con una sencilla regla de tres dequé mejora porcentual estamos hablando:

100__________15.5 s (tiempo inicial)

x___________11.2 s (tiempo óptimo)

x = 1120/15.5= 72.6% >>> 100 - 72.6 = 27,4 %

Sinceramente, supongo que igual que yo, pensarás queun mejora del 27,4 % es ya una cifra a tener en

65 de 78

Page 66: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

cuenta, sin embargo, finalmente podríamos inclusooptar por decisiones más drásticas para dar unavuelta de tuerca al código aunque a veces pueda sera costa de perder algo de vistosidad. Al fin y al cabo,tal vez esa pérdida no nos suponga un traumasevero, pero eso es algo que debemos valorar deforma muy meditada para intentar conseguir unresultado lo más equilibrado posible entre velocidady belleza. Veamos pues un ejemplo para que veas deque hablo cuando me refiero a este dilema universal(velocidad-belleza).

Vamos a omitir directamente el spectro/rango de coloraleatorio de los cuerpos celestes y vamos a suponerque el color de los mismos será siempre blanco, esosí, con un atributo de brillo variable, de manera quela mitad de los cuerpos del firmamento tendránatributo de brillo CERO (sin) y la otra mitad brilloUNO (con). No sé si ganaremos algo de tiempo,conozcamos pues qué sentencia esta vez el crono:

5 PAPER 0: BORDER 0: ink 7: CLS10 FOR n=1 TO 200: PRINT AT INT(RND*19)+1,INT(RND*29)+1; BRIGHT INT(n/200);"'": NEXT n

19 BEEP 1,2020 PRINT "the end!"

11,1 sg . Bueno, esto sí es casi insignificante.Aunque tal vez podríamos utilizar una fórmula

de optimización a la que podríamos denominardesdoblamiento y que seguramente nos reportaría

66 de 78

Page 67: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

un mejor tiempo a costa de algo de memoria. Estatécnica del desdoblamiento consiste básicamente endesdoblar el bucle de 200 en dos de 100, de maneraque el primero imprimiría los caracteres con unatributo de brillo 0 (apagado) por ejemplo, y elsegundo bucle con el atributo de brillo a 1(encendido). ¿Qué ventajas ofrece este sistema dedesdoblamiento si hay que escribir más código? Puesestá claro, la ventaja es que podemos dejar fuera delos bucles (antes de la orden FOR) los comandosBRIGHT 0/BRIGHT 1 con la consiguiente ventaja enla velocidad. Seguro que mirando el código loterminas de entender:

5 PAPER 0: BORDER 0: INK 7: CLS: BRIGHT 010 FOR n=1 TO 100: PRINT AT INT (RND*19)+1,INT (RND*29)+1;"'": NEXT n

14 BRIGHT 115 FOR n=1 TO 100: PRINT AT INT (RND*19)+1,INT (RND*29)+1;"'": NEXT n

19 BEEP 1,2020 PRINT "the end!"

10,0 sg ¡¡Voilà!! Ni el crono miente ni misaugurios eran fruto de la sugestión sino del

¡razonamiento lógico computacional! ¡Uy!! ¡Quéchulo ha quedado eso!!. En resumen, con respecto ala versión anterior hemos añadido algo más decódigo (gasto de memoria) pero a cambio hemospodido compactar el código que se repite dentro delbucle y hemos obtenido un beneficio interesante develocidad, además, ¿No se te ocurre alguna manerade reducir un poquito más el código? ¿Por qué no

67 de 78

Page 68: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

compactar un poco más el código metiendo los dosbucles en una única línea múltiple? Tal vez funcioney además ganemos algo de tiempo, veámoslo:

5 PAPER 0: BORDER 0: INK 7: CLS: BRIGHT 010 FOR n=1 TO 100: PRINT AT INT (RND*19)+1,INT (RND*29)+1;"'": NEXT n: BRIGHT 1: FOR n=1 TO 100: PRINT AT INT (RND*19)+1,INT (RND*29)+1;"'": NEXT n

19 BEEP 1,2020 PRINT "the end!"

9,6 sg Pues sí, eso de meter varios comandos enuna única línea parece resultar siempre bastante

efectivo. Ahora que conocemos esta técnica dedesdoblamiento podría emplearse perfectamentepara dibujar cuerpos celestes en varios colores o enotras muchas situaciones.

Y ya para acabar, vamos a probar con algo mucho másdrástico como es omitir directamente el atributo decolor/brillo de los cuerpos celestes y dejarlos convalor único establecido con anterioridad al inicio delbucle:

5 PAPER 0: BORDER 0: INK 7: BRIGHT 1:CLS10 FOR n=1 TO 200: PRINT AT INT(RND*19)+1,INT(RND*29)+1;"'": NEXT n

19 BEEP 1,2020 PRINT "the end!"

9,3 sg Anque solo hemos rebajado unas pocasdécimas, esta es la opción por la que me decanté

finalmente para nuestro juego tipo, entre otras cosas,porque luego nos puede facilitar el método

68 de 78

Page 69: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

empleado para que nuestro protagonista puedapasar sobre los cuerpos celestes sin borrarlos. Todoesto está explicado en la sección de Análisis Profundodel Código línea a línea.

Llegados a este punto, veamos como ha mejorado lavelocidad de nuestro sencillo algoritmo "dibujafirmamento" de una forma más visual. En lasiguiente gráfica puede apreciarse la evolución de lasdistintas fases de la optimización (desde la cero oestado inicial hasta la 8), los tiempos deprocesamiento se muestran en segundos (color azul)mientras que las mejoras obtenidas en porcentaje encada fase de la optimización (con respecto al estadoinicial) se muestran en las columnas rojas.

69 de 78

BENCHMARK de optimización de algoritmo ZXBASIC

0 1 2 3 4 5 6 7 80

5

10

15

20

25

30

35

40

45

50

15,5 14,8 14,2 11,8 11,2 11,1 10 9,6 9,3

0 4,52 8,39

23,87 27,74 28,3935,48 38,06 40

OPTIMIZACION CÓDIGO ZXBASIC algoritmo DIBUJA FIRMAMENTO

Mejora obtenida

Tiempo en s.Fases de la optimizaciónT

iem

po

inve

rtid

o e

n s

g. y

% d

e m

ejo

ra o

bte

nid

a

Page 70: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

Nunca se sabe que sorpresas puede depararnos laoptimización con un buen paño abrillantador;) peronunca olvides que todas estas mejoras yoptimizaciones que consigamos sobre nuestroprograma se beneficiarán aún más al pasar nuestrotrabajo por el compilador MCODER3 (o el quehayamos elegido). Piensa que todo este retorcimientodel código llevará a nuestro desarrollo al límite delrendimiento y puede acabar marcando la diferenciaen cuanto a la calidad técnica de nuestro juego. Porello, particularmente recomendaría hacerlas porcostumbre, pero sobre todo con los procesos demayor carga

70 de 78

Page 71: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

En la sección de ANEXOS voy a incluir algunas cositasinteresantes que facilitarán nuestro trabajo. Esto es loque he preparado:

Plantilla de pantalla en baja resolución.

Plantilla de pantalla en alta resolución.

Plantillas de sprites GDUs de 8x8 píxeles.

Directorio de enlaces útiles.

Glosario retromaníaco de ZX-Spectrum.

71 de 78

#xxAnexos

#xxAnexos

Page 72: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

72 de 78

Page 73: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

73 de 78

Page 74: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

74 de 78

Page 75: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

75 de 78

Page 76: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

76 de 78

Page 77: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

77 de 78

Page 78: GUÍA RÁPIDA #01 DESARROLLO DE VIDEOJUEGOS PARA … · Lo cierto, es que andaba yo trasteando estos viejos cacharros con esa pasión característica propia de cualquier retro-nostálgico

http://calentamientoglobalacelerado.net/zxopensource

78 de 78