Tutorial de AGD 9: Movimiento tipo “Manic Miner”

En el último capítulo pudimos, por primera vez, mover nuestro personaje por la pantalla usando el teclado. En esta ocasión explicaré el código de la plantilla por defecto de tipo “Manic Miner” y que nos servirá de base para nuestro juego.

Antes de nada, y para facilitar el manejo del editor de código, veamos las teclas de control del editor de código de AGD, tendrás que ver en tu emulador y sistema operativo, cual es la correspondencia entre las teclas “especiales” de ZX Spectrum y las de tu máquina real.

SYM-Y Cortar Línea
SYM-U Pegar Linea
SYM-Q Inicio 
SYM-E Fin
CAPS-2 Activar Mayúsculas
CAPS-3 Borrar hacia delante
CAPS-4 Cambia entre Insertar y Sobreescribir
SYM-CAPS Activa/Desactiva Modo Extendido 

¿Manic Miner?

Cabe la posibilidad de que no hayas conocido el juego al que nos referimos, un clásico de los 80, básicamente el movimiento consiste en tres teclas, izquierda, derecha y salto. En el siguiente video podeis ver ese estilo en acción:

¡Al lio!

Pongo en primer lugar el código completo, para a continuación ir desgranándolo, ¡vamos a ello!

IF KEY 0
	IF Y > 167
		SCREENRIGHT
		LET Y = 6
		EXIT
	ELSE
		IF CANGORIGHT
			LET IMAGE = 0
			ANIMATE
			SPRITERIGHT
		ENDIF
	ENDIF
ENDIF
IF KEY 1
	IF Y < 8
		SCREENLEFT
		LET Y = 168
		EXIT
	ELSE
		IF CANGOLEFT
		LET IMAGE = 0
		ANIMATE
		SPRITELET
	ENDIF
ENDIF
IF KEY 3
	JUMP
ENDIF
FALL
IF DEADLY
	KILL
ENDIF

Lo primero que hemos de observar es la estructura del código, básicamente hay cuatro partes, delimitadas más o menos por cada IF, a saber: movimiento a la derecha, movimiento a la izquierda, salto y caída.

IF KEY DERECHA
	MOVER DERECHA
ENDIF
IF KEY IZQUIERDA
	MOVER IZQUIERDA
ENDIF
IF KEY SALTO
	SALTAR
ENDIF
GESTIONAR CAIDA
SI CAYO DE DEMASIADO ALTO
	GESTIONAR MUERTE
ENDIF

Movimiento Derecha

IF KEY 0
	IF Y > 167
		SCREENRIGHT
		LET Y = 6
		EXIT
	ELSE
		IF CANGORIGHT
			LET IMAGE = 0
			ANIMATE
			SPRITERIGHT
		ENDIF
	ENDIF
ENDIF
...

El primer bloque “IF” gestiona el movimiento del muñeco cuando pulsamos el KEY 0 que corresponde con la tecla asignada a “Derecha”, se ejecuta el código que hay dentro.

Este código se divide en dos partes, la primera comprueba si estamos en el borde derecho de la pantalla para cambiar a la que corresponde en el mapa (de momento sólo tenemos una) , la otra, en caso de que no estemos en ese borde, gestiona el movimiento natural de nuestro protagonista.

...
IF Y > 167
	SCREENRIGHT
	LET Y = 6
	EXIT
ELSE
...

En primer lugar, indicar que Y es la variable que representa la posición horizontal del sprite de nuestro protagonista, dentro de la pantalla, el número exacto dependerá de las dimensiones que hayamos asignado a la pantalla de juego. Léase el 167 como “límite derecho de la pantalla actual” y el 6 como “límite izquierdo de la pantalla actual”.

La primera instrucción SCREENRIGHT, muestra la pantalla “a la derecha” de la actual según el mapa, en caso de no haber ninguna, muestra la misma de nuevo.

