Aparecer

 "Aparecer en escena. Primer acto. Pac-man en el centro del escenario y suena una música. Los fantasmas en segundo plano, cada uno de un color. Todos permanecen inmóviles hasta que da comienzo el baile."

EVENT INITSPRITE

Es el momento en el que un Sprite se coloca por primera vez en una pantalla (o nivel). EngineZX nos da la oportunidad de cambiar algunas cosas en él.
En nuestro caso cada nuevo juego, nivel o pantalla transcurren en un sitio: "el laberinto".
EngineZX comprueba si hay nuevos Sprites que colocar, si es así, por cada uno de ellos lanza el EVENT INITSPRITE.
Aprovecharemos este momento para indexar nuestros fantasmas.

Abrimos el editor MPAGD. Abrimos el proyecto Pacman (esto lo repetiremos al inicio de cada capítulo). Selecciona "Initialise Sprite" del menú "Events". Deberás editarlo así:

EVENT INITSPRITE

; aparecer fantasmal

IF TYPE = 4                   ; si el Sprite es Perseguidor
    REPEAT A                  ; repite para A.
        READ SETTINGA         ; lee el color y resérvalo en SETTINGA
    ENDREPEAT
    ADD 1 TO A                ; pasamos al siguiente fantasma
    IF A = 5
        LET A = 1             ; si aparecieron 4, reinicia A. 
    ENDIF
ENDIF

LET FRAME = 0                 ; asegura fotograma = 0.

DATA 2, 3, 5, 6               ; RED, MAGENTA, CYAN, YELLOW

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

Tenemos cuatro Sprites fantasmas del "tipo 4", perseguidores en un principio. Tenemos un script correspondiente, el EVENT SPRITETYPE4. Vamos a reservar la propiedad SETTINGA para identificarlos por su color.
Cuando el script EVENT SPRITETYPE4 se ejecute cuatro veces en juego, lo hará cada vez de forma distinta según su color. El resultado son cuatro personalidades distintas en una.

PROPIEDADES

Las propiedades de un Sprite persisten para cada "aparición". TYPE, IMAGE, FRAME, X, Y, DIRECTION, SETTINGA, SETTINGB y DATA. Tenemos aquí una fuente de datos muy potente si lo piensas.

En el script EVENT INITSPRITE usamos la variable global A para contar los fantasmas que aparecen en escena, detenemos la lectura de la secuencia DATA en el color correspondiente al fantasma A, y guardamos el valor en la propiedad SETTINGA. "Si digo rojo, digo Blinky".

EVENT RESTARTSCREEN

Para que comience siendo A = 1 en el EVENT INITSPRITE, la declaramos antes en el EVENT RESTARTSCREEN. De manera que cada vez que se pinte una pantalla nueva y en ella haya 4 fantasmas, presentarán esta serie de colores.

Abre tu editor MPAGD y selecciona "Restart screen" del menú "Events". Deberás editarlo así:

EVENT RESTARTSCREEN

LET A = 1 ; Reinicia el orden de EVENT INITSPRITE de fantasmas.

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

EVENT SPRITETYPE4

Queda algo más por hacer. Editar nuestro "tipo 4". Abre tu editor MPAGD y selecciona "Sprite type 4" del menú "Events". Deberás editarlo así:

EVENT SPRITETYPE4

; FANTASMAS

SPRITEINK SETTINGA        ; Soy mi color

; define el objetivo.

IF SETTINGA = 2    ; si es RED soy BLINKY
    LET T = X            ; Revelo X para Inky
    LET U = Y            Revelo y para Inky
    LET Q = V            ; Objetivo (Tarjet X) en modo persigue
    LET R = W            Objetivo (Tarjet Y) en modo persigue
ENDIF

IF SETTINGA = 3    ; si es MAGENTA soy PINKY
    LET Q = V        ; X TRAJET
    LET R = W        ; Y TRAJET

    IF I = RIGHT        ; si Pac-man mira a la derecha
ADD 32 TO Q        ; apunta 4 celdas por delante
    ELSE
IF I = LEFT        ; lo mismo para izquierda
            SUBTRACT 32 TO Q
ELSE
    IF I = UP
SUBTRACT 32 TO R
    ELSE
ADD 32 TO R
    ENDIF
ENDIF
    ENDIF
ENDIF

IF SETTINGA = 5    ; si en CYAN soy INKY
    LET Q = V ; X TRAJET
    LET R = W ; Y TRAJET

    IF I = RIGHT
ADD 16 TO Q
    ELSE
IF I = LEFT
            SUBTRACT 16 TO Q
ELSE
    IF I = UP
SUBTRACT 16 TO R
    ELSE
ADD 16 TO R
    ENDIF
ENDIF
    ENDIF

    MULTIPLY Q BY 2 ; Intermpolar con BLINKY
    SUBTRACT T TO Q
    MULTIPLY R BY 2
    SUBTRACT U TO R
ENDIF

IF SETTINGA = 6    ; si es YELLOW soy Clyde
    LET Q = X
    IF X < V    ; asegurar numero positivo. (absoluto).
SUBTRACT X TO V
LET Q = V       ; Q = DISTANCIA horizontal con PAC-MAN       
ADD X TO V ; restaura V
    ELSE
SUBTRACT V TO Q ; Q = DISTANCIA horizontal con PAC-MAN
    ENDIF

    LET R = Y
    IF Y < W    ; asegurar numero positivo. (absoluto).
SUBTRACT Y TO W
LET R = W       ; Q = DISTANCIA horizontal con PAC-MAN 
ADD Y TO W      ; restaura W
    ELSE
SUBTRACT W TO R ; R = DISTANCIA vertical con PAC-MAN
    ENDIF

    IF Q < 64    ; si pac-man está a menos de 4 celdas entonces
IF R < 64
            ; MODO DISPERSION
ENDIF
    ELSE       ; si no, entonces persigue.
        LET Q = V
        LET R = W
    ENDIF
ENDIF

; movimiento

IF DIRECTION = UP
    ; gira a favor del reloj
    IF CANGOUP
        SPRITEUP
    ELSE
        LET DIRECTION = RIGHT
    ENDIF

    ; PERSIGUE EN UNA BIFURCACION
    IF X > Q
        IF CANGOLEFT
            LET DIRECTION = LEFT
            ANIMATE
        ENDIF
    ELSE
        IF CANGORIGHT
            LET DIRECTION = RIGHT
            ANIMATE
        ENDIF
    ENDIF
ENDIF

IF DIRECTION = DOWN
    ; gira en contra del reloj
    IF CANGODOWN
        SPRITEDOWN
    ELSE
        LET DIRECTION = LEFT
    ENDIF

    ; PERSIGUE EN UNA BIFURCACION
    IF X > Q
        IF CANGOLEFT
            LET DIRECTION = LEFT
            ANIMATE
        ENDIF
    ELSE
        IF CANGORIGHT
            LET DIRECTION = RIGHT
            ANIMATE
        ENDIF
    ENDIF
ENDIF

IF DIRECTION = LEFT
    ; gira a favor del reloj
    IF X <= LEFTEDGE
        LET X = RIGHTEDGE
        EXIT
    ELSE
     IF CANGOLEFT            
            SPRITELEFT
        ELSE
            LET DIRECTION = UP
        ENDIF
    ENDIF

    ; PERSIGUE
    IF Y > R
        IF CANGOUP
            LET DIRECTION = UP
            ANIMATE
        ENDIF
    ELSE
        IF CANGODOWN
            LET DIRECTION = DOWN
            ANIMATE
        ENDIF
    ENDIF
ENDIF

IF DIRECTION = RIGHT
    ; gira a favor del reloj
    IF X >= RIGHTEDGE
        LET X = LEFTEDGE
        EXIT
    ELSE
        IF CANGORIGHT
            SPRITERIGHT
        ELSE
            LET DIRECTION = DOWN
        ENDIF
    ENDIF

    ; PERSIGUE
    IF Y > R
        IF CANGOUP
            LET DIRECTION = UP
            ANIMATE
        ENDIF
    ELSE
        IF CANGODOWN
            LET DIRECTION = DOWN
            ANIMATE
        ENDIF
    ENDIF
ENDIF

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

Perseguidores

Selecciona la opción "Sprite positions" en el menú "Editor".
Selecciona para cada fantasma el Sprite 4 con la cara sonriente, cambia el tipo a "Sprite type 4" ("Perseguidores").

Coloca por orden a Blinky fuera y los otros dentro.

El editor esperará que lo coloques en una posición. Si es necesario bórralos todos y comienza a colocarlos por orden. Coloca primero Blinky, fuera arriba a la izquierda, después el resto dentro.

Prueba. Pulsa F5 (si hay errores aparecen en la ventana de comandos).

"Ahora son cuatro contra uno. Segundo acto. Pac-man come una "píldora energizante" y el juego cambia..."



Comentarios

Entradas populares de este blog

El laberinto