MSXBlog

Programando un Manic Miner (III)

Artículo de Dani Crespo publicado en RetroWiki. Adaptado y publicado por Konamito.

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.

RUTINA DE CARGA DE LOS GRÁFICOS 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 16×16 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.

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.

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.

2 comentarios sobre «Programando un Manic Miner (III)»

  1. WOW! Llegue por cosas del twitter…pero me ha fascinado el codigo (tenia tiempo sin ver numeros de lineas…la nostalgia snif snif) Gracias por tu duro trabajo y bueno quizas me anime a pasarlo pero en un emulador, jamas tuve la oportunidad de tener un MSX aqui en venezuela no fue su zona…aun mantengo mi viejo ATARI 800XL funcional quien sabe si para proyecto del 2012 haga un derivado…

  2. Felicitaciones.

    Para todos los que se inició con el ZX Spectrum no dejan de ser movido.

    Lástima que tiene problemas oculares, y no puedo ver el listado del programa.

    Abrazos.

Deja tu comentario sobre esto

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: