Programando NUCLEAR INVADERS para MSX

Foro dedicado a la programación en todo tipo de sistemas clásicos.
dancresp
Amiga 1200
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

Programando NUCLEAR INVADERS para MSX

Mensajepor dancresp » 07 Nov 2012, 13:48

1334246216_35_FT17985_sin_ttulo-2.gif
1334246216_35_FT17985_sin_ttulo-2.gif (3.28 KiB) Visto 12298 veces


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 disparo en la pantalla de presentación para seleccionar los controles.

Descargar fichero WAV para cargar en el original:
NuclearInvaders.rar


Descargar fichero CAS (gentileza de xgipe para cargar con CLOAD):
NuclearInvaders_cas.rar
(2.32 KiB) Descargado 847 veces


BLOQUES
He dividido el listado en 14 bloques:

- Declaración de las matrices.
- Control de nuestro tanque.
- Control de nuestro disparo.
- Mover UFO.
- Mover invasor.
- Destruir enemigo ó UFO.
- Perder una vida.
- Pasar Nivel.
- Presentación.
- Mostrar pantalla de juego.
- Cargar gráficos. SPRITES y UDG.
- Inicializar variables y matrices del juego.
- Rutinas varias.
- Bloques de gráficos.


COMO FUNCIONA
Todo el programa ocupa 73 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) y posicionar gráficos y SPRITES (4000).
100 – Comprobamos si se ha de mover nuestro tanque, cambiando su posición horizontal mediante un VPOKE.
140 – Si hay un disparo en pantalla lo movemos, sino miramos el estado del disparador.
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 nivel), 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 – Después de cada ciclo de 10 invasores controlados hacemos el sonido de movimiento correspondiente.
300 – Si no se han destruido todos los invasores (T) volvemos a 100, y si no quedan saltamos a 600.
400 – Esta rutina se ejecuta automáticamente cuando dos SPRITES colisionan, a nivel de píxel. 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 460 se destruye el UFO.
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.
600 – Rutina 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.
2000 – Pantalla de presentación del juego.
2100 – Bucle de detección de controlador. Comprueba el estado de la barra de espacio o de los dos posibles joysticks. Al disparar se guarda el control en la variable (G).
2110 – Borrado de la pantalla de presentación. Mensaje al jugador uno para que esté listo y se dibuja la central nuclear.
3000 – Cargamos los gráficos desde las líneas DATA a la VRAM. Primero se cargan los SPRITES y después los UDG.
4000 – Rutina que se encarga de inicializar la posición de los invasores, UFO y tanque en pantalla. En las matrices se guardan los siguientes datos de los invasores: gráfico correspondiente (B), posiciones iniciales (X e Y), velocidad (S), invasores por posición (Q), puntuaciones (G) y estado de animación (A).
5000 – Rutina para imprimir un número en un marcador. Pasar el valor en (I). Posicionar previamente con un LOCATE.
5100 – Rutina de pausa. Pasar el valor en (N).
5200 – Rutina de borrado de parte de la pantalla, respetando los marcadores superiores y inferiores.
5300 – Borrar todos los SPRITES de pantalla, colocando su posición vertical a 209.
5500 – Al pulsar “CTRL+STOP” se ejecuta esta rutina que nos devuelve al modo texto del SCREEN 0.
9000 – Datos de los SPRITES del juego.
9200 – Datos de los UDG del juego.


EL LISTADO
20120412132607701_0001.jpg
20120412132607701_0001.jpg (210.89 KiB) Visto 12298 veces


APUNTES FINALES
A finales del 2011 hice una versión de este juego para el DRAGON 32. Era más simple debido a las limitaciones de este sistema. No podía poner los marcadores en pantalla porque no lo permite en modo alta resolución desde BASIC. Había un único tipo de invasor, el movimiento era más brusco ya que no maneja SPRITES, y por rendimiento tuve que aparcar el UFO. Total, que me quedó la sensación de que se podía hacer mejor en otro sistema, y no tenía ninguna duda que el sistema perfecto sería el MSX. El resultado me da la razón.

La principal dificultad del juego ha consistido en conseguir una buena velocidad de ejecución, teniendo en cuenta que el juego original no es especialmente rápido. Afortunadamente este sistema nos permite usar distintas técnicas que nos facilitan la tarea y el juego es más rápido.

La pantalla de presentación es un “duplicado” de la del juego original, excepto por el cambio del nombre del juego. La forma de presentación es distinta ya que aquí se muestra todo de golpe y no letra a letra.

Los SPRITES del MSX pueden ser de 8x8 y de 16x16. En el juego he usado gráficos de 16x8. La rutina de carga de los gráficos está adaptada para no tener que pasar los datos de la mitad inferior de cada gráfico. Así ahorro memoria y se cargan más rápidamente.

El bucle principal de desarrollo va de la línea 100 hasta la 300, 15 líneas en total. Aquí se controla el tanque, el disparo, el UFO y un invasor. Como el proceso es tan rápido, parece que todo se mueve de forma fluida.

He activado el modo SPRITE ON para detectar automáticamente la colisión entre SPRITES. Con el ON SPRITE GOSUB 400 el programa salta a la línea 400 cada vez que dos SPRITES colisionan, a nivel de pixel. Como por posición es imposible que los enemigos colisionen entre si, cuando sucede es porque les ha tocado un disparo. En la línea 400 compruebo por posición vertical si es el UFO, y sino, es un invasor que por posición vertical calculo la fila y por posición horizontal la columna. Ni que decir que esto nos ahorra un montón de cálculos y tiempo de proceso ya que es proceso automático del que se encarga el chip de video del MSX.

Para el tema de sonido, en el que soy un perfecto inútil, he usado el comando PLAY, que convenientemente modificada la forma de la onda y la modulación cumplen con su cometido. De todas formas, me habría gustado que sonara el sonido auténtico aunque creo que desde BASIC no habría sido factible, en cuanto a rendimiento.

He activado el modo STOP ON para que detecte automáticamente si se hace un “CTRL+STOP” y salir del juego para ver el código.

He eliminado todos los cálculos posibles, especialmente multiplicaciones y divisiones, y todos los AND/OR posibles. Uso un IF y si no se cumple ya no tengo que comprobar más valores.

Otro método básico consiste en usar, siempre que sea posible, variables enteras (con el %) ya que la velocidad de cálculo aumenta un 20% aprox.

Pues eso es todo. A pesar de estar programado completamente en BASIC, el juego ha conseguido una velocidad muy decente, y se deja jugar perfectamente. Eso si, mi cruz sigue siendo el sonido.


Y como siempre…

Para terminar, todo este desarrollo se ha programado en un MSX SPECTRAVIDEO SVI-728. El listado se ha impreso en una impresora matricial BROTHER M-1109. A lo retro, como dios manda.


Os invito a probarlo.

110420122716.jpg
110420122716.jpg (38.8 KiB) Visto 12298 veces

1334246216_35_FT17985_sin_ttulo-1.gif
1334246216_35_FT17985_sin_ttulo-1.gif (2.24 KiB) Visto 12298 veces

110420122721.jpg
110420122721.jpg (30.68 KiB) Visto 12298 veces

110420122722.jpg
110420122722.jpg (27.15 KiB) Visto 12298 veces
Buscando la IP de la W.O.P.R.

Avatar de Usuario
mentalthink
Amiga 2500
Amiga 2500
Mensajes: 2840
Registrado: 11 Abr 2010, 15:06
Gracias dadas: 45 veces
Gracias recibidas: 14 veces

Re: Programando NUCLEAR INVADERS para MSX

Mensajepor mentalthink » 07 Nov 2012, 19:44

Como molan las capturas... aunque son dos colores solo, la verdad es que está chulo... Y en Basic no?¿...

Ya podríamos hacer un concurso de Juegos en basic... que es totalmente accesible a todos y reírnos un ratillo de los juegos que nos salgan... Venga a ver si nos animamos...!!!

Tolvatar
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 569
Registrado: 02 Mar 2010, 08:28

Re: Programando NUCLEAR INVADERS para MSX

Mensajepor Tolvatar » 07 Nov 2012, 21:20

