Programando NUCLEAR INVADERS para MSX
-
- 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
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):
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
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.
Buscando la IP de la W.O.P.R.
- mentalthink
- Amiga 2500
- Mensajes: 2840
- Registrado: 11 Abr 2010, 15:06
- Gracias dadas: 45 veces
- Gracias recibidas: 14 veces
Re: Programando NUCLEAR INVADERS para MSX
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...!!!
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...!!!
Re: Programando NUCLEAR INVADERS para MSX
Vaya un crack programando en Basic.
Tremendo.
. Hay que cuidarlo para que siga "pariendo" más cosas de estas.
Tremendo.

-
- 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
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.
. Hay que cuidarlo para que siga "pariendo" más cosas de estas.
Gracias !!!

Dame unos días y irás viendo...
Buscando la IP de la W.O.P.R.
- Lex Sparrow
- 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
¡Muchas gracias por compartirlo! 

Alejandro - Lex Sparrow | M |
- 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: Programando NUCLEAR INVADERS para MSX
zitror escribió:Fantástico el juego y fantástico el Spectravideo
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.
- xgipe
- 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
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
Found: WIN3.11
- 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:
Re: Programando NUCLEAR INVADERS para MSX
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"

Salu2

-
- Amstrad PCW 8256
- Mensajes: 202
- Registrado: 13 Ago 2012, 12:13
- Gracias recibidas: 61 veces
Re: Programando NUCLEAR INVADERS para MSX
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.
Proyecto Base de datos de recreativas españolas: Recreativas Database.
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados