Programando FUNGALOIDS 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 FUNGALOIDS para MSX

Mensajepor dancresp » 08 Nov 2012, 15:26

1332415294_35_FT0_fungaloids_.jpg
1332415294_35_FT0_fungaloids_.jpg (22.2 KiB) Visto 4525 veces


EL JUEGO
El juego original se publico en el año 1982 y fue programado en un ZX-81.

El objetivo del juego consiste en destruir los Fungaloids, una plantas que van creciendo, antes que lleguen a la parte superior de la pantalla.
Estas plantas disparan unas esporas que nos destruirán si nos alcanzan. La misma suerte corremos si chocamos con las plantas o los distintos enemigos que hay en el área de juego.

Nuestra nave tiene una capacidad limitada de combustible y munición, y periódicamente debemos repostar en las zonas correspondientes.

Al destruir todos los segmentos de los Fungaloids pasamos de nivel y aumenta la dificultad.

Descargar fichero WAV para cargar en el original:
http://www.publicidadz.es/temp/download/fungaloids.zip

Descargar fichero CAS (gentileza de xgipe para cargar con CLOAD):
1332497408_144_FT17361_fungaloids.rar
(2.12 KiB) Descargado 296 veces


BLOQUES
He dividido el listado en 11 bloques:

- Declaración de variables e inicio del juego.
- Control de nuestra nave.
- Mover enemigos.
- Control del disparo.
- Control del proyectil enemigo.
- Pasar Nivel.
- Final del Juego.
- Presentación.
- Mostrar pantalla de juego
- Rutinas varias.
- Bloques de gráficos y datos.


COMO FUNCIONA
Todo el programa ocupa 75 líneas.
A continuación indico el principio de las distintas partes del programa:

10 - Definimos las matrices del juego.
110 - Usamos un ON GOTO para comprobar si hay que mover la nave. En caso de movimiento vertical, controlamos la altura y posición para ir a las rutinas de repostar combustible (4100) ó munición (4200).
200 - Código que decide que enemigo hemos de mover: 0- Barrera de energía, 1- Naves enemigas, 2- Fungaloids.
210 - Rutina de movimiento de la barrera de energía.
230 - Rutina de movimiento de una de las tres naves.
260 - Rutina de movimiento de uno de los seis Fungaloids.
300 - Control de nuestro disparo.
370 - Control de disparo del Fungaloid.
500 - Miramos los 3 caracteres que hay debajo de nuestra nave. Si no son espacios, la suma es distinta de 96, y significa que hemos chocado con algo y se salta al final del juego, sino se vuelve al principio del bucle.
600 - Final de partida.
700 - Pasar nivel.
900 - Actualizamos la posición de los SPRITES de nuestra nave.
1000 - Inicializamos las variables del juego.
2000 - Pantalla de presentación.
2100 - Dibujamos la zona de juego.
3000 - Rutina de lectura de gráficos definidos y SPRITES.
4000 - Subrutina que espera a que se pulse una tecla.
4100 - Subrutina para repostar combustible.
4200 - Subrutina para repostar munición.
9000 - Datos de los gráficos UDG y SPRITES, y tabla de colores para los UDG.
9300 - Datos de la posición inicial de los Fungaloids.


EL LISTADO
1332415294_35_FT0_fungaloids_listado.jpg
1332415294_35_FT0_fungaloids_listado.jpg (224.36 KiB) Visto 4525 veces



APUNTES FINALES
La principal dificultad del juego ha consistido en conseguir una buena velocidad de ejecución. Hay que tener el cuenta que el original está programado en código máquina, y para esta versión de MSX me he limitado a usar BASIC. Afortunadamente este sistema nos permite usar distintas técnicas que nos facilitan la tarea y el juego es más rápido.

El bucle principal se repite hasta que perdemos la única vida de que disponemos, de todas formas, en cada pasada solo movemos uno de los enemigos, que se selecciona de forma aleatoria. Al hacerlo así hemos conseguido que el bucle se repita varias veces por segundo con lo que le da sensación de fluidez.

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.

