Programando un MANIC MINER [ 3ª Parte ]

dancresp
Mensajes: 6323
Registrado: 13 Nov 2010 02:08
Ubicación: Barcelona
Agradecido : 747 veces
Agradecimiento recibido: 1123 veces

Programando un MANIC MINER [ 3ª Parte ]

Mensajepor dancresp » 14 Jun 2011 23:55

En esta última entrega vamos a aprender a programar los distintos movimientos de nuestro personaje.

Hay que tener en cuenta que esta es la parte más compleja del programa, y a su vez la que más va a afectar al rendimiento del ordenador. Se han añadido nuevas rutinas y se han modificado otras para optimizar el funcionamiento del programa.

Imagen


RUTINA DE CARGA DE LOS GRAFICOS DE WILLY
Lo primero que hay que hacer es cargar los gráficos del protagonista del juego.
En esta versión he utilizado dos animaciones de Willy de 16x16 pixels para cada dirección.

La rutina comienza en la línea 8000 y acaba en la 8270.
Como en las anteriores cargas de gráficos, leemos los valores de las líneas DATA y las metemos en la VRAM, en la zona reservada a los SPRITES.
En la línea 7090, dentro de la rutina de activar el modo SCREEN 1, hacemos el GOSUB a esta rutina. Solo se ejecuta una vez.


MOVIMIENTO DE WILLY
En un principio empecé a programar el movimiento de Willy con una velocidad de 2 pixels. Esto le proporcionaba un movimiento muy suave, pero al activar las partes del código que controlan si Willy toca algún objeto, el rendimiento cayo totalmente. Así que no he tenido más remedio que hacer que Willy se mueva de 8 en 8 pixels. Explico el porque.

Si Willy se mueve a 8 pixels, en todo momento esta encima, debajo y delante o detrás de 2 gráficos y el código de detección de contacto con el escenario se simplifica.
Si Willy se mueve a 1, 2 ó 4 pixels, cuando su posición es múltiplo de 8 está en contacto con 2 gráficos, pero en el resto de casos Willy está en contacto con 3 gráficos. Esto hace que la detección de contacto se complique y en consecuencia, caiga el rendimiento.

La parte de código que se encarga de mover a Willy se compone de varias subrutinas.
Vamos a ver cuales son:

- Línea 2000: Rutina de control principal.
- Línea 2100: ¿Caída?
- Línea 2200: Movimiento a la derecha.
- Línea 2300: Movimiento a la izquierda.
- Línea 2400: Control de salto.
- Línea 2600: ¿Hay pared?
- Línea 2800: ¿Que toca?

Variables implicadas en el movimiento de Willy:
WX – Posición horizontal de Willy.
WY – Posición vertical de Willy.
WS – Si es mayor de 0, Willy está saltando.
WC – Si es igual a 1, Willy está cayendo.
WM – Indica en que dirección se está moviendo Willy cuando anda o salta. Hacia la derecha vale 3 y hacia la izquierda 8.
WD – En condiciones normales está a 0. Contiene un 1 si Willy ha muerto y un 2 si Willy ha de pasar la pantalla.
WA – Control de la animación de Willy. 16 ó 20 hacia la derecha y 24 ó 28 hacia la izquierda.
WP – Indica sobre que carácter esta la parte superior izquierda de Willy. Con ella evitamos tenerlo que calcular a cada movimiento.

Funcionamiento de las rutinas:
La entrada al control del movimiento empieza en la línea 2000. A esta línea se llega una vez que acaba la rutina que controla a los enemigos, en la línea 1000. Así nos ahorramos un GOSUB.

Rutina de control principal:
Aquí controlamos que ha de hacer Willy: saltar, caer, moverse o estar quieto.

2000 – Comprueba si Willy está saltando (variable WS). Si salta va a la línea 2400.
2010 – Comprueba si Willy está cayendo (variable WC). Si cae va a la línea 2100.
2020 – Si se pulsa la barra espaciadora se pone la variable de salto WS a 1.
2030 – Guardamos en la variable WM si se ha pulsado la tecla cursora derecha o izquierda.
2040 – Si WM es 3 vamos a la rutina que se encarga de mover a Willy a la derecha, en la línea 2200.
2050 – Si WM es 7 vamos a la rutina que se encarga de mover a Willy a la izquierda, en la línea 2300.
2060 – Volvemos al nudo principal de desarrollo.

