La suerte de Pac-man

 "Antes o después pasará. Los juegos son una ilusión. Tu crees elegir el desenlace de una historia, escoger el camino, hacer cambios. La cruda realidad se esconde entre bastidores. Al igual que un mago, el creador de un juego usa todos sus recursos, música, colores, luces, para crear esta ilusión. La historia está escrita en todos sus caminos, todos los finales están previstos. Esa ilusión es puro entretenimiento para el jugador. El final de Pac-man también está escrito".

La muerte de Pac-man.

Se representa en una animación, se desmorona y se desintegra mientras suena un efecto de sonido. Turno para dibujar el Sprite 007:
Abrimos el MPAGD. Abrimos nuestro proyecto Pacman. En el menú "Editor" seleccionamos "Sprites".

Sprite 007 frame 000

Dibuja pixel a pixel de nuevo nuestra pizza amarilla. Toma referencias contando los pixeles para que te salga idéntico al de la figura.
Lo siguiente será animar a Pacman. Crearemos el frame 001. Pulsamos "i" (insertar nuevo frame) y dibujamos la siguiente:

Sprite 007 frame 001

Repetimos. Volvemos a pulsar "i" para insertar los frames siguientes y los editamos:
Sprite 007 frame 002

Sprite 007 frame 003

Sprite 007 frame 004

Guarda el proyecto.

KILL

El fantasma "perseguidor" es el único capaz de acabar con Pac-man.
Selecciona la opción "Sprite type 4" del menú "Events". Añade estas líneas al final del script:

IF COLLISION PLAYER
    KILL
ENDIF

Guarda el script, cierra el editor de texto y guarda el proyecto.

Veamos qué ocurre. Pulsa "F5". Si hay algún error se indicará en la ventana de comandos.

El comando KILL levanta la bandera KILLED. Según el diagrama del "game loop" se dispara el EVENT KILLPLAYER, comprueba que LIVES = 0, en caso negativo dispara EVENT RESTARTSCREEN, vuelve a recolocar todo incluido RESPAWN PLAYER ( "posición de reaparición del jugador" que podemos definir para cada pantalla).

Como te habrás fijado los puntos de luz aparecen de nuevo. KILL, RESTART y NEXTLEVEL fueron ideados para recorrer el juego por niveles de manera que, a no ser que cambies de nivel, si mueres todo comienza de nuevo.

MAP

La alternativa existe. Recorrer las salas o niveles o pantallas libremente como en un mapa. Una de las partes divertidas de los juegos era dibujar tus propios mapas a medida que descubrías las localizaciones del juego.

Para esto último usamos los comandos SCREENLEFT, SCREENRIGHT, SCREENUP, SCREENDOWN que nos transportan por el mapa de habitación en habitación. La variable SCREEN es la pantalla en la que estamos.
STARTSCREEN define la habitación de salida.

De esta otra manera no usaremos KILL, el "game loop" no levantará la bandera KILLED. EVENT RESTARTSCREEN ocurrirá sólo una vez, debido a que no nos moveremos de la pantalla. PLAYER no reaparece y los Sprites tampoco. Lo controlaremos todo nosotros.

Puedes echar un vistazo al mapa del juego. Selecciona la opción "Map" del menú "Editor" del MPAGD.


Un sencillo editor donde puedes colocar el mapa del juego. Pac-man juega en la "Room 0*" (El asterisco indica que es la STARTSCREEN). En la imagen se muestran dos pantallas más, serán las pantallas "Intermission" y "Presentación".

EVENT SPRITETYPE4

Pongamos estos conocimientos en práctica.

El fantasma "perseguidor" era el único capaz de acabar con Pac-man.
Selecciona la opción "Sprite type 4" del menú "Events". Borra las líneas que habíamos colocado al final del script:

IF COLLISION PLAYER
    KILL
ENDIF

Añade ahora estas otras:

IF COLLISION PLAYER        ; nos alcanza un fantasma.
    IF K = 5                   ; animación disponible/finalizada
     OTHER
            SUBTRACT 1 TO LIVES    ; restamos una vida
            AT 22 16
            DISPLAY LIVES          ; actualiza marcador de vidas
            LET K = 0              ; iniciamos animación
            LET TYPE = 2           ; transforma muerte de Pac-man.
            ;BEEP 2                ; sonido "DEATH".
         ENDSPRITE
    ENDIF
ENDIF

Hemos introducido una nueva variable K. Inicialmente es 5. Pasa por los valores 0,1,2,3,4 mientras Pac-man se desmorona. Su valor será 5 cuando la animación acabe. Este mecanismo bloquea otras interacciones mientras se reproduce la animación en 5 frames de juego.

Si K = 1 entonces Pac-man se estará muriendo, aprovechamos ese momento para volver a colocar los fantasmas en su posición inicial.

Añade estas líneas justo antes de la sección de movimiento:

; muerte de Pac-man
IF K = 1            ; Pac-man está muriendo
    IF SETTINGA = 2
LET X = 96
LET Y = 48        ; posición inicial de Blinky
    ENDIF
    IF SETTINGA = 3
LET X = 104
LET Y = 72        ; posición inicial de Pinky
    ENDIF
    IF SETTINGA = 5
LET X = 120
LET Y = 72        ; posición inicial de Inky
    ENDIF
    IF SETTINGA = 6
LET X = 136
LET Y = 72        ; posición inicial de Clyde
    ENDIF
ENDIF

Guarda el script, cierra el editor de texto y guarda el proyecto.

EVENT SPRITETYPE3

El fantasma "Asustado" también debe restaurar su posición con la muerte de Pac-man.
Selecciona la opción "Sprite type 3" del menú "Events". Añade estas líneas justo antes de la sección de movimiento:

; muerte de Pac-man
IF K = 1            ; Pac-man está muriendo
    IF SETTINGA = 2
LET X = 96
LET Y = 48        ; posición inicial de Blinky
    ENDIF
    IF SETTINGA = 3
LET X = 104
LET Y = 72        ; posición inicial de Pinky
    ENDIF
    IF SETTINGA = 5
LET X = 120
LET Y = 72        ; posición inicial de Inky
    ENDIF
    IF SETTINGA = 6
LET X = 136
LET Y = 72        ; posición inicial de Clyde
    ENDIF
ENDIF

Guarda el script, cierra el editor de texto y guarda el proyecto.

EVENT GAMEINIT

Selecciona la opción "Game initialisation" del menú "Events". Debemos añadir esta variable global a la lista:

LET K = 5    ; PACMAN DEATH 0,1,2,3,4 = MURIENDO, 5 = READY.

Guarda el script, cierra el editor de texto y guarda el proyecto.

Ahora el último paso.

EVENT SPRITETYPE2

La tarea de este script será controlar la secuencia de animación, identificar el último frame y ejecutar el sonido. Identificar el último frame es necesario para evitar la animación en bucle automática del EngineZX.

También vamos a dividir la animación en tres segmentos para poder intercalar el sonido. Al ZX Spectrum 48k le resulta imposible realizar las dos tareas simultáneamente. Para los modelos con chip de sonido AY-3-8910 el código se simplificará.

Selecciona la opción "Sprite type 2" del menú "Events". Deberás editarlo para quedar así:

EVENT SPRITETYPE2

; Muerte de Pacman: entre frames reproduce un segmento de Sonido
; Para dar la impresión de continuidad

IF K < 5
    LET IMAGE = 7
    FRAME K
    ANIMATE SLOW
    ADD 1 TO K
    IF K =1
        DELAY 25    ; simulamos la duración del sonido
    ENDIF
    IF K =2
DELAY 25    ; simulamos 
    ENDIF
    IF K =4
DELAY 25    ; simulamos 
    ENDIF
ELSE                ; K = 5 
    IF LIVES = 0        ; no quedan vidas 
        AT 9 13
        MESSAGE 0          ; GAME OVER
        DELAY 34
        LET S = 0
        ENDGAME          ; PIERDES JUEGO: CHEQUEA BONUS
        REMOVE
    ELSE         ; reaparezco, aún me quedan vidas.
        LET TYPE = 0             ; transformar en Pac-man
        LET IMAGE = 1            ; con su apariencia.
        LET X = 112              ; en posición. GET READY.
        LET Y = 96
        LET FRAME = 0
        LET DIRECTION = RIGHT    ; mirando a derecha.
    ENDIF
ENDIF

Guarda el script, cierra el editor de texto y guarda el proyecto.

El programa ejecuta el comando FRAME K, anima fotograma a fotograma durante cinco ciclos de juego, dejando que todo fluya a su alrededor sin interactuar (colisionar) con nada hasta que K = 5. Entonces comprueba si se agotaron las vidas y actúa en consecuencia.
En los frames 0, 2 y 4 hace una pausa (DELAY 25) equivalente al tiempo que tardará el Beeper del ZX Spectrum en hacer su trabajo. El sonido lo implementamos más adelante.
Para salir del juego usa el comando ENDGAME que dispara su propio evento y chequea HIHGSCORE.
Para continuar vuelve a transformarse en Pac-man y se recoloca en la posición "GET READY".

Mensajes

En EVENT SPRITETYPE2 hemos escrito:

        AT 9 13
        MESSAGE 0          ; GAME OVER

Para que aparezca el mensaje correspondiente (MESSAGE 0) hay que añadirlo a la una lista de mensajes de texto. Selecciona la opción "Text messages" del menú "Editor". Edítalo así:

DEFINEMESSAGES

"GAME OVER"

Si tienes que repetir algún mensaje en el juego añádelo a la lista aquí.

Guarda el script, cierra el editor de texto y guarda el proyecto.

Test

Veamos qué ocurre. Pulsa "F5". Si hay algún error se indicará en la ventana de comandos. Ah! se me olvidaba.

Ahora si podemos decir que la historia está completa.

"fin del tercer y último acto, fin de impresión".

Comentarios

Entradas populares de este blog

El laberinto