Peço desculpa pelo atraso em retomar esta série, estive ocupado a maior parte do ano a escrever The Swarm is Coming... volto agora ao Stinky Dog. Quando parámos, tínhamos construído o básico de um jogo: temos uma personagem, o Stinky Dog, um inimigo, o Sideways Clive, algumas plataformas, escadas e movimento básico. Também adicionámos alguns blocos coletáveis, ossos, para o Stinky Dog apanhar enquanto evita o Sideways Clive.
Vamos pensar em como transformar isto num jogo. Talvez o Stinky Dog tenha de apanhar todos os ossos do ecrã antes de a porta se abrir para o nível seguinte. Podíamos facilitar a vida tendo sempre o mesmo número de ossos coletáveis em cada ecrã....e então só precisaríamos de uma variável para contar quantos ossos apanhámos e, quando chegasse ao número pretendido, passar ao nível seguinte. Seria bastante fácil. Primeiro precisamos de uma variável; no MPAGD não podes inventar um nome qualquer para uma variável, 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
Basicamente, todas as letras do alfabeto menos X e Y. Além disso, aconselho-te a não usares o Z, que costuma estar reservado para a música, que veremos noutro dia.
Muito bem, vamos usar B para Bones (ossos)!
Digamos que há 5 ossos em cada ecrã que o Stinky Dog tem de apanhar sem ser morto antes de poder passar ao ecrã seguinte.
No nosso evento RESTARTSCREEN (que é executado sempre que começamos um ecrã, incluindo depois de uma morte) adicionaríamos:
LET B = 5 ; 5 Bones on screen
Depois temos de subtrair um sempre que o Stinky Dog apanha um; lembra-te de que na Parte 11 trabalhámos com o evento COLLECTBLOCK, que é chamado sempre que o jogador apanha um bloco coletável: abre-o e adiciona a linha
SUBTRACT 1 FROM B ; decrement the number of bones left to collect
Agora só temos de tratar do que deve acontecer quando os 5 ossos tiverem sido apanhados, por isso por baixo da última linha do evento COLLECTBLOCK podemos adicionar:
IF B = 0 ; have all Bones been collected? NEXTLEVEL ; move to the next screen ENDIF
NEXTLEVEL vai incrementar o número do ecrã: isto significa que, se o teu primeiro ecrã for (como é normal) SCREEN 0, ao apanhar os 5 ossos o Stinky Dog passará para SCREEN 1.
Mas e se quiséssemos números diferentes de coletáveis em cada nível? Podíamos escrever um monte de instruções IF para tratar disso no nosso evento RESTART SCREEN...
IF SCREEN = 0
LET B = 5
ELSE
IF SCREEN = 1
LET B = 7
ELSE
IF SCREEN = 2
LET B = 3
.....aggghh!!!!!!!!!
...mas isso seria horrível e ineficiente....tem de haver uma forma melhor....e há...uma (bem, duas) das ferramentas mais poderosas do MPAGD: DATA e READ.
Em cada evento podes adicionar uma instrução DATA; uma instrução Data é simplesmente um conjunto de números. Depois podemos 'obter' um desses números usando o comando READ e guardando o valor numa das nossas variáveis.
Portanto, tudo o que temos de fazer é escrever uma instrução DATA que contenha, por ordem, o número de ossos coletáveis de cada ecrã. Digamos que vamos ter 20 ecrãs; o nosso DATA ficaria parecido com isto:
DATA 5 7 3 4 6 9 5 8 5 6 4 8 6 9 3 8 9 DATA 4 7 8 10
Repara que deves ter no máximo 16 em cada linha de DATA, por isso temos duas linhas no nosso exemplo de 20 salas.
Assim, no ecrã 0 (o primeiro ecrã do nosso jogo) temos 5, no ecrã 1 temos 7 ...e assim sucessivamente.
Agora só temos de escrever uma forma de, quando o ecrã é iniciado ou reiniciado, obter o número correto de ossos para o ecrã atual.
E é aqui que entra o READ.
É assim que o fazemos: no evento RESTARTSCREEN substituímos o LET B= 5 que adicionámos 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
Agora, sempre que reiniciarmos o ecrã, vamos preencher automaticamente a nossa variável B com o número de ossos que o Stinky Dog precisa de apanhar.
Já que estamos aqui...vamos adicionar à barra de pontuação o número de ossos que faltam apanhar.
Vamos adicioná-lo ao evento RESTART SCREEN (coloca-o acima da instrução DATA) e ao evento COLLECTBLOCK para que se atualize durante o jogo:
AT 0 18 ; show the number of bones left to collect DISPLAY DOUBLEDIGITS B
Agora vamos testá-lo...
Para explicar melhor: a variável SCREEN contém sempre o valor do ecrã atual. Se Screen for 0, obteremos o seu valor de B com o primeiro comando READ B; se o número do ecrã for 1 ou maior, faremos REPEAT do READ B o número correto de vezes para encontrar o valor de B desse ecrã. O READ lembra-se até onde chegou na lista de DATA da última vez que correu, por isso depois do primeiro READ B (ecrã 0) sabe que da próxima vez que correr vai ler o valor seguinte de DATA (ou seja, 7, o valor para SCREEN 1).
É por isso que precisamos de usar RESTORE no início deste código: diz ao MPAGD para se esquecer de até onde chegou na lista da última vez e começar de novo desde o princípio
Quis apresentar-te o DATA e o READ bastante cedo nesta série porque são realmente úteis. Percebe-os bem agora e vais encontrar-lhes inúmeras utilizações no futuro.
Também aprendemos sobre REPEAT e ENDREPEAT: é um ciclo que vai correr as vezes que quiseres, dependendo do número ou do valor da variável (no nosso exemplo usámos a variável SCREEN).
