JawBreaker para MSX

Foro dedicado a la programación en todo tipo de sistemas clásicos.
dancresp
Amiga 1200
Amiga 1200
Mensajes: 1382
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 1 vez
Gracias recibidas: 14 veces

JawBreaker para MSX

Mensajepor dancresp » 07 Sep 2013, 00:27

JawBreaker_0001.png
JawBreaker_0001.png (3.23 KiB) Visto 1211 veces


EL JUEGO
Este videojuego, estilo PAC-MAN, fue desarrollado por Tigervision en 1982 para ATARI 2600, aunque existen versiones para otros sistemas.

El objetivo del juego consiste en controlar una boca y comerse todos los caramelos del laberinto evitando los enemigos que transitan por sus pasillos. Cada cierto tiempo aparece una pastilla que nos permite comernos a los enemigos.

Controles:
Utiliza el joystick o los cursores para controlar la boca.
Pulsa el disparador/espacio para empezar la partida.

Descargar el juego en formato ".CAS": (Cargar con CLOAD"")
Jawbreaker.rar
(2.45 KiB) Descargado 25 veces


Pantalla_doble_.jpg
Pantalla_doble_.jpg (47.23 KiB) Visto 1211 veces


BLOQUES
Se ha dividido el listado en 12 bloques:
- Declaración de las matrices. Llamada a rutinas principales.
- Control de la boca. Movimiento y que come.
- Control de los enemigos.
- Control de la pastilla energética.
- Detección de colisión entre la boca y un enemigo. En función del estado se pierde una vida o se come al enemigo.
- Pasar de nivel.
- Cambiar la posición de un enemigo.
- Presentación del juego.
- Inicio de la partida y nivel.
- Inicio del juego y definición de variables globales.
- Rutinas varias.
- DATA con los SPRITES y UDG del juego.


COMO FUNCIONA
Todo el programa ocupa 110 líneas.

A continuación indico el principio de las distintas partes del programa:
10 - Definimos las matrices del juego.
30 – Salto a la subrutina que lee los gráficos, redefine los caracteres y define variables globales y modo de vídeo.
50 – Salta a la presentación del juego.
100 – Se lee el control seleccionado y se salta a la línea correspondiente.
110 – Comprueba si se puede mover en la dirección indicada y guarda el valor en (W).
150 – Mueve la boca en la dirección activa, marcada por (W).
180 – Controla la animación de la boca.
185 – Comprueba que come la boca. Si no hay nada salta a 200.
200 – Bloque que controla el movimiento de los distintos enemigos.
220 – Controla la animación de los enemigos.
250 – Controla la aparición de la pastilla energética (D=0).
260 – Controla la duración de la pastilla energética (V), si está visible (U=1).
290 – Vuelve a 100 controlando la velocidad del juego (TIME) y si no hemos tocado a un enemigo (E=0)
400 – Si hay una colisión pero nos hemos comido la pastilla energética salta a 450.
410 – Perdida de vida (L) y continuación o final de la partida.
450 – Rutina que calcula que enemigo nos hemos comido, lo recoloca y suma puntos (P).
500 – Rutina de pasar nivel (G). Animación del cepillo de dientes y aumenta la dificultad (D1 y D2).
600 – Rutina que recoloca a un enemigo.
2000 – Pantalla de presentación del juego.
2100 – Espera a que seleccionemos el control (J) mientras controla la animación de los enemigos.
2500 – Muestra el laberinto y los marcadores.
2600 – Reinicia la boca, los enemigos e inicializa ciertas variables.
3000 – Seleccionamos el modo de video, ocultamos teclas de función y activamos la detección de colisión de SPRITES.
3010 – Lectura de los DATA de los SPRITES.
3020 – Lectura de los DATA de los UDG (gráficos redefinidos).
3030 – Definición de variables globales.
3050 – Rutina que duplica los caracteres de los números en otra zona y convierte los de los números en negrita.
5000 – Rutina que oculta los SPRITES de los enemigos.
5100 – Rutina que pone E=0 si hay una colisión entre SPRITES.
5200 – Rutina de PAUSA. Valor en (N).
5300 – Rutina que cambia el color a los enemigos y los pone todos en rojo.
5310 – Rutina que pone a cada enemigo su color correspondiente.
5400 – Rutina que muestra el cepillo de dientes en una posición horizontal marcada por (F) y vertical fija.
8000 – Rutina de vuelta al editor BASIC. Recupera los valores por defecto.
9000 – DATA con los gráficos de los SPRITES.
9200 – DATA con los gráficos UDG.


EL LISTADO
Listado.jpg
Listado.jpg (247.66 KiB) Visto 1211 veces


APUNTES FINALES
Hacía mucho tiempo que deseaba hacer una adaptación de este juego a MSX ya que, a priori, el juego parece muy simple aunque a la hora de la verdad tiene sus complicaciones.

Y me lo he tomado como un experimento: intentar usar el mínimo número de variables y usar los VPEEK directamente. Esto ha afectado al rendimiento de una forma muy importante y me ha permitido hacer que el juego funcione rápidamente (unos 7 frames por segundo) a pesar de mover a los 4 enemigos a la vez.

Principales descartes respecto al original:
- Los agujeros de los muros no se mueven.
- Los enemigos no cambian de dirección si nos detectan en el mismo pasillo.
- Los enemigos no van más lentos al comer la pastilla energética.
- No avisa cuando se está acabando el efecto de la pastilla energética.

Por el resto, la mecánica del juego se ha respetado casi en su totalidad.

DSC_1199.jpg
DSC_1199.jpg (115.6 KiB) Visto 1211 veces


Este juego “ha sufrido” una revisión tras otra en la que me he dedicado a sustituir las variables y matrices que usaba, por acceso directo a la memoria mediante VPEEK. Esto ha permitido que el programa sea mucho más rápido que en sus primeras versiones. El primer listado del programa y el último son radicalmente diferentes.

La parte del movimiento de la boca se divide en dos partes:
- La primera se activa al mover la palanca y comprueba si realmente se puede mover en esa dirección.
- La segunda intenta mover la boca en la dirección activa. Si no puede, la detiene.

Esta parte ocupa 14 líneas de código, pero se ha optimizado para que nunca se ejecuten más de 4 líneas por pasada.

Por otro lado, para ver si nos podemos mover verticalmente he redefinido la letra “d” como si fuera un espacio y lo pongo antes que el otro espacio que forman los agujeros por los que nos movemos. Con un único VPEEK que confirma si hay el carácter “d” se valida si se puede mover en esa dirección.

Para mover a los enemigos he prescindido de bucles y matrices. Hay 4 líneas (200-215) que se encarga cada una de mover a uno de los enemigo.

Para la animación de los enemigos, la línea:
- 220 VPOKE 6918,VPEEK(6918)+4 AND 31
... sustituye a la línea que había:
- 220 VPOKE 6918,A%: IF A%<28 THEN A%=A%+4 ELSE A%=0

El BASIC tarda más en acceder al valor de una variable que a una posición de memoria exacta, por lo que es más rápido.

La rutina que recoloca a los enemigos (600-615) se ha montado de la siguiente forma:
- Si no hay ningún enemigo en el mismo pasillo que la boca, lo coloca allí y se recalcula su velocidad.
- Genera un número de pasillo aleatorio entre 1 y 9. Si está ocupado lo deja donde estaba y sino lo coloca en el nuevo.
- Se calcula si posicionarlo a la derecha o izquierda del pasillo.

Así, solo se recalcula la velocidad en uno de los casos para evitar que, a veces, se hagan dos multiplicaciones y otras solo una, lo que afectaba a la velocidad “casi” constante del juego. La posición vertical en pixels correspondiente al pasillo se ha guardado en una matriz (Z) para evitar otra multiplicación.

Para las colisiones he aprovechado la capacidad de los MSX para detectar colisiones de SPRITES de forma automática. Como nunca hay dos enemigos en un mismo pasillo, cuando sucede es porque uno a tocado a la boca. Al suceder esto salta a la línea 5100 y pone la variable E=0. En 290 mira si ha de salir del bucle principal y en 400 decide si se pierde una vida o se debe comer al enemigo. Eso si, el sistema no avisa de cuales son los SPRITES afectados por la colisión. Sea como sea, esto ahorra una cantidad de tiempo básica para poder realizar este juego.

Por otro lado, el uso de SPRITES tanto para los enemigos como para la boca facilita la cosa enormemente ya que con un simple VPOKE podemos cambiar la posición de un SPRITE sin preocuparnos de que se borre el contenido de la pantalla. Este juego es imposible de programarlo en otro sistema que no soporte SPRITES con este rendimiento y suavidad de movimiento.

Inicialmente los agujeros se movían, pero solo avanzaban una posición por cada 8 movimientos de la boca. Esto hacía que su movimiento fuera lento, y penalizaba el rendimiento del juego. Así que decidí eliminar esta parte y mejorar el rendimiento general.

Respecto al tema de los marcadores, los números del juego de caracteres del MSX son muy simples. Así, he creado una rutina en la línea 3020 que genera caracteres en negrita. Básicamente, mediante un bucle hago dos cosas:
- Redefino a partir del carácter “o” con los valores de los gráficos de los números. Esto es para que en la presentación los números se vean con el mismo estilo que las letras. Así el “rpqs” de la línea 2060 aparece como “2013”.
- Leo los códigos que forman los números, divido su valor entre 2 para conseguir un desplazamiento a la derecha de un bit y hago un OR de los dos valores para “fusionar” los 8 bits. Con esto consigo que los números aparezcan en negrita.
- Posteriormente, con VPOKE hago que los números en negrita aparezcan en rojo y los normales en gris.

Me habría gustado hacer alguna mejora gráfica, pero al final he decido respetar al máximo el aspecto original del juego. De todas formas, por temas de resolución los pasillos solo contienen 13 caramelos cuando en la versión original hay 15. Y la separación entre los enemigos y las paredes del pasillo son de 1 pixel cuando en el original hay 2.

Pues nada más, solo me queda esperar que os guste.

Os invito a probarlo.

JawBreaker_0000.png
JawBreaker_0000.png (8.89 KiB) Visto 1211 veces

JawBreaker_0001.png
JawBreaker_0001.png (3.23 KiB) Visto 1211 veces

JawBreaker_0002.png
JawBreaker_0002.png (3.21 KiB) Visto 1211 veces

JawBreaker_0005.png
JawBreaker_0005.png (2.96 KiB) Visto 1211 veces

JawBreaker_0004.png
JawBreaker_0004.png (3.01 KiB) Visto 1211 veces

JawBreaker_0003.png
JawBreaker_0003.png (2.59 KiB) Visto 1211 veces

JawBreaker_0008.png
JawBreaker_0008.png (2.49 KiB) Visto 1211 veces
Última edición por dancresp el 09 Feb 2017, 15:32, editado 4 veces en total.
Buscando la IP de la W.O.P.R.

Avatar de Usuario
xgipe
Atari 1040 STf
Atari 1040 STf
Mensajes: 826
Registrado: 26 May 2010, 15:59
Sistema Favorito: MSX
primer_sistema: MSX
consola_favorita: Sega Master System
Primera consola: Videopac
Ubicación: D.O. Penedès
Gracias dadas: 35 veces
Gracias recibidas: 29 veces

Re: JawBreaker para MSX

Mensajepor xgipe » 23 Oct 2013, 17:19

