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