¿Caída?
Control que comprueba si hay suelo bajo los pies de Willy, o si ya está cayendo.

2100 – Mueve a Willy 8 pixels hacia abajo y actualiza el valor de WP. Esta línea solo se ejecuta cuando Willy ya está cayendo.
2110 – Al igual que en la rutina de salto vamos a hacer un barrido de los gráficos que hay bajo los pies de Willy para ver si ha de caer o no. Ponemos WC a 1, VP con el primer carácter a explorar y en M el siguiente.
2120 – Inicio de un bucle que se encarga de comprobar que hay bajo los pies de Willy.
2130 – En la variable C guardamos el carácter que está tocando Willy. Si no hay nada evitamos ejecutar la rutina de comprobación.
2140 – Si hay suelo, desactivamos la rutina de caída poniendo WC a 0.
2150 – Comprobamos que estamos pisando.
2160 – Final del bucle.
2170 – Retorno de la rutina de caída.

Movimiento a la derecha:
Rutina de control del movimiento a la derecha.

2200 – A partir de la animación del personaje veremos si mira a la derecha. Este valor se almacena en la variable WA.
2210 – Si Willy tiene una pared a la derecha no se permite el movimiento. Ponemos la posición del Willy en la variable VP, llamamos a la rutina de 2600 y si al volver WW vale 0 no se permite el movimiento.
2220 – Hacemos avanzar a Willy 8 pixels, actualizamos el valor de WP y cambiamos su animación.
2230 – Actualizamos la animación del SPRITE con el valor de la variable WA.
2240 – Si Willy no está saltando vamos a la rutina de 2110, que comprueba si hay suelo bajo sus pies.
2250 - Con este RETURN volvemos al nudo principal de desarrollo.

Movimiento a la izquierda:
Rutina de control del movimiento a la izquierda.

2300 – A partir de la animación del personaje veremos si mira a la izquierda. Este valor se almacena en la variable WA.
2310 – Si Willy tiene una pared a la izquierda no se permite el movimiento. Ponemos la posición del Willy en la variable VP, llamamos a la rutina de 2600 y si al volver WW vale 0 no se permite el movimiento.
2320 – Hacemos retroceder a Willy 8 pixels, actualizamos el valor de WP y cambiamos su animación.
2330 – Actualizamos la animación del SPRITE con el valor de la variable WA.
2340 – Si Willy no está saltando vamos a la rutina de 2110, que comprueba si hay suelo bajo sus pies.
2350 - Con este RETURN volvemos al nudo principal de desarrollo.

Control de salto:
Rutina del estado del salto.

2400 – Si el contador de salto WS es inferior a 4, Willy sube 8 pixels y se actualiza el valor de WP.
2410 – Si el contador de salto WS es mayor de 4, Willy baja 8 pixels y se actualiza el valor de WP.
2420 – Si el contador de salto WS es inferior a 5, se incrementa en 1. En caso contrario se desactiva el salto.
2430 – En la variable VP ponemos la posición en la VRAM del caracter sobre el que está Willy, y en M la siguiente.
2440 – Inicio de un bucle que se encarga de comprobar que hay sobre la cabeza de Willy.
2450 – En la variable C guardamos el carácter que está tocando Willy. Si es diferente de un espacio vamos saltamos a la línea 2800 donde hay una lista de los objetos a tratar y que hacer en cada caso.
2460 – Final del bucle.
2470 – Si al saltar estábamos moviendo a Willy a la derecha, salta a 2200 para moverlo en esa dirección.
2480 – Si al saltar estábamos moviendo a Willy a la izquierda, salta a 2300 para moverlo en esa dirección.
2490 – Retorno de la rutina de salto.

¿Hay pared?
Antes de mover a Willy comprobamos si lo puede hacer.

2600 – En la variable M guardamos el valor máximo que hemos de comprobar, y en WW guardamos si Willy puede caminar.
2610 – Inicio del bucle de comprobación.
2620 – En la variable C guardamos el carácter que hay al lado de Willy. Si hay algo, vamos a la rutina de comprobación.
2630 – Final del bucle.
2640 – Retorno de la rutina.

¿Qué toca?
Al saltar, caer o moverse Willy comprueba que está tocando, y actúa en consecuencia.

2800 – Si toca la pared de ladrillo pone la variable WW a 0. Esto indica que no se puede mover.
2810 – Si toca una llave, la borra de pantalla, suma 100 puntos, imprime el marcador de puntos y resta una llave.
2820 – Si toca una planta o una estalactita pone la variable WD a 1, que indica que Willy ha muerto.
2830 – Si toca un gráfico de la puerta de salida pone la variable WD a 2, que indica que Willy ha superado la pantalla.
2840 – Fin de la rutina de comprobación.

Choque de SPRITES
El MSX permite controlar automáticamente si dos SPRITES colisionan. Esto lo indicamos en las líneas 20 y 30.
En caso de colisión, simplemente el control del programa salta a la línea 2900 y pone la variable WD a 1, y vuelve.

Imagen


CAMBIOS VARIOS
Hay varias partes del código que se han modificado para acabar el programa o mejorar el rendimiento.

20 – Se activa la detección automática de colisión de SPRITES.
30 – Si hay una colisión, salta a la línea 2900.

220 – Se actualiza la posición horizontal y vertical del SPRITE de Willy.

410 – Si Willy ha cogido todas las llaves (variable K) salta a la presentación.

6280 – Se utiliza la función STRING para imprimir las plataformas horizontales de la pantalla. La pantalla se imprime mucho más rápidamente.

6650 – Leemos del DATA la posición inicial de Willy. Orden: posición horizontal, vertical y número de llaves de la pantalla.
6660 – Calculamos el valor de la variable WP a partir de la posición de la VRAM donde el modo SCREEN 1 guarda la pantalla.
6670 – Calculamos la posición inicial de Willy en pixels.
6680 – Ponemos el SPRITE de Willy en pantalla.
6690 – Activamos la animación inicial de Willy y su color.
6700 – Guardamos la animación inicial en WA, y indicamos que Willy no salta (WS=0), no cae (WC=0) y no está muerto (WD=0).

9010 a 9014 – Se han modificado algunos valores de la configuración de pantalla para adaptarla a las posibilidades del juego. Hay que tener en cuenta que a diferencia del juego original, aquí el suelo no se hunde, con lo que hay que hacer algún agujero en la plataforma superior. También se ha eliminado alguna planta.

9026 – DATA donde se indica el nombre de la pantalla, posición de la puerta, posición inicial de Willy y el número de llaves de la pantalla.


¿QUE MÁS QUEDA?
Bueno, pues aquí es donde entra vuestra creatividad.

El código que se presenta es totalmente funcional, y el rendimiento es lo suficientemente bueno como para permitir que en una pantalla puedan haber hasta 3 enemigos simultáneamente. Así que se podrían incluir nuevos gráficos y diseños de pantallas para incorporar algún nivel más. Faltaría una pequeña rutina que en función del número de pantalla posicionara el RESTORE de la línea 6000 en el DATA correspondiente.

En el juego original se hunde el suelo y hay cintas que mueven al personaje, pero aquí se ha eliminado por temas de rendimiento.

El personaje se controla con los cursores y la tecla espacio. Se podría activar el uso del joystick.

Se podría crear una pantalla de presentación más completa.

Y como no, falta el sonido y la música de fondo.


EL LISTADO DEFINITIVO
Pues a continuación os presento el listado definitivo.

Imagen
Imagen
Imagen


Descargar el fichero en formato ".cas"
ManicMiner.zip
(2.5 KiB) Descargado 27 veces

Usar CLOAD para cargarlo.

Y como siempre…

Para terminar, todo este desarrollo se ha programado en un MSX-2 PHILIPS VG-8235 y se ha probado en un TOSHIBA HX-10. El listado se ha impreso en una impresora matricial BROTHER M-1109. A lo retro, como dios manda.
Buscando la IP de la W.O.P.R. he encontrado mi índice

Avatar de Usuario
ron
Mensajes: 22001
Registrado: 28 Oct 2010 14:20
Ubicación: retrocrypta
Agradecido : 3936 veces
Agradecimiento recibido: 4951 veces

Re: Programando un MANIC MINER [ 3ª Parte ]

Mensajepor ron » 15 Jun 2011 09:30

Genial, entonces es esta la última entrega ?. Lo digo por aquello de FICHA-CONVERSION !

Muchas gracias Wally, digo.. Dancresp.

dancresp
Mensajes: 6323
Registrado: 13 Nov 2010 02:08
Ubicación: Barcelona
Agradecido : 747 veces
Agradecimiento recibido: 1123 veces

Re: Programando un MANIC MINER [ 3ª Parte ]

Mensajepor dancresp » 15 Jun 2011 10:00

Si, si, esta es la última entrega. Esta última entrega me ha llevado dos semanas de trabajo entre la programación y la depuración posterior.

A partir de aquí, que cada uno siga como quiera, o que lo adapte para un juego suyo.

Yo, a partir de ahora voy a hacer una serie de mini-programas en BASIC para otros sistemas. Me muero de ganas de incarle el diente al Atari 600XL, el Acorn Electron, el Aquarius, etc. Serán juegos que sacarán provecho al hardware del sistema en cuestión.

Darme unos días.
Buscando la IP de la W.O.P.R. he encontrado mi índice

Avatar de Usuario
ron
Mensajes: 22001
Registrado: 28 Oct 2010 14:20
Ubicación: retrocrypta
Agradecido : 3936 veces
Agradecimiento recibido: 4951 veces

Re: Programando un MANIC MINER [ 3ª Parte ]

Mensajepor ron » 15 Jun 2011 10:05

Sugiero que subas los siguientes ficheros como complemento.

el .BAS, y el .DSK o el .CAS de la plataforma correspondiente.

Nos puede facilitar mucho la vida a los que no tenemos más dedos para picar o simplemente tenemos un muestrario de...

dancresp
Mensajes: 6323
Registrado: 13 Nov 2010 02:08
Ubicación: Barcelona
Agradecido : 747 veces
Agradecimiento recibido: 1123 veces

Re: Programando un MANIC MINER [ 3ª Parte ]

Mensajepor dancresp » 15 Jun 2011 10:11

Interesante, pero hay que saber como hacerlo.

De todas formas, serán programas con muy pocas lineas.
Pero lo intentaré !!!
Buscando la IP de la W.O.P.R. he encontrado mi índice

Avatar de Usuario
ron
Mensajes: 22001
Registrado: 28 Oct 2010 14:20
Ubicación: retrocrypta
Agradecido : 3936 veces
Agradecimiento recibido: 4951 veces

Re: Programando un MANIC MINER [ 3ª Parte ]

Mensajepor ron » 15 Jun 2011 10:34

Me refiero al Manic Miner hombre y a los demás si tienes ese detalle...

Para hacer cosas en atari lo mejor es que dispusieras de unidad de disco , luego siempre con un SIO2SD se puede llevar de vuelta al PC y destripar lo que se quiera.

En general, lo único que necesitas es preservar, como harías con un disco / cinta y en cuanto lo tengas en PC, ya se le puede sacar todo lo que quiera.

dancresp
Mensajes: 6323
Registrado: 13 Nov 2010 02:08
Ubicación: Barcelona
Agradecido : 747 veces
Agradecimiento recibido: 1123 veces

Re: Programando un MANIC MINER [ 3ª Parte ]

Mensajepor dancresp » 15 Jun 2011 10:42

Este fuente lo tengo en disquet, y a partir del hilo de amiten del Philips VG-8235 espero poderlo pasar al PC.
Que ya se ha hecho demasiado largo.

Respecto al resto de sistemas, me gustaría. Pero como digo, hay que saber como hacerlo.
Buscando la IP de la W.O.P.R. he encontrado mi índice

Zitror

Re: Programando un MANIC MINER [ 3ª Parte ]

Mensajepor Zitror » 15 Jun 2011 10:45

Con los pocos juegos que salieron de calidad para Aquarius uno de los tuyos seguro que será un lujo para esta máquina.

Como siempre un trabajo fantástico Dancresp. Saludos.

xgipe

Re: Programando un MANIC MINER [ 3ª Parte ]

Mensajepor xgipe » 15 Jun 2011 15:33

dancresp escribió:Este fuente lo tengo en disquet, y a partir del hilo de amiten del Philips VG-8235 espero poderlo pasar al PC.
Que ya se ha hecho demasiado largo.

Si no quieres "desvirgar" tu VG, envíame una copia del disco a mi casa y yo me encargo del resto... como te dije hace unos días.
;)

dancresp
Mensajes: 6323
Registrado: 13 Nov 2010 02:08
Ubicación: Barcelona
Agradecido : 747 veces
Agradecimiento recibido: 1123 veces

Re: Programando un MANIC MINER [ 3ª Parte ]

Mensajepor dancresp » 15 Jun 2011 15:38

No, no, mi MSX-2 se queda con la disquetera que tiene.
Lo que quiero es ver si puedo leer el diquet de 360KB con el PC.

Sino, ya te lo haré llegar, que vivimos cerca.
Buscando la IP de la W.O.P.R. he encontrado mi índice

Avatar de Usuario
ron
Mensajes: 22001
Registrado: 28 Oct 2010 14:20
Ubicación: retrocrypta
Agradecido : 3936 veces
Agradecimiento recibido: 4951 veces

Re: Programando un MANIC MINER [ 3ª Parte ]

Mensajepor ron » 15 Jun 2011 15:42

Con un ATARI ST lo lees perfectamente, luego puedes pasarlo a un disco de PC.

Pero si desde PC, formateas un 720 como:

format a: /f:720

Van perfectamente.

dancresp
Mensajes: 6323
Registrado: 13 Nov 2010 02:08
Ubicación: Barcelona
Agradecido : 747 veces
Agradecimiento recibido: 1123 veces

Re: Programando un MANIC MINER [ 3ª Parte ]

Mensajepor dancresp » 12 Ene 2012 16:27

Recupero este tema porque el otro día grabé el audio en formato WAV y lo acabo de subir.

Al igual que con el LIGHTS OUT del ORIC, no sé porque motivos con el WinAmp no me carga, pero con la "Grabadora de Sonidos" del Windows carga perfectamente.

Pues si xgipe tiene la cortesía de pasarlo a CAS, lo podréis usar en un emulador.

Un saludo
Buscando la IP de la W.O.P.R. he encontrado mi índice

Avatar de Usuario
aitopes
Mensajes: 1077
Registrado: 11 Jun 2011 22:07

Re: Programando un MANIC MINER [ 3ª Parte ]

Mensajepor aitopes » 12 Ene 2012 16:48

Menudo trabajo te has mandado ;)

Felicitaciones!

xgipe

Re: Programando un MANIC MINER [ 3ª Parte ]

Mensajepor xgipe » 12 Ene 2012 17:21

¡Menuda casualidad!

Llevo un par de días con un OCR pasándome los listados al EMU para sacarme los CAS... Ya tengo el de la primera parte acabado, y estaba puliendo el de la segunda (me está dando un error que no localizo).

Cuando tenga un momentito, le pego un "caseado" al asunto.
;)

dancresp
Mensajes: 6323
Registrado: 13 Nov 2010 02:08
Ubicación: Barcelona
Agradecido : 747 veces
Agradecimiento recibido: 1123 veces

Re: Programando un MANIC MINER [ 3ª Parte ]

Mensajepor dancresp » 12 Ene 2012 18:17

xgipe escribió:¡Menuda casualidad!

Llevo un par de días con un OCR pasándome los listados al EMU para sacarme los CAS... Ya tengo el de la primera parte acabado, y estaba puliendo el de la segunda (me está dando un error que no localizo).

Cuando tenga un momentito, le pego un "caseado" al asunto.
;)

Caramba !!!

Acabo de modificar el hilo principal para indicar que el WAV hay que cargarlo con un CLOAD, y no uses el WinAmp.
Buscando la IP de la W.O.P.R. he encontrado mi índice

xgipe

Re: Programando un MANIC MINER [ 3ª Parte ]

Mensajepor xgipe » 13 Ene 2012 21:46

Buenas,

os he cocinado este CAS para que lo podáis cargar en vuestro emulata favorito...

¡De nada!

[b:]e107 Attachement: [url=../http://retrowiki.es/files/1326487573_144_FT6300_manic.rar]manic.rar[/url]

He modificado el archivo para poder cargar con RUN"CAS:


Volver a “Lenguajes de Programación y herramientas Dev”

¿Quién está conectado?

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