Vaya un crack programando en Basic.
Tremendo.
<rX . Hay que cuidarlo para que siga "pariendo" más cosas de estas.

dancresp
Amiga 1200
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: Programando NUCLEAR INVADERS para MSX

Mensajepor dancresp » 07 Nov 2012, 22:18

mentalthink escribió:Como molan las capturas... aunque son dos colores solo, la verdad es que está chulo... Y en Basic no?¿...

He respetado el original, que yo siempre lo vi en dos colores.

Y si, 100% BASIC.
Las imágenes son bonitas, pero verlo en movimiento nos demuestra de lo que es capaz el BASIC y el hardware de los MSX.


Tolvatar escribió:Vaya un crack programando en Basic.
Tremendo.
<rX . Hay que cuidarlo para que siga "pariendo" más cosas de estas.

Gracias !!! :oops:

Dame unos días y irás viendo...
Buscando la IP de la W.O.P.R.

Avatar de Usuario
Lex Sparrow
Amiga 2500
Amiga 2500
Mensajes: 2776
Registrado: 28 Dic 2005, 12:26
Sistema Favorito: Amstrad CPC
primer_sistema: Amstrad CPC
consola_favorita: Nintendo NES/Clónica
Primera consola: TV Games/Pong Clone
Gracias dadas: 187 veces
Gracias recibidas: 45 veces
Contactar:

Re: Programando NUCLEAR INVADERS para MSX

Mensajepor Lex Sparrow » 08 Nov 2012, 07:03

¡Muchas gracias por compartirlo! :winner
Alejandro - Lex Sparrow | M |

Avatar de Usuario
zitror
Amiga 2500
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:

Re: Programando NUCLEAR INVADERS para MSX

Mensajepor zitror » 08 Nov 2012, 19:48

Fantástico el juego y fantástico el Spectravideo :D
(C) 1.982 Sinclair Research Ltd

La buhardilla de Zitror

dancresp
Amiga 1200
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: Programando NUCLEAR INVADERS para MSX

Mensajepor dancresp » 08 Nov 2012, 20:31

zitror escribió:Fantástico el juego y fantástico el Spectravideo :D


Os animo a probarlo en el original o emulador.

Alucinar con lo que se puede hacer con el BASIC de los MSX, y el rendimiento del programa.
Buscando la IP de la W.O.P.R.

Avatar de Usuario
xgipe
Atari 1040 STf
Atari 1040 STf
Mensajes: 941
Registrado: 26 May 2010, 15:59
Sistema Favorito: MSX
primer_sistema: MSX
consola_favorita: Sega Master System
Primera consola: Videopac
Ubicación: Ankh-Morpork
Gracias dadas: 88 veces
Gracias recibidas: 69 veces

Re: Programando NUCLEAR INVADERS para MSX

Mensajepor xgipe » 09 Nov 2012, 15:14

Tengo una pequeña aportación, en forma de carátula de cinta. Lo que pasa es que no sé como adjuntarla... :?:
BLOAD "CAS:",R
Found: WIN3.11

Avatar de Usuario
zitror
Amiga 2500
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:

Re: Programando NUCLEAR INVADERS para MSX

Mensajepor zitror » 09 Nov 2012, 20:59

xgipe escribió:Tengo una pequeña aportación, en forma de carátula de cinta. Lo que pasa es que no sé como adjuntarla... :?:


Fácil. Pica en la pestaña "Subir adjunto" que está justo debajo cuando escribes el post al lado de "opciones". Busca el archivo de imagen en tu ordenador y pulsa "Agregar archivo" :ugeek:

Salu2 ;)
(C) 1.982 Sinclair Research Ltd

La buhardilla de Zitror

davebizarro
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 202
Registrado: 13 Ago 2012, 12:13
Gracias recibidas: 61 veces

Re: Programando NUCLEAR INVADERS para MSX

Mensajepor davebizarro » 11 Dic 2012, 19:18

molaria verlo en cartucho para el MSX y por que no, para la Coleco tambien.
Retrolaser Blog: Retrolaser.es
Proyecto Base de datos de recreativas españolas: Recreativas Database.


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 10 invitados