La guarida fantasma

"Comúnmente conocida como La Casa o La guarida fantasma , este área acordonada en el centro del laberinto es el dominio de los cuatro fantasmas y está fuera del alcance de Pac-Man.
 
Cada vez que se completa un nivel o se pierde una vida, los fantasmas vuelven a sus posiciones iniciales dentro y alrededor de la casa fantasma antes de que el juego continúe: Blinky siempre se encuentra justo arriba y afuera, mientras que los otros tres se colocan adentro: Inky a la izquierda , Pinky en el medio y Clyde a la derecha.
 
La puerta en la parte superior es utilizada por los fantasmas para entrar o salir de la casa. Sin embargo, una vez que un fantasma se va, no puede volver a entrar a menos que Pac-Man lo capture por primera vez; luego, los ojos incorpóreos pueden regresar a casa para ser revividos".
El dosier fantasma.

"La guarida fantasma" cierra el ciclo de vida del fantasma. Nos queda la última transformación del fantasma. Tipo 1 "ojos incorpóreos".

El comportamiento de estos fantasmas es muy simple. Lo has acertado. Solo tienen que llegar a casa, su objetivo debe ser la celda justo debajo de "la puerta fantasma".

Además de atravesar "La puerta fantasma" debe resurgir como tipo "perseguidor/disperso" una vez dentro de "La Guarida".

SISTEMA DE COORDENADAS

Es buen momento para entender la correspondencia entre el sistema de celdas [X,Y] y el sistema de pixeles (X,Y). Las localizaciones en el laberinto para nuestro propósito son las siguientes:


La casilla azul está compuesta por las celdas [12,8][13,8][12,9][13,9] y contiene 16x16 pixeles en total (4 bloques de 8x8).
Su posición (104,72) coincide en la cruz blanca que hay dibujada en su esquina superior izquierda. Si queremos colocar un Objeto o un Sprite sin usar el editor grafico, usando código en un script, lo hacemos mediante su posición.

Para obtener la posición "B" (en el gráfico siguiente) en el sistema de coordenadas (0,0) a partir de un celda "B" [X,Y] hacemos los cálculos (X'=X*8+8),(Y'=Y*8+8).
¿Porqué sumamos 8? Si recuerdas, el primer día "Proyecto Pacman" usamos el editor "Window size", allí definimos nuestra "ventana de juego", la colocamos a partir de la casilla 1,1 de "la parrilla de juegos" (pantalla del ZX Spectrum). Esto hace que el editor "Screens" tome como nuevo origen de coordenadas esa casilla 1,1 (LEFTEDGE=8 pixeles y TOPEDGE=8 pixeles) para mostrarnos la información de la celda que estamos editando [0,0].
Si en vez del editor gráfico optamos por la programación para referirnos a objetos, Sprites o usamos el comando "AT" usaremos el sistema de coordenadas de la parrilla de juegos y no la "ventana de juego", por lo que necesitamos hacer este pequeño ajuste.

Selecciona "Screens" en el menú "Editor" (Editor gráfico). Con el ratón apunta a las cruces imaginarias donde quieras colocar un Sprite, anota la celda y haz el cálculo.

Los cálculos en nuestro caso deben ser los siguientes:

Casilla azul "posición Inicial" (104,72).[12,8]
Casilla naranja posición "a las puertas de casa" (120,48).[14,5]
Casilla amarilla posición "Objetivo ojos incorpóreos" (112,64).[13,6]
Casilla rosa posición de "salida" (120,72).[14,8]

EVENT SPRITETYPE1

Tenemos toda la información, ahora toca editar el script tipo "ojos incorpóreos" (TYPE 1).

Abrimos el editor MPAGD. Abrimos el proyecto Pacman. Selecciona opción "Sprite type 1" del menú "Events". Edita para que quede así:


EVENT SPRITETYPE1

; Objetivo Regresar a casa, ojos incorpóreos

SPRITEINK SETTINGA          ; mi color es mi identidad

IF X = 104
    IF Y = 72            ; en "posición inicial"
LET TYPE = 4     ; REAPARECE en modo perseguir/dispersar
LET SETTINGB = D    ; memoriza "última bola energizante"
LET IMAGE = 4       ; cambia de apariencia
LET FRAME = 0       ; asegura fotograma 0
;BEEP 5              ; sonido "Sirena fantasma"
    ENDIF
ENDIF

IF LADDERBELOW        ; estoy "a las puertas de casa"
    SPRITEDOWN            ; MUEVE abajo
    EXIT                  ; salir del script
ENDIF

; movimiento

IF DIRECTION = UP
    ; girar contra reloj
    IF CANGOUP
        SPRITEUP
    ELSE
        LET DIRECTION = LEFT
    ENDIF

    movimiento hacia objetivo
    IF X > 112
        IF CANGOLEFT
            LET DIRECTION = LEFT
            ANIMATE
        ENDIF
    ELSE
        IF CANGORIGHT
            LET DIRECTION = RIGHT
            ANIMATE
        ENDIF
    ENDIF
ENDIF

IF DIRECTION = DOWN
    IF LADDERBELOW        ; estoy "a las puertas de casa"
        SPRITEDOWN            ; MUEVE abajo
        EXIT                  ; salir del script
    ENDIF
    ; girar sentido reloj
    IF CANGODOWN
        SPRITEDOWN
    ELSE
        LET DIRECTION = RIGHT
    ENDIF
    ; movimiento hacia objetivo
    IF X > 112
        IF CANGOLEFT
            LET DIRECTION = LEFT
            ANIMATE
        ENDIF
    ELSE
        IF CANGORIGHT
            LET DIRECTION = RIGHT
            ANIMATE
        ENDIF
    ENDIF
ENDIF

IF DIRECTION = LEFT
    ; atraviesa túnel, poco probable.
    IF X <= LEFTEDGE
        LET X = RIGHTEDGE
        EXIT
    ELSE
        ; giro sentido reloj
        IF CANGOLEFT
            SPRITELEFT
        ELSE
            LET DIRECTION = DOWN
        ENDIF
    ENDIF
    ; movimiento hacia objetivo
    IF Y > 64
        IF CANGOUP
            LET DIRECTION = UP
            ANIMATE
        ENDIF
    ELSE
        IF CANGODOWN
            LET DIRECTION = DOWN
            ANIMATE
        ENDIF
    ENDIF
ENDIF

IF DIRECTION = RIGHT
    ; chequear túnel
    IF X >= RIGHTEDGE
        LET X = LEFTEDGE
        EXIT
    ELSE
        ; giro contra reloj
        IF CANGORIGHT
            SPRITERIGHT
        ELSE
            LET DIRECTION = DOWN
        ENDIF
    ENDIF
    ; movimiento hacia objetivo
    IF Y > 64
        IF CANGOUP
            LET DIRECTION = UP
            ANIMATE
        ENDIF
    ELSE
        IF CANGODOWN
            LET DIRECTION = DOWN
            ANIMATE
        ENDIF
    ENDIF
ENDIF

Guarda el script, cierra el editor, guarda el proyecto.

El programa hace su trabajo.
Comprueba si está en la posición de salida (Cuadro azul) entonces REAPARECE como "perseguidor" (tipo 4) y suena la sirena.
Si está encima de la entrada (IF LADDERBELOW, cuadro rojo), lo hace ENTRAR.
Mueve los ojos incorpóreos hacia el objetivo (cuadro amarillo).

EVENT PLAYER

Como habrás adivinado será el encargado de hacer regresar a los fantasma a su Guarida.

Selecciona "Player" en el menú "Events" del MPAGD. Edita para que quede así:

EVENT PLAYER
; Pacman

SPRITEINK  14

; Control

IF KEY UP
    IF CANGOUP
        DIRECTION = UP
    ENDIF
ENDIF
IF KEY DOWN
    IF CANGODOWN
        DIRECTION = DOWN
    ENDIF
ENDIF
IF KEY LEFT
    IF CANGOLEFT
        DIRECTION = LEFT
    ENDIF
ENDIF
IF KEY RIGHT
    IF CANGORIGHT
        DIRECTION = RIGHT
    ENDIF
ENDIF

; movimiento
IF DIRECTION = UP
    IF CANGOUP
        SPRITEUP
        LET IMAGE = 2
ANIMATE
    ENDIF
ENDIF

IF DIRECTION = DOWN
    IF CANGODOWN
        SPRITEDOWN
LET IMAGE = 3
ANIMATE
    ENDIF
ENDIF

IF DIRECTION = LEFT
    IF X <= LEFTEDGE
        LET X = RIGHTEDGE
        EXIT
    ELSE
        IF CANGOLEFT
    SPRITELEFT
    LET IMAGE = 1
            ANIMATE
        ENDIF
    ENDIF
ENDIF

IF DIRECTION = RIGHT
    IF X >= RIGHTEDGE
        LET X = LEFTEDGE
        EXIT
    ELSE
        IF CANGORIGHT
    SPRITERIGHT
            LET IMAGE = 0
            ANIMATE
        ENDIF
    ENDIF
ENDIF

; comprobaciones

IF N = 193
LET N = 0
ENDGAME
ENDIF

; detección

GETBLOCKS ; COME COCOS

DETECTOBJ ; Para las PILDORAS

IF OBJ < 4 ; es una PILDORA DE PODER
    ADD 1 TO D ; cuenta PILDORAS PODER.
    SCORE 50 ; suma 50 al marcador.       
    ;BEEP 3 ; "gulp"
    AT 22 2
    SHOWSCORE ; actualizar marcador.
    LET M = 200 ; activar modo Asustado, encender cronómetro.
    GET OBJ ; COME
ENDIF

IF COLLISION 3 ; COME FANTASMAS
    ; BEEP 4 ; come fantasma "eatghost"
    OTHER
        LET TYPE = 1        ; tipo "ojos incorpóreos"
        LET IMAGE = 6       ; nueva imagen
        LET FRAME = 0       ; fotograma de inicio animación
    ENDSPRITE
ENDIF

LET V = X                ; Revela tu posición X
LET W = Y                ; Revela tu posición Y
LET I = DIRECTION        ; Revela tu dirección

Guarda el script, cierra el editor, guarda el proyecto.

COLLISION

Hemos organizado todo un poco.
En la sección de "detección" tenemos tres métodos diferente: GETBLOCKS DETECTOBJ y el nuevo que hemos introducido, el comando COLLISION.
Esta función se incorpora en todos los motores gráficos. Es un servicio imprescindible, asiste a la interacción entre elementos del juego.
Un ejemplo de esto es que podemos acceder a las propiedades de los dos elementos de la colisión con el comando OTHER. Con el comando ENDSPRITE se termina el acceso a dichas propiedades.

El programa que hemos introducido resuelve la CAPTURA del fantasma. Cuando Pac-man colisiona con un fantasma tipo 3 ("asustado") entonces lo transforma en tipo 1 ("ojos incorpóreos"). EAT GHOST!

TYPE

Para poder cumplir el ciclo de vida de los fantasmas hemos dividido en tres tipos (TYPE) a los fantasmas: "perseguidores", "asustados" e "incorpóreos" y así poder hacer las transformaciones.
Es aquí donde le TYPE tiene gran utilidad, las posibilidades de jugar con los personajes son las que tu quieras.

SALIDA

-"Los fantasmas salen por sí solos de la guarida. ¿Tienen inteligencia propia? Nosotros no le hemos ordenado salir".
-"Si. Les hemos ordenado perseguir y desplegarse por el tablero".

En este momento cumplimos la mayoría de las especificaciones del dosier fantasma. Enhorabuena.

EVENT SPRITETYPE4

Aún así vamos a introducir un mecanismo para asegurar que la salida de los fantasmas sea rápida y ordenada.

Selecciona "Sprite type 4" en el menú "Events" del MPAGD. Insertamos el código siguiente justo antes de la sección de movimiento.

IF X = 120
    IF Y = 72                 ; en posición de salida
        GETRANDOM 4
        IF RND = 1
            LET DIRECTION = UP ; SALIR de la guarida
            EXIT
        ENDIF
    ENDIF
ENDIF

De esta manera aseguramos la salida.

Guarda el script, cierra el editor, guarda el proyecto.

"Tercer acto. El desenlace de esta historia está en tu mano, los monstruos acechan constantemente, no tenemos tiempo que perder, somos su objetivo. Tu decides el camino".



Comentarios

Entradas populares de este blog

El laberinto