Capítulo Cero


"El laberinto". El proyecto se dedicaba exclusivamente a jugar la pantalla del laberinto hasta ahora, por lo que tenemos mucho trabajo adelantado en este capítulo.

Pac-man entrará al laberinto para jugar si pulsamos la "tecla" FIRE1. Entraremos en la Pantalla Cero. 

No hemos dedicado tiempo a la edición de los controles del juego, es muy intuitivo. Para controlar a Pac-man tú mismo o tu misma puedes definir las teclas que quieras en la sección "Keyboard controls" del menú "Editor". Define la tecla "FIRE1" también.

Recordemos la guía, para no perdernos.

RESTARTSCREEN

Selecciona "Restart screen" del menú "Events". añade este código:

IF SCREEN = 0        ; si estamos en el LABERINTO
    IF F = 0 ; y si estamos en modo "Juego" entonces
LET F = 1 ; pasa a modo "enmarcado Jugando"
    ELSE ; en cambio si estamos en modo "Insert coin"
LET F = 3 ; pasa a modo "enmarcado Insert coin"
    ENDIF
    LET N = 0 ; restaura BOLAS
    LET S = 0           ; restaura cronómetro
    LET D = 0 ; restaura PILDORAS
    LET G = 0 ; restaura FANTASMAS POR PANTALLA
    LET H = 0 ; restaura FRUTAS POR PANTALLA
    LET J = 0 ; restaura BONUS POR PANTALLA
ENDIF

Guarda el texto, cierra el editor de textos, guarda el proyecto.

Estamos entrando en la pantalla cero. El programa debe distinguir dos modos "Insert coin" y "Jugando", establecer para cada uno un momento "enmarcado" en el Main loop 2 y establece los valores iniciales y contadores necesarios para jugar.

MAIN LOOP 2

Selecciona "Main loop 2" del menú "Events". Añade este código:

IF SCREEN = 0     ; si estamos en el LABERINTO
    IF F = 1            ; y en modo "enmarcado Jugando"
PUT  16 16 0        ; pinta objetos
PUT  224 16 1
PUT  16 144 2
PUT  224 144 3
AT 22 16            ; pinta marcador
DISPLAY LIVES
AT 9 13
MESSAGE 6     ; GET READY!
IF P = 1            ; si comenzamos en el primer laberinto
            SOUND 1 ; Tema musical Pac-man
    SOUND 0             ; Música sólo una vez
    DELAY 200           ; Espera a la música
        ENDIF
        DELAY 25            ; Espera a GET READY!
        REDRAW              ; Redibuja
        LET F = 0           ; pasa a modo "Jugando"
        EXIT                ; salir
    ELSE
        IF F = 3        ; par el modo "enmarcado Insert coin"
            PUT  16 16 0    ; coloca objetos
            PUT  224 16 1
            PUT  16 144 2
            PUT  224 144 3
            LET F = 2       ; pasa a modo "Insert coin"
            EXIT
        ENDIF
    ENDIF
ENDIF

Guarda el texto, cierra el editor de textos, guarda el proyecto.

El programa se asegura de ejecutar una sola vez el modo "enmarcado Jugando". Lo conseguimos al pasar a modo "Jugando" justo al acabar de pintar los elementos de la pantalla y ejecutar los sonidos. Lo mismo hacemos para el modo "enmarcado insert coin", esta vez no hay sonidos ni marcadores.

El programa coloca las cuatro "bolas de poder" con el comando PUT X Y objeto, usa el comando Delay para esperar 25 ciclos (medio segundo) para después usar el comando REDRAW que consigue redibujar todo el escenario quedando eliminado el mensaje 6 ("GET READY!").

El famoso tema Pac-man se ejecuta solo cuando estamos en el primer laberinto (y solo una vez).

PLAYER

Volvemos al actor principal, será el encargado del salto a la pantalla BONUS si consigue terminar un laberinto o si muere en su intento.

Selecciona "Player" del menú "Events". Modifica el código que comprueba si terminamos el tablero para quedar así:

IF N = 193     ; si terminamos el tablero entonces
    ADD 1 TO P        ; sumamos una pantalla terminada más
    IF P = 8
LET L = 2        ; subimos de nivel dificultad del juego
ADD 1 TO LIVES   ; te damos vida extra!
; BEEP           ; efecto sonido "VIDA EXTRA"
    ELSE
IF P = 16
            LET L = 3        ; subimos al máximo nivel
    ADD 1 TO LIVES   ; te damos última vida extra
    ; BEEP           ; efecto sonido "VIDA EXTRA"
ENDIF
    ENDIF
    ADD 1 TO C        ; suma contador de CICLOS DE INTERMISION
    REMOVE      ; nos BORRAMOS
    LET SCREEN = 2    ; salto a PANTALLA TRANSITO/PUNTUACION
    LET S = 0         ; restaurar cronómetro
    EXIT
ENDIF

Guarda el texto, cierra el editor de textos, guarda el proyecto.

Cuando terminamos el tablero es justo el momento de salto a la pantalla BONUS, antes Pac-man se borra así mismo para desaparecer de la pantalla y suma uno en el contador "C" para saltar a "INTERMISSION" cada 3 laberintos completados. ¡Enhorabuena! Script terminado. Créetelo.

EVENT SPRITETYPE2

Pac-man muere "otra vez". En este momento es cuando comprobamos si le quedan más vidas a Pac-man.
Selecciona "Sprite type 2" del menú "Events". Cambia el código 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
        REMOVE
        LET SCREEN = 2           ; salta a pantalla "BONUS"
        EXIT        
    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 texto, cierra el editor de textos, guarda el proyecto.

Ahora cuando Pac-man se quede sin vidas desaparece (se borra a sí mismo) y salta a la pantalla BONUS. Date cuenta que el script seguirá ejecutándose a no ser que le obliguemos a salir con el comando EXIT.
¡Script terminado!

MAIN LOOP 1

Usaremos la condición F = 0 justo al principio de la sección que gestiona la aparición de las frutas. Tenemos que asegurarnos que las frutas solo aparezcan en el laberinto.
Selecciona "Main loop 1" del menú "Events". Todo debe quedar así:

EVENT MAINLOOP1

; CRONOMETRO
LET A = CLOCK
SUBTRACT O FROM A
IF A >= 50
    ADD 50 TO O    ; variable O (letra o) es última lectura de CLOCK.
    ADD 1 TO M     ; cronómetro MODOS
    ADD 1 TO B     ; cronómetro marcador BONUS
    ADD 1 TO S     ; cronómetro FRUTAS
ENDIF

IF B > 0           ; hay marcador BONUS en el tablero
    IF B < 3
        ; agota 3 segundos
    ELSE
        LET B = 4 
WHILE B < 8
            GET B         ; borra marcadores BONUS
    ADD 1 TO B
ENDWHILE
LET B = 0         ; restaura cronómetro
    ENDIF
ENDIF

; frutas
IF S = 15        ; primera aparición de BONUS FRUTAS
    IF F = 0        ; solo si estamos "Jugando" entonces
        LET S = 0     ; restauramos cronómetro
        READ A ; lee FRUTA
        SPAWN 5 A       ; instancia una FRUTA
        SPAWNED
            LET X = 112
            LET Y = 96           ; posición GET READY
            SUBTRACT 7 TO A
    MULTIPLY A BY 2
    SUBTRACT 1 TO A      ; posición en la serie = (A-7)*2-1
    LET SETTINGB = A     ; guardar índice en SETTINGB
    READ SETTINGA  ; leer color y guardar en SETTINGA 
        ENDSPRITE
    ENDIF
ENDIF

; Gestor de modos
IF M < 100            ; DISPERSION
    IF N > 128           ; finalizando el laberinto (N = BOLAS)
        IF M > 1            ; agotamos periodo de solo un segundo
            LET M = 100        ; y cambio a persecución.
ENDIF
    ELSE                 ; al comienzo del laberinto
        IF M > 5            ; agotamos periodo de 5 segundos
            LET M = 100        ; y después persigue.
        ENDIF
    ENDIF
ELSE
    IF M < 200         ; PERSECUCION
        IF M > 120          ; agotamos periodo de 20 segundos
            LET M = 0          ; y otra vez dispersión.
ENDIF
    ELSE     ; Pac-man "tiene el poder" ASUSTADO
        LET A = 210         ; periodo inicial de 10 segundos.
IF F = 0            ; solo si estamos jugando entonces
            SUBTRACT P TO A     ; resta un segundo por nivel
ENDIF
        IF P >= 20          ; a partir del nivel 20
    LET M = 0          ; ya no tienen miedo
        ELSE
    IF M > A        ; agotamos periodo
                LET M = 0      ; volvemos a dispersión.
            ENDIF
        ENDIF
    ENDIF
ENDIF