Para la nave he usado dos SPRITES de 8x8, puestos uno al lado del otro. Solo se actualiza esta posición si he movido la nave. De todas formas, estos SPRITES ocupan el espacio de 3 caracteres de la pantalla (como el juego original). Para ello los he desplazado 4 pixels a la derecha. De esta forma tenemos más posibilidades de colisionar, pero con la parte central podemos apuntar con más precisión.

Para detectar colisiones, utilizo una variable que indica la posición absoluta en la memoria de pantalla sobre la que está el ala izquierda de nuestra nave. Sumando los 3 caracteres adjuntos debe dar 96 (ASCII espacio=32). Si el valor es distinto es que estamos sobre "algo" y perdemos la vida que tenemos. Esto nos ahorra muchos cálculos, y es muy preciso.

En cada pasada decidimos, mediante un ON GOTO, que enemigo se ha de mover:
0) Aleatoriamente hacemos subir o bajar la barrera de energía.
1) Aleatoriamente hacemos subir o bajar una de las tres naves.
2) En el caso de los Fungaloids, calculamos un número aleatorio grande. Si es inferior a 7, hacemos crecer el Fungaloid correspondiente, pero si es mayor de 6 no hacemos nada. Esto hace que crezcan más lentamente, pero al ir avanzando en el juego, el número que calculamos disminuye y por consiguiente, aumenta su velocidad de crecimiento, y es más difícil.

En el juego original, al sobrevolar un Fungaloid nos disparaba. Aquí, para ganar velocidad he optado por hacer que nos dispare al destruir un fragmento de Fungaloid. Así aprovecho el mismo código que me indica que Fungaloid he alcanzado para poner su disparo en la planta correspondiente. Como es un SPRITE, el movimiento posterior es muy simple.

Al mostrar la presentación activamos el SCREEN 0 y a continuación el SCREEN 1. Esto hace que todos los caracteres que hayamos redefinido se destruyan, ahorrándonos código. Al empezar un nuevo juego se vuelven a cargar, pero como son pocos, es rápido.

La verdad es que me habría gustado realizar algunas modificaciones, pero he optado por mantener el espíritu del juego original.

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 TOSHIBA HX-10. El listado se ha impreso en una impresora matricial BROTHER M-1109. A lo retro, como dios manda.


Os invito a probarlo.

1332286863_35_FT16006_210320122526_.jpg
1332286863_35_FT16006_210320122526_.jpg (38.05 KiB) Visto 4525 veces


fungaloids.gif
fungaloids.gif (30.3 KiB) Visto 4525 veces
Buscando la IP de la W.O.P.R.

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: 103 veces
Contactar:

Re: Programando FUNGALOIDS para MSX

Mensajepor zitror » 08 Nov 2012, 19:24

Respeta perfectamente la esencia del original para ZX81 =D>

Me encantan estos post didácticos, sí señor. El listado a impresora matricial es da un toque retro añadido al conjunto :jumper:

Gracias por compartir tu trabajo :D Salu2 ;)
(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 FUNGALOIDS para MSX

Mensajepor dancresp » 08 Nov 2012, 20:25

Pues si, he respetado el original en todos los aspectos.
Es un juego que en su día me encantó en el ZX-81, y le tenía ganas. Pues ala... O:)

Y funciona la mar de bien, gentileza del BASIC de los MSX.
Buscando la IP de la W.O.P.R.

Avatar de Usuario
everon67
Spectrum 48K Plus
Spectrum 48K Plus
Mensajes: 39
Registrado: 27 Oct 2012, 08:54
Sistema Favorito: Commodore Amiga
primer_sistema: ZX81
consola_favorita: Nintendo SNES
Primera consola: Sega Genesis/Megadrive

Re: Programando FUNGALOIDS para MSX

Mensajepor everon67 » 08 Nov 2012, 20:40

Brillante conversión.

¿Cuantos juegos ganan al pasar de una maquina a otra?, pues este claramente. =D>


Volver a “Programación”

¿Quién está conectado?

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