¡Ah! que casi me olvido... he hecho un CAS para poder disfrutarlo en el emulador :-({|=

jawbreaker.rar
JawBreaker en versión CAS para el emulata...
(2.46 KiB) Descargado 134 veces


Saludos,
Xgipe
BLOAD "CAS:",R
Found: WIN3.11

Avatar de Usuario
radastan
Amiga 2500
Amiga 2500
Mensajes: 4526
Registrado: 11 Jun 2007, 19:29
Ubicación: Córdoba-Jaén
Gracias dadas: 2 veces
Gracias recibidas: 29 veces
Contactar:

Re: JawBreaker para MSX

Mensajepor radastan » 23 Oct 2013, 17:21

Como te lo curras macho, como te lo curras...
Yo tengo una máquina del tiempo, se llama ZX Spectrum, siempre me devuelve a los buenos momentos.
(\.../) (\.../) (\.../) (\.../)
( *.*) ('.'= ) ('.'= ) ('.'= )
(")_(") (")_(") (")_(") (")_(")
╔═══╦═══╦═══╦══╦══╗
║╔═╗║╔═╗║╔═╗╠╣╠╩╣╠╝
║║─║║╚══╣║─╚╝║║─║║
║╚═╝╠══╗║║─╔╗║║─║║
║╔═╗║╚═╝║╚═╝╠╣╠╦╣╠╗
╚╝─╚╩═══╩═══╩══╩══╝

dancresp
Amiga 1200
Amiga 1200
Mensajes: 1382
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 1 vez
Gracias recibidas: 14 veces

Re: JawBreaker para MSX

Mensajepor dancresp » 23 Oct 2013, 21:40

xgipe escribió:¡Ah! que casi me olvido... he hecho un CAS para poder disfrutarlo en el emulador :-({|=
Saludos,
Xgipe

A modo de deja vu, te vuelvo a dar las gracias !!! :D


radastan escribió:Como te lo curras macho, como te lo curras...

Viniendo del "chico del momento" gracias a su "Misco Jones"... es todo un alago !!! :D

Hombre, este "JawBreaker" esta programado en BASIC y teniendo en cuenta que mueve el protagonista y los 4 enemigos a la vez unas 6 o 7 veces por segundo... no está mal.
Buscando la IP de la W.O.P.R.

dancresp
Amiga 1200
Amiga 1200
Mensajes: 1382
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 1 vez
Gracias recibidas: 14 veces

Re: JawBreaker para MSX

Mensajepor dancresp » 03 Ene 2014, 13:07

Recupero este hilo para incorporar el enlace al fichero ".cas" (gentileza de xgipe) y poder disfrutar del juego en un emulador.

Este es un excelente ejemplo de lo que puede dar de si el BASIC más el hardware del MSX: un comecocos con los 4 enemigos moviéndose a la vez, con una velocidad más que digna.

JawBreaker.gif
JawBreaker.gif (3.36 KiB) Visto 2254 veces
Buscando la IP de la W.O.P.R.

Sankyo
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 239
Registrado: 30 Jul 2007, 20:53
Sistema Favorito: MSX
primer_sistema: MSX
Ubicación: Alicante
Gracias dadas: 5 veces
Contactar:

Re: JawBreaker para MSX

Mensajepor Sankyo » 05 Feb 2017, 13:19

Hola Daniel (Dancresp)

Quería ponerme a echar un vistazo a los códigos de los juegos que programaste para MSX (JawBreaker, Munchkin y Blasto) y aparecen corruptas todas las imágenes en los Topic que abriste.

¿Te importaría volver a subirlos o pasármelos por correo?

Te mandé un privado el 28 de Enero pero no se porqué sigue en la carpeta de "Salida" y no en la de "Enviados".

Un saludo
Juanmi

BlackHole
Amiga 1200
Amiga 1200
Mensajes: 1035
Registrado: 07 Nov 2009, 11:38
Ubicación: Madrid
Gracias dadas: 1 vez
Gracias recibidas: 66 veces

Re: JawBreaker para MSX

Mensajepor BlackHole » 05 Feb 2017, 15:28

Sankyo escribió:aparecen corruptas todas las imágenes en los Topic que abriste
En algún momento del pasado se han hecho volcados de los binarios del foro en modo texto, cambiandose los bytes $0D (13) por la combinación $0D+$0A (13+10) y se corrompieron así muchas imágenes y archivos comprimidos que estaban como adjuntos.

Avatar de Usuario
xgipe
Atari 1040 STf
Atari 1040 STf
Mensajes: 826
Registrado: 26 May 2010, 15:59
Sistema Favorito: MSX
primer_sistema: MSX
consola_favorita: Sega Master System
Primera consola: Videopac
Ubicación: D.O. Penedès
Gracias dadas: 35 veces
Gracias recibidas: 29 veces

Re: JawBreaker para MSX

Mensajepor xgipe » 06 Feb 2017, 15:20

Sankyo escribió:Hola Daniel (Dancresp)

Quería ponerme a echar un vistazo a los códigos de los juegos que programaste para MSX (JawBreaker, Munchkin y Blasto) y aparecen corruptas todas las imágenes en los Topic que abriste.

¿Te importaría volver a subirlos o pasármelos por correo?

Te mandé un privado el 28 de Enero pero no se porqué sigue en la carpeta de "Salida" y no en la de "Enviados".

Un saludo
Juanmi


Hola Sankyo,

os adjunto nuevamente el archivo CAS que realicé, junto con un listado en TXT para mayor rapidez de edición/consulta. ;)

Lamento no disponer de las imágenes que acompañaban el post original de Dancresp (con quien he perdido contacto desde hace algún tiempo).

Saludos,
Xgipe
Adjuntos
jawbreaker.rar
(4.74 KiB) Descargado 23 veces
BLOAD "CAS:",R
Found: WIN3.11

Sankyo
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 239
Registrado: 30 Jul 2007, 20:53
Sistema Favorito: MSX
primer_sistema: MSX
Ubicación: Alicante
Gracias dadas: 5 veces
Contactar:

Re: JawBreaker para MSX

Mensajepor Sankyo » 09 Feb 2017, 00:15

Muchas gracias xgipe!!

A ver si dandresp nos adjunta también los listados de Munchkin y Blasto.

Un saludo

dancresp
Amiga 1200
Amiga 1200
Mensajes: 1382
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 1 vez
Gracias recibidas: 14 veces

Re: JawBreaker para MSX

Mensajepor dancresp » 09 Feb 2017, 09:11

xgipe escribió:Lamento no disponer de las imágenes que acompañaban el post original de Dancresp (con quien he perdido contacto desde hace algún tiempo).

Pues te tendré que pegar un toque, porque a calpirro lo vi hace poco.

¿Una cervecita un sábado por la mañana? :-ss
Buscando la IP de la W.O.P.R.


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 3 invitados