; Contador de frames del juego
ADD 1 TO Z
IF Z > 5
LET Z = 0 ; pulso (tic) 0, 1, 2, 3, 4, 5
ENDIF

; datos: fruta, color
DATA 8 2 9 2 10 3 11 6 12 2 13 7

Algo más sutil. En las pantallas "START" e "INTERMISION" en niveles superiores Big-man agota su tiempo de poder antes de alcanzar a los fantasmas. Por eso insertamos la condición F = 0 antes de modificar el tiempo de poder por nivel:

IF F = 0            ; solo si estamos jugando entonces
            SUBTRACT P TO A     ; resta un segundo por nivel
ENDIF

Guarda el texto, cierra el editor de textos, guarda el proyecto. ¡SCRIPT TERMINADO!

Collect block

Selecciona "Collect block" del menú "Events". Debemos contar los puntos solo cuando estemos jugando. Si no la hacemos Pac-man podría hacer "récord" en modo "Insert coin". El código debe quedar así:

EVENT COLLECTBLOCK

; COME

IF SCREEN = 0 ; en el laberinto
    IF F = 0        ; si estamos jugando
     ADD 1 TO N ; suma al contador de puntos de luz
        SCORE 5 ; sumar 5 al marcador
    ENDIF
ENDIF

IF F = 0        ; solo si estamos jugando
    ; BEEP 1        ; FX Sonido "paku paku"
ENDIF

AT 22 2
SHOWSCORE

Guarda el texto, cierra el editor de textos, guarda el proyecto.

¡Otro script terminado! ¡Hourra!

Capítulo dos

Entramos en la pantalla "BONUS". Pac-man no interviene en ella, de manera que haremos protagonista de las acciones al "game loop".
Tenemos casi todo el trabajo terminado, solo un pequeño esfuerzo más.

RESTARTSCREEN

Cuando entramos en la pantalla BONUS vamos a levantar la bandera de "enmarcado" (F=1) para que el main loop 2 ejecute posteriormente la escena.
Selecciona "Restart screen" del menú "Events". Añade el siguiente código:

IF SCREEN = 2    ; si entramos en la pantalla BONUS
    LET F = 1        ; establecer modo "enmarcado"
    LET S = 0        ; y restaurar cronómetro.
ENDIF

Guarda el texto, cierra el editor de textos, guarda el proyecto.

Main loop 2

Selecciona "Main loop 2" del menú "Events". Añade este código:

IF SCREEN = 2    ; si estamos en la pantalla BONUS
    IF F = 1        ; y estamos en modo "enmarcado"
PUT 96 28 9    ; coloca las cuatro "bolas de poder"
PUT 96 44 8
PUT 96 68 10
PUT 96 92 11
AT 4 15        ; pinta marcador de "puntos de luz"
PRINT "5x"
AT 4 18
DISPLAY N 
IF N > 0
            REPEAT N       ; por cada "punto" comido
        BONUS 5       ; añade 5 bonus
        AT 17 15      ; y pinta bonus.
        SHOWBONUS
    ENDREPEAT
ENDIF
BEEP 7         ; reproducir FX "score"
AT 6 15        ; pinta marcador de "bolas de poder"
PRINT "50x"
AT 6 19
DISPLAY D
IF D > 0
    REPEAT D
BONUS 50       ; añade 50 bonus por cada "bola"
AT 17 15
SHOWBONUS
    ENDREPEAT
ENDIF
BEEP 7         ; reproducir FX "score"
AT 9 15        ; pinta marcador "fantasmas"
DISPLAY G
AT 12 15       ; pinta marcador "frutas"
DISPLAY H
AT 14 5        ; pinta marcador "packs bonus"
PRINT "200 BONUS x"
AT 14 17
DISPLAY J
AT 17 9        ; pinta marcador "Total"
PRINT "TOTAL"
IF J > 0
    REPEAT J
BONUS 200  ; añade 200 bonus por cada "pack bonus"
AT 17 15
SHOWBONUS  ; pinta bonus
BEEP 7     ; y reproducir FX "score"
    ENDREPEAT
ENDIF
ZEROBONUS      ; restaura registro bonus
AT 22 2
SHOWSCORE
LET F = 2      ; pasar a modo INSERT COIN
    ELSE            ; pero si estamos en modo "INSERT COIN"
IF S = 6       ; y si agotamos 6 segundos
            IF LIVES = 0   ; y si agotamos las 3 vidas entonces
ENDGAME        ; salir a HIGH SCORE (S = 6, LIVES = 0)
    ELSE           ; pero si aún tenemos vidas               
        IF C > 3       ; y si acumulas 3 Laberintos completados.
            LET C = 1     ; restaura C
    SPAWN 0 1     ; instancia PLAYER (lo habíamos borrado).
    SPAWNED          ; accede a sus propiedades.
        LET X = 112      ; nueva posición en INTERMISSION
        LET Y = 136
        LET IMAGE = 0    ; mirando a izquierda
        LET DIRECTION = LEFT
    ENDSPRITE
    LET SCREEN = 3   ; saltar a INTERMISION (S = 6, C > 3)
    EXIT             ; salir del script
        ELSE          ; en caso contrario (C <= 3)
    LET F = 0        ; pasar a modo "Jugando"
    SPAWN 0 1        ; Instancia PLAYER (estaba borrado).
    SPAWNED          ; accede a sus propiedades
        LET X = 112      ; nueva posición GET READY
        LET Y = 96
        LET IMAGE = 1
        LET DIRECTION = RIGHT
    ENDSPRITE
    LET SCREEN = 0       ; saltar a LABERINTO (S = 6, LIVES > 0)
    EXIT
        ENDIF
    ENDIF
        ENDIF
    ENDIF
ENDIF

Guarda el texto, cierra el editor de textos, guarda el proyecto.

El programa debe encargarse de dos tareas principales. Primero, si F = 1 entonces pintar los elementos decorativos y marcadores. Segundo, si F = 2 entonces decidir los saltos a otras pantallas. La estrategia es la siguiente:

    IF F = 1
        ... pintar y reproducir sonidos
        LET F = 2
    ELSE
        ... saltar a "High Score" (F=2) si LIVES = 0
        ... a "Intermisión" (F=2) si C > 3
        ... o pasar a "Laberinto" (F=0) si C <= 3.
    ENDIF

Pintar y reproducir sonidos sólo ocurrirá una vez en la pantalla "BONUS" porque traemos levantada la bandera "enmarcado" (F=1) desde RESTARTSCREEN para bajarla rápidamente después de terminar el trabajo y establecer el modo "Insert coin".
Para después, cuando estemos en modo "Insert coin" y gastados unos 6 segundos haremos las comprobaciones siguientes:

        IF S > 6
            IF LIVES = 0
                ENDGAME
            ELSE
                IF C > 3
                    ..."Intermisión"
                ELSE
                    ..."Laberinto"
                    LET F = 0
                ENDIF
            ENDIF
        ENDIF

Solo si vamos al laberinto estaremos en modo "Jugando" de nuevo.

En el programa BONUS y SHOWBONUS funcionan igual que SCORE y SHOWSCORE.
EL EngineZX puede sumar BONUS al SCORE con el comando ADDBONUS, también puede poner el marcador de BONUS a cero con el comando ZEROBONUS. El marcador SCORE solo se pone a cero cada vez que jugamos un nuevo juego. Esto lo resolveremos en el capítulo High Score.

El resto del programa colocará las cosas en su sitio.
Necesitamos hacer reaparecer ("RESPAWN") a Pac-man que había sido borrado ("REMOVED") anteriormente.

El comando SPAWN type image coloca en "el cursor" (última posición conocida X, Y) el personaje tipo con una imagen determinada.
Nosotros además cambiamos sus propiedades al acceder a ellas con el comando SPAWNED, cambiamos su posición, imagen, frame y dirección según el caso. Veamos el caso del salto al "Laberinto" por ejemplo:

    LET F = 0        ; pasar a modo "Jugando"
    SPAWN 0 1        ; Instancia PLAYER
    SPAWNED          ; accede a sus propiedades
        LET X = 112      ; nueva posición GET READY
        LET Y = 96
        LET FRAME = 0
        LET DIRECTION = LEFT    ;mira a izquierda
    ENDSPRITE

La pantalla BONUS está lista. El resto del juego se encarga de cumplir todas sus órdenes, la maquinaria empieza a ser compleja pero eficiente.

La recta final

Buen trabajo. Realmente hemos alcanzado el 99% del guion del proyecto. Estamos cerca de añadir la música, los efectos de sonido y la producción final.

"A Shigeo Funaki se unieron un buen número de personas. Trabajar con grandes equipos era novedoso para la industria del video-juego, cuando la mayoría de los juegos eran diseñados por los mismos programadores que los codifican".

Comentarios

Entradas populares de este blog

El laberinto