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 000Dibuja 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:
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:
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
Publicar un comentario