Perdón por el retraso en retomar esta serie, he estado ocupado la mayor parte del año escribiendo The Swarm is Coming... vuelvo ahora a Stinky Dog. Cuando lo dejamos, habíamos construido lo básico de un juego: tenemos un personaje, Stinky Dog, un enemigo, Sideways Clive, algunas plataformas, escaleras y movimiento básico. También añadimos unos bloques coleccionables, huesos, para que Stinky Dog los recoja mientras evita a Sideways Clive.
Pensemos en cómo convertir esto en un juego. Quizá Stinky Dog tenga que recoger todos los huesos de la pantalla antes de que se abra la puerta al siguiente nivel. Podríamos ponérnoslo fácil teniendo siempre el mismo número de huesos en cada pantalla....y entonces solo necesitaríamos una variable que cuente cuántos huesos hemos recogido y, cuando llegue al número objetivo, pasar al siguiente nivel. Sería bastante fácil. Primero necesitamos una variable; en MPAGD no puedes inventarte cualquier nombre para una variable, estás limitado a:
A, B, C, D, E , F, G, H , I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, Z
Básicamente, todas las letras del alfabeto menos X e Y. Además, te aconsejo que no uses la Z, que suele estar reservada para la música, que veremos otro día.
Bien, ¡usaremos B para Bones (huesos)!
Digamos que hay 5 huesos en cada pantalla que Stinky Dog tiene que recoger sin que lo maten antes de poder pasar a la pantalla siguiente.
En nuestro evento RESTARTSCREEN (que se ejecuta cada vez que empezamos una pantalla, incluso después de una muerte) añadiríamos:
LET B = 5 ; 5 Bones on screen
Luego tenemos que restar uno cada vez que Stinky Dog recoja uno; recuerda que en la Parte 11 trabajamos con el evento COLLECTBLOCK, al que se llama cada vez que el jugador recoge un bloque coleccionable: ábrelo y añade la línea
SUBTRACT 1 FROM B ; decrement the number of bones left to collect
Ahora solo tenemos que gestionar lo que debe pasar cuando se hayan recogido los 5 huesos, así que debajo de la última línea del evento COLLECTBLOCK podemos añadir:
IF B = 0 ; have all Bones been collected? NEXTLEVEL ; move to the next screen ENDIF
NEXTLEVEL incrementará el número de pantalla: esto significa que, si tu primera pantalla es (como es habitual) SCREEN 0, al recoger los 5 huesos Stinky Dog pasará a SCREEN 1.
Pero ¿y si quisiéramos un número distinto de coleccionables en cada nivel? Podríamos escribir un montón de instrucciones IF para gestionarlo en nuestro evento RESTART SCREEN...
IF SCREEN = 0
LET B = 5
ELSE
IF SCREEN = 1
LET B = 7
ELSE
IF SCREEN = 2
LET B = 3
.....aggghh!!!!!!!!!
...pero eso sería horrible e ineficiente....tiene que haber una forma mejor....y la hay...una (bueno, dos) de las herramientas más potentes de MPAGD: DATA y READ.
En cada evento puedes añadir una instrucción DATA; una instrucción Data es simplemente un conjunto de números. Luego podemos 'obtener' uno de esos números usando el comando READ y guardando el valor en una de nuestras variables.
Así que lo único que tenemos que hacer es escribir una instrucción DATA que contenga, por orden, el número de huesos coleccionables de cada pantalla. Digamos que vamos a tener 20 pantallas; nuestro DATA se parecería a esto:
DATA 5 7 3 4 6 9 5 8 5 6 4 8 6 9 3 8 9 DATA 4 7 8 10
Ten en cuenta que debes tener un máximo de 16 en cada línea de DATA, por lo que tenemos dos líneas en nuestro ejemplo de 20 salas.
Así, en la pantalla 0 (la primera pantalla de nuestro juego) tenemos 5, en la pantalla 1 tenemos 7 ...y así sucesivamente.
Ahora solo tenemos que escribir una forma de recuperar, cuando se inicia o reinicia la pantalla, el número correcto de huesos para la pantalla actual.
Y aquí es donde entra READ.
Así es como lo hacemos: en el evento RESTARTSCREEN sustituimos el LET B= 5 que añadimos antes por:
RESTORE ; start READing from the beginning of the DATA list READ B ; read the first value of the DATA and put it in B IF SCREEN >= 1 ; if it is screen 1 or above REPEAT SCREEN ; then repeat SCREEN-many times READ B ; read the next value ENDREPEAT ; so we've found the right B value for the Screen ENDIF DATA 5 7 3 4 6 9 5 8 5 6 4 8 6 9 3 8 9 DATA 4 7 8 10
Ahora, cada vez que reiniciemos la pantalla, rellenaremos automáticamente nuestra variable B con el número de huesos que Stinky Dog necesita recoger.
Ya que estamos...añadamos a la barra de puntuación el número de huesos que quedan por recoger.
Lo añadiremos al evento RESTART SCREEN (ponlo encima de la instrucción DATA) y al evento COLLECTBLOCK para que se actualice durante el juego:
AT 0 18 ; show the number of bones left to collect DISPLAY DOUBLEDIGITS B
Ahora vamos a probarlo...
Para explicarlo mejor: la variable SCREEN siempre contiene el valor de la pantalla actual. Si Screen es 0, obtendremos su valor de B con el primer comando READ B; si el número de pantalla es 1 o mayor, haremos REPEAT del READ B el número correcto de veces para encontrar el valor de B de esa pantalla. READ recuerda hasta dónde llegó en la lista de DATA la última vez que se ejecutó, así que después del primer READ B (pantalla 0) sabe que la próxima vez que se ejecute leerá el siguiente valor de DATA (es decir, 7, el valor para SCREEN 1).
Por eso necesitamos usar RESTORE al principio de este código: le dice a MPAGD que olvide hasta dónde llegó en la lista la última vez y que empiece de nuevo desde el principio
Quería presentarte DATA y READ bastante pronto en esta serie porque son realmente útiles. Entiéndelos bien ahora y les encontrarás incontables usos en el futuro.
También hemos aprendido sobre REPEAT y ENDREPEAT: es un bucle que se ejecutará tantas veces como quieras, dependiendo del número o del valor de la variable (en nuestro ejemplo usamos la variable SCREEN).