A continuación cambia la coordenada Y, de forma que “desaparecemos” por a derecha de una pantalla y “aparecemos” en la parte izquierda de la correspondiente.

Por último, salimos del bloque de código, pues ya hemos respondido a la pulsación de tecla. Tomemos en cuenta que este bloque de código se ejecuta continuamente por lo que prima la norma “una tarea cada vez”.

Veamos ahora el “ELSE”, que corresponde con la gestión del movimiento “normal” del muñeco:

...
ELSE
	IF CANGORIGHT
		LET IMAGE = 0
		ANIMATE
		SPRITERIGHT
	ENDIF
ENDIF
...

El funcionamiento es muy sencillo, si “CANGORIGHT”, entonces, se asigna el sprite 0 como gráfico del muñeco, se ejecuta el ciclo de animación y se mueve el sprite hacia la derecha. Es muy muy sencillo, pero quiero comentar un par de cosas:

En primer lugar, CANGORIGHT hace referencia a la comprobación de si los bloques dibujados en pantalla permiten “cruzar” al personaje, he estado esperando hasta este punto para contar esto. Sirva decir que cada bloque puede o no dejar pasar (ser suelo, pared , etc) en función de la configuración y que esto hará que nuestro muñeco pueda o no pasar por determinada zona. Podéis jugar con eso en el editor de bloques y ver que pasa, aunque dedicaré un capítulo a esto próximamente.

En segundo lugar el “LET IMAGE = 0”, asigna un sprite o secuencia frames al muñeco, podemos tener varias de estas secuencias y asignarlas en determinados momentos como por ejemplo, una para cuando estamos quietos, otra para movernos a la derecha, otra para movernos a la izquierda y otra para el salto.

Mediante esta asignación iremos cambiando la animación por la que toca en cada momento. Como “deberes”, haced que vuestro muñeco tenga una animación estando quieto, otra para moverse en cada dirección (izquierda o derecha) y otra diferente para el salto. Es un gran ejercicio que os hará encontrar y resolver problemas, algo muy necesario para crear un juego.

Movimiento Izquierda

...
IF KEY 1
	IF Y < 8
		SCREENLEFT
		LET Y = 168
		EXIT
	ELSE
		IF CANGOLEFT
		LET IMAGE = 0
		ANIMATE
		SPRITELET
	ENDIF
ENDIF
...

El movimiento a la izquierda es literalmente la imagen especular del de mover a derecha, por lo que me remito a lo ya explicado.

Salto

...
IF KEY 3
	JUMP
ENDIF
FALL
IF DEADLY
	KILL
ENDIF

Por último, el salto, en su versión más básica, simplemente comprobamos que se ha pulsado la tecla correspondiente al salto, y ejecutamos la rutina que lo gestiona.

Posteriormente ejecutamos FALL que gestiona la caída en caso de que el salto termine “en el aire”. Esta rutina, en caso de que caigamos desde demasiado alto, activará el FLAG “DEADLY”.

Finalmente, si el proceso acaba con “DEADLY” en “verdadero”, se ejecuta “KILL” que gestiona el proceso de muerte lanzando el evento correspondiente (en el que a su vez estará el código que resta las vidas y demás).

Y esto sería todo por hoy, se pueden hacer más cosas, jugad con el código a ver que cosas se os ocurren, tambien podeis crear pantallas a izquierda y derecha de la que tenéis, situarlas en el mapa y ver como cambiamos de una a otra al acercarnos al borde.

En próximos capítulos crearé una traducción de la “Referencia de Lenguaje” de AGD, y en capítulos posteriores hablaré de los tipos de bloque, del salto, el proceso de “muerte”, y como suele decirse ¡y mucho más! xD

Como decimos siempre practicad, practicad y practicad. ¡Nos vemos en la siguiente entrega!

Quizá te interese ...

Dejar una Respuesta

XHTML: Usted puede usar las siguientes etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>