Nuclear Invaders para ZX-Spectrum
-
- Amiga 1200
- Mensajes: 1393
- Registrado: 23 Dic 2008, 17:53
- Sistema Favorito: MSX
- primer_sistema: ZX81
- Primera consola: Atari 2600
- Gracias dadas: 3 veces
- Gracias recibidas: 20 veces
Nuclear Invaders para ZX-Spectrum
EL JUEGO
Vuelven los invasores del espacio!!!
En el año 1977 intentaron invadir las ciudades de la tierra, y fracasaron.
Ahora vuelven con un malvado plan: destruir las centrales nucleares para dejar el planeta inhabitable.
Con la ayuda de nuestro tanque debemos evitar que cumplan con su objetivo.
Cada nivel lo componen 30 invasores, y al superarlo aparecerá una central más grande y los invasores deberán recorrer menos distancia para llegar a ella.
Destruye el UFO que aparece por la parte superior para conseguir puntos extras.
Pulsa “ENTER” en la pantalla de presentación para empezar la partida.
Descargar el juego en formato ".SNA":
Descargar el juego en formato ".WAV":
http://www.scainetsoft.com/download/software/NuclearInvaders_WAV.rar
BLOQUES
He dividido el listado en 13 bloques:
- Declaración de matrices.
- Control de nuestro tanque.
- Control de nuestro disparo.
- Mover UFO.
- Mover invasores.
- Destruir enemigo ó UFO.
- Pasar Nivel.
- Perder una vida / Fin juego.
- Presentación.
- Mostrar pantalla de juego.
- Cargar rutina código máquina, redefinir gráficos UDG y inicializar variables y matrices del juego.
- Rutinas varias.
- Bloque de código máquina y gráficos.
COMO FUNCIONA
Todo el programa ocupa 83 líneas.
A continuación indico el principio de las distintas partes del programa:
10 - Definimos las matrices del juego.
30 – Llamada a rutinas para leer gráficos (3000), mostrar presentación(2000).
100 – Comprobamos si se ha de mover nuestro tanque.
130 – Si hay un disparo en pantalla lo movemos, sino miramos si se ha pulsado disparo (ENTER).
170 – Si hay un UFO en pantalla lo movemos, sino decrementamos el contador (W).
200 – Rutina de movimiento de invasores. Se mueve uno distinto en cada pasada. Primero miramos si todavía hay invasores en la posición correspondiente (3 por posición), sino hay, salimos. Si tiene alguna velocidad asignada lo movemos, y sino mediante un número aleatorio decidimos si se ha de empezar a mover. Durante el movimiento cambiamos su animación y miramos si ha llegado a la central nuclear.
250 – Contador del próximo invasor a mover (M).
260 – Volvemos a la línea 100.
300 - Código de pasar nivel. Se ejecuta cuando destruimos los 30 invasores. Se incrementa el control de dificultad (C) que indicará la anchura de la central nuclear.
400 – Esta rutina se ejecuta cuando el disparo detecta que ha tocado algo (en 160). Aquí se calcula si se ha tocado un invasor o el UFO y actúa en consecuencia. En 410 se destruye un invasor y en 450 se destruye el UFO.
440 - Si se han destruido todos los invasores (T=0) saltamos a la línea 300 para pasar de nivel.
500 – Rutina que se ejecuta cuando un invasor llega a la central nuclear. Se reproduce un sonido y se borra una vida. Si quedan vidas volvemos a empezar el nivel y sino vamos a la pantalla de presentación después de una pausa.
2000 – Pantalla de presentación del juego.
2100 – Borrado de la pantalla de presentación y muestra el mensaje al jugador uno para que esté listo
2500 - Se dibuja la central nuclear con un ancho en función del nivel de dificultad.
2800 – Posiciona y muestra a los invasores y nuestro tanque en pantalla. Reinicia el valor de ciertas variables.
3000 – Borra la pantalla y muestra la pantalla de instrucciones.
3020 – Carga y ejecuta la rutina en código máquina que nos permite redefinir el juego de caracteres.
3025 – Redefinimos los 21 UDG que permite el sistema.
3028 – Redefinimos 5 caracteres más: Los 4 que forman los barriles y el disparo.
3040 – Cargamos las animaciones de los distintos invasores y su puntuación.
3045 – Guardamos las explosiones y la pared de la nuclear.
5000 – Rutina para imprimir un número en un marcador. Pasar el valor en (I) y la posición en (N).
5100 – Rutina de pausa. Pasar el valor en (N). Se prescinde de PAUSE para evitar que se anule al pulsar una tecla.
5200 – Rutina de borrado de parte de la pantalla, respetando los marcadores superiores y inferiores.
8900 – Datos de la rutina en código máquina que duplica el juego de caracteres.
9000 – Datos de los gráficos UDG del juego. 26 en total.
9600 – Datos de los invasores según posición y animación.
EL LISTADO
APUNTES FINALES
Esta versión se ha realizado a partir del listado de la versión del ORIC-1 y los gráficos de la versión de MSX/JUPITER ACE.
Dado que mi primer SPECTRUM fue un INVES+, nunca había programado en un gomas, y me habían limitado a usarlo solo para jugar. La verdad es que es una experiencia agradable ya que el teclado es bastante fiable y como no, muy blandito.
Diferencias entre SPECTRUM y ORIC
La adaptación desde la versión de ORIC ha sido bastante sencilla y rápida. Estás son las principales diferencias:
- Aquí hay que definir e inicialicen las variables.
- PRINT AT equivale al PLOT y los parámetros van invertidos.
- SCREEN$ equivale a SCR.
- Al pasar de una resolución de 40x25 a 32x22 (es un lío
usar las últimas dos filas) he aprovechado el formato de la
versión del JUPITER ACE.
- Para el sonido se usa BEEP, y como siempre es muy simple.
- Al no poder usar ELSE alguna línea se ha tenido que partir en dos y he usado un GOTO para evitar la segunda parte.
- Respecto a los gráficos, al igual que en ORIC es muy sencillo redefinirlos, pero al estar limitado a 21 he tenido que usar
una rutina en código máquina. Aquí son de 8x8 pixels y no de 6x8 y he usado del MSX y el JUPITER ACE.
A diferencia de la versión de JUPITER ACE que “dificultaba” el apuntar, para el tanque se han usado 3 UDG. De esta forma la parte del cañón está en medio de un gráfico y no desplazado a la derecha. Esto afecta al marcador inferior de vidas ya que los tanques están más separados. En MSX al usar SPRITES no tenía este problema.
El bucle principal de desarrollo va de la línea 100 hasta la 260, 20 líneas en total. Aquí se controla el tanque, el disparo, el UFO y un invasor. Como el proceso es rápido, todo se mueve de forma bastante fluida. Tenía mis dudas sobre el rendimiento de esta versión pero se deja jugar perfectamente.
Para detectar si el disparo toca algún enemigo, antes de mostrar el disparo en su nueva posición miro si hay algo, y en caso afirmativo salto a la línea 400. Aquí compruebo por posición vertical si es el UFO o un invasor, que por posición vertical calculo la fila y por posición horizontal la columna. Un detalle que ya vi en el juego “GALAXY WARS” es que para el SPECTRUM los 21 UDG definibles (de “A” a “U”) tienen el mismo código ASCII. Esto puede supiner un problema en otros juegos.
En esta versión muestro una pantalla previa de instrucciones donde indico las teclas de control. Mientras, se van redefiniendo los gráficos e inicializando algunas matrices y variables.
En el tema del sonido, en el que soy un perfecto inútil, he optado por usar sencillos pitidos más propios de una Game&Watch de Nintendo. Así no afecta al rendimiento.
Conseguir UDG extras
La principal dificultad que me he encontrado es que el juego necesita redefinir 26 gráficos y por defecto el SPECTRUM solo permite redefinir 21. Para evitar este problema he usado una pequeña rutina en código máquina que programé en 1990 y que simplemente realiza un duplicado del juego de caracteres desde su posición inicial en la ROM (dirección 15360) a una zona reservada de la RAM a partir de la dirección 60000. Para ello bajo el RAMTOP hasta esa posición con CLEAR 59999.
La rutina en CM empieza en la posición 63000 y se puede llama con un RANDOMIZE USR 63000. Con esto se realiza la copia de los caracteres y se cambia el valor de la variable de sistema (dirección 23606 y 23607) que indica donde está el juego de caracteres. De esta forma usa nuestros caracteres y no los originales de la ROM.
Con una llamada a RANDOMIZE USR 63022 volvemos a activar los caracteres de la ROM restaurando el valor de la variable de sistema, ya que según los caracteres que se redefinan afectaría a la presentación de los listados. De todas formas la copia de los caracteres se mantiene en memoria y se puede volver a activar en cualquier momento con un RANDOMIZE USR 63011.
Para este juego he usado los 21 UDG que permite por defecto el sistema y 5 más, aprovechando caracteres de improbable uso durante la programación. Con esto puedo listar el programa y hacer que todo se vea bien.
Y como siempre…
Para terminar, todo este desarrollo se ha programado en un SPECTRUM 48K original, conectado por RF a un televisor de 15”, usando un COMPUTONE como medio de almacenamiento y una ZX-PRINTER para imprimir el listado y los pantallazos.
Os invito a probarlo.
Buscando la IP de la W.O.P.R.
- zup
- Amiga 2500
- Mensajes: 3012
- Registrado: 04 Sep 2009, 20:07
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: Nintendo DS/3DS
- Primera consola: Nintendo GameBoy
- Ubicación: Navarra
- Gracias dadas: 86 veces
- Gracias recibidas: 356 veces
- Contactar:
Re: Nuclear Invaders para ZX-Spectrum
POKE 23611,204 --> Para que los 128k no la líen parda y empiecen a imprimir PLAY y SPECTRUM por ahí.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!
Además vendo cosas!
-
- Amstrad PCW 8256
- Mensajes: 150
- Registrado: 05 Oct 2012, 17:42
- Sistema Favorito: Commodore Amiga
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: Nintendo GameBoy
- Primera consola: Atari 2600
- Gracias dadas: 8 veces
- Gracias recibidas: 2 veces
Re: Nuclear Invaders para ZX-Spectrum
Acabo de probarlo y me ha encantado.
Viendo éste y otros de tus juegos me parece increíble cómo llegas a exprimir el BASIC de estas máquinas tan limitadas.
Enhorabuena, dancresp.
Viendo éste y otros de tus juegos me parece increíble cómo llegas a exprimir el BASIC de estas máquinas tan limitadas.
Enhorabuena, dancresp.
-
- Amiga 1200
- Mensajes: 1393
- Registrado: 23 Dic 2008, 17:53
- Sistema Favorito: MSX
- primer_sistema: ZX81
- Primera consola: Atari 2600
- Gracias dadas: 3 veces
- Gracias recibidas: 20 veces
Re: Nuclear Invaders para ZX-Spectrum
zup escribió:POKE 23611,204 --> Para que los 128k no la líen parda y empiecen a imprimir PLAY y SPECTRUM por ahí.
¿Como?
Lo acabo de probar en un emulador en modo 128K y funciona bien.
¿Que se supone que pasa?
oscarbraindead escribió:Acabo de probarlo y me ha encantado.
Viendo éste y otros de tus juegos me parece increíble cómo llegas a exprimir el BASIC de estas máquinas tan limitadas.
La verdad es que es la gracia de estos proyectos: intentar exprimir su BASIC al límite.
Buscando la IP de la W.O.P.R.
- NeilParsons
- Amiga 1200
- Mensajes: 1281
- Registrado: 02 Ago 2007, 16:47
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: C64
- consola_favorita: Sony PlayStation 1
- Ubicación: Digamos que del sur, en frente del peñón.
- Gracias dadas: 3 veces
Re: Nuclear Invaders para ZX-Spectrum
Lo probaré el lunes, pues el domingo no tendré mucho tiempo para ver todo lo que he ido pillando de fuera.
En cuanto al POKE en cuestión para los 128k, supongo que será porque utiliza todos los caracteres GDU y ya se sabe lo que ocurre si algún gráfico usa los caracteres GDU "T" y "U", que se corresponden precisamente con los comandos mencionados en modo 128k. ¿O no es así? No lo sé, solo pregunto.
En cuanto al POKE en cuestión para los 128k, supongo que será porque utiliza todos los caracteres GDU y ya se sabe lo que ocurre si algún gráfico usa los caracteres GDU "T" y "U", que se corresponden precisamente con los comandos mencionados en modo 128k. ¿O no es así? No lo sé, solo pregunto.
- zup
- Amiga 2500
- Mensajes: 3012
- Registrado: 04 Sep 2009, 20:07
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: Nintendo DS/3DS
- Primera consola: Nintendo GameBoy
- Ubicación: Navarra
- Gracias dadas: 86 veces
- Gracias recibidas: 356 veces
- Contactar:
Re: Nuclear Invaders para ZX-Spectrum
Sí, exactamente.
Hay un bit en la variable del sistema FLAGS que controla cómo funciona la rutina de impresión de la ROM. En modo 128k cuando se topa con lo caracteres 163 y 164, imprime los tokens SPECTRUM y PLAY; en modo 48k imprime los caracteres gráficos T y U. En concreto, creo que se trata del bit 4 (1=128, 0=48), pero dentro de la variable FLAGS hay más bits que pueden fastidiar.
En la mayoría de juegos BASIC que emplean estos caracteres, basta con hacer ese POKE al principio del programa para evitar ese "fallo" de los 128k; en algunos que emplean algo de c/m puede ser necesario alguna medida más agresiva.
Hay un bit en la variable del sistema FLAGS que controla cómo funciona la rutina de impresión de la ROM. En modo 128k cuando se topa con lo caracteres 163 y 164, imprime los tokens SPECTRUM y PLAY; en modo 48k imprime los caracteres gráficos T y U. En concreto, creo que se trata del bit 4 (1=128, 0=48), pero dentro de la variable FLAGS hay más bits que pueden fastidiar.
En la mayoría de juegos BASIC que emplean estos caracteres, basta con hacer ese POKE al principio del programa para evitar ese "fallo" de los 128k; en algunos que emplean algo de c/m puede ser necesario alguna medida más agresiva.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!
Además vendo cosas!
- zitror
- Amiga 2500
- Mensajes: 5349
- Registrado: 02 Jul 2006, 00:16
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- Ubicación: El interior de un Z80
- Gracias dadas: 248 veces
- Gracias recibidas: 104 veces
- Contactar:
-
- Amiga 1200
- Mensajes: 1393
- Registrado: 23 Dic 2008, 17:53
- Sistema Favorito: MSX
- primer_sistema: ZX81
- Primera consola: Atari 2600
- Gracias dadas: 3 veces
- Gracias recibidas: 20 veces
Re: Nuclear Invaders para ZX-Spectrum
zup escribió:Hay un bit en la variable del sistema FLAGS que controla cómo funciona la rutina de impresión de la ROM. En modo 128k cuando se topa con lo caracteres 163 y 164, imprime los tokens SPECTRUM y PLAY; en modo 48k imprime los caracteres gráficos T y U. En concreto, creo que se trata del bit 4 (1=128, 0=48), pero dentro de la variable FLAGS hay más bits que pueden fastidiar.
En la mayoría de juegos BASIC que emplean estos caracteres, basta con hacer ese POKE al principio del programa para evitar ese "fallo" de los 128k; en algunos que emplean algo de c/m puede ser necesario alguna medida más agresiva.
Pues mira, no te acostarás sin saber algo más.
Gracias por la información, que no deja de ser interesante.
Sea como sea, el problema sería fácilmente solucionable ya que con la rutina en C.M. se puede redefinir las minúsculas, por ejemplo, y no usar los UDG. Pero al listar es más guarrete.
Y celebro que os guste. La verdad es que el BASIC del Spectrum tira más que bien.
Buscando la IP de la W.O.P.R.
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados