Programando FUNGALOIDS 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 FUNGALOIDS para MSX
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):
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
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.
Buscando la IP de la W.O.P.R.
- 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 FUNGALOIDS para MSX
Respeta perfectamente la esencia del original para ZX81
Me encantan estos post didácticos, sí señor. El listado a impresora matricial es da un toque retro añadido al conjunto
Gracias por compartir tu trabajo
Salu2 

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

Gracias por compartir tu trabajo


-
- 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
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...
Y funciona la mar de bien, gentileza del BASIC de los MSX.
Es un juego que en su día me encantó en el ZX-81, y le tenía ganas. Pues ala...

Y funciona la mar de bien, gentileza del BASIC de los MSX.
Buscando la IP de la W.O.P.R.
- everon67
- 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
Brillante conversión.
¿Cuantos juegos ganan al pasar de una maquina a otra?, pues este claramente.
¿Cuantos juegos ganan al pasar de una maquina a otra?, pues este claramente.

¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados