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].
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
Publicar un comentario