Agora que adicionámos uma escada ao nosso jogo, criámos um sprite para a nossa personagem quando sobe e desce a escada, e definimos as teclas de Cima e Baixo, precisamos de escrever o código que vai controlar os seus movimentos de subida e descida pelas escadas.
Para isso, vamos abrir o evento Player (Player Event), que deve ter este aspeto:
EVENT PLAYER
IF KEY LEFT
LET DIRECTION = LEFT
LET IMAGE = 1
IF X <= LEFTEDGE
SCREENLEFT
LET X = RIGHTEDGE
EXIT
ELSE
IF CANGOLEFT
SPRITELEFT
ANIMATE
ENDIF
ENDIF
ENDIF
IF KEY RIGHT
LET DIRECTION = RIGHT
LET IMAGE = 0
IF X >= RIGHTEDGE
SCREENRIGHT
LET X = LEFTEDGE
EXIT
ELSE
IF CANGORIGHT
SPRITERIGHT
ANIMATE
ENDIF
ENDIF
ENDIF
IF KEY FIRE
JUMP 7
ENDIF
FALL
IF DEADLY
KILL
ENDIF
GETBLOCKSVamos ver este script em detalhe na próxima Parte, mas por agora repara que o script está dividido em várias cláusulas:
O que fazer se a tecla esquerda estiver a ser premida
O que fazer se a tecla direita estiver a ser premida
O que fazer se a tecla de disparo estiver a ser premida
Fazer o jogador CAIR (FALL) se não houver nenhum bloco por baixo onde se apoiar
O que fazer se o jogador tocar num bloco mortal
e o nosso comando GETBLOCKS que adicionámos antes ao criar os nossos ossos coletáveis
Portanto, aqui não há nada que controle o que deve acontecer se o jogador carregar em CIMA ou Baixo para subir ou descer uma escada.
Vamos adicionar algum código para CIMA: corta e cola este código mesmo antes da cláusula IF KEY FIRE...
IF KEY UP
ANIMATE SLOW
IF LADDERABOVE
IF CANGOUP
LET IMAGE = 3
SPRITEUP
LET DIRECTION = UP
ELSE
ADD 1 TO Y
ENDIF
ELSE
SPRITELEFT
IF LADDERABOVE
ELSE
SPRITERIGHT
SPRITERIGHT
IF LADDERABOVE
ELSE
SPRITELEFT
ENDIF
ENDIF
ENDIF
ENDIF
O código para descer a escada é bastante semelhante...
IF KEY DOWN
ANIMATE SLOW
IF LADDERBELOW
LET IMAGE = 3
SPRITEDOWN
LET DIRECTION = DOWN
ELSE
SPRITELEFT
IF LADDERBELOW
ANIMATE
ELSE
SPRITERIGHT
SPRITERIGHT
IF LADDERBELOW
ELSE
SPRITELEFT
ENDIF
ENDIF
ENDIF
ENDIFOutra vez, cola este código mesmo antes da cláusula IF KEY FIRE. Guarda o script, depois compila (Build) e testa o teu jogo. O cão já consegue subir e descer as escadas.
No MPAGD cada sprite tem uma série de parâmetros que podemos aproveitar no nosso código. São estes:
X: a coordenada no eixo x do ecrã do píxel superior esquerdo do sprite
Y: a coordenada no eixo y do ecrã do píxel superior esquerdo do sprite
IMAGE: o número da imagem do sprite
FRAME: o número do fotograma da IMAGE do sprite
TYPE: o número do tipo de evento em que está o código do sprite (o jogador é TYPE = 0)
Além disso, cada sprite tem três parâmetros definíveis pelo utilizador, que podemos usar para o que quisermos. São:
DIRECTION: costuma usar-se para guardar a direção em que o jogador se desloca, embora o possas usar para outro fim se precisares
SETTINGA
SETTINGB
Há mais um par de parâmetros do sprite que guardam informação sobre ele quando está no ar (a saltar ou a cair, por exemplo) ...vamos vê-los noutra altura.
É sempre boa ideia comentar o nosso código, colocando junto a cada linha uma explicação do que pensamos que ela faz...quando começas a experimentar e a tentar coisas novas, comentar torna-se inestimável. Lembra-te de que estamos a tentar meter o máximo possível em cerca de 40K de memória; se fores como eu, depressa começarás a escrever o teu próprio código para fazer coisas que vão além das capacidades dos scripts de origem do MPAGD...se não comentares o teu código, depressa te esquecerás do que *pensas* que ele tenta fazer, e depurá-lo será ainda mais difícil!
Comentamos o código adicionando um ponto e vírgula e depois o comentário. O motor do MPAGD sabe que deve ignorar os teus comentários ao compilar o código.
Agora é provavelmente uma boa altura para comentar o nosso script do jogador; aqui tens o script completo tal como está até agora, com os meus comentários:
EVENT PLAYER
IF KEY LEFT ; Is the left key pressed?
LET DIRECTION = LEFT ; if so, remember I am going LEFT
LET IMAGE = 1 ; display the left facing image
IF X <= LEFTEDGE ; are we at the left edge of the screen?
SCREENLEFT ; if so, go to the screen to left on the map
LET X = RIGHTEDGE ; and put me at the right edge of that screen
EXIT ; and stop processing this event
ELSE ; if I'm not at the left edge
IF CANGOLEFT ; is there space to the left of me?
SPRITELEFT ; if so move me left
ANIMATE ; and animate me
ENDIF
ENDIF
ENDIF
IF KEY RIGHT ; Is the right key pressed?
LET DIRECTION = RIGHT ; if so, remember I am going RIGHT
LET IMAGE = 0 ; display the right facing image
IF X >= RIGHTEDGE ; Am I at the right edge of the screen?
SCREENRIGHT ; if so go to the screen to right on the map
LET X = LEFTEDGE ; and put me at the left edge
EXIT ; and stop processing this event
ELSE ; if I'm not at the right edge
IF CANGORIGHT ; is there space to the right of me?
SPRITERIGHT ; if so, move me right
ANIMATE ; and animate me?
ENDIF
ENDIF
ENDIF
IF KEY UP ; is the UP key pressed?
ANIMATE SLOW ; if so, animate me slowly
IF LADDERABOVE ; is there a ladder above me?
IF CANGOUP ; can I go up?
LET IMAGE = 3 ; display the image of me climbing
SPRITEUP ; move me up
LET DIRECTION = UP ; remember I am going up
ELSE ; if there is a ladder above me, but I cant go up
ADD 1 TO Y ; nudge me 1 pixel to the right
ENDIF
ELSE ; if there isn't a ladder above me
SPRITELEFT ; move me left
IF LADDERABOVE ; now is there a ladder above me?
ELSE ; if not
SPRITERIGHT ; move me back where I was
SPRITERIGHT ; then a bit more to the right
IF LADDERABOVE ; now is there a ladder above me?
ELSE ; if not
SPRITELEFT ; move me back where I was
ENDIF
ENDIF
ENDIF
ENDIF
IF KEY DOWN ; is the DOWN key pressed?
ANIMATE SLOW ; if so, animate me slowly
IF LADDERBELOW ; is there a ladder below me?
LET IMAGE = 3 ; if so, set my image to the climbing one
SPRITEDOWN ; move me down
LET DIRECTION = DOWN ; remember I am going down
ELSE ; if there isn't a ladder below me
SPRITELEFT ; move me left
IF LADDERBELOW ; is there a ladder below me now?
ELSE ; if not
SPRITERIGHT ; move me back where I was
SPRITERIGHT ; then a bit more to the right
IF LADDERBELOW ; now is there a ladder below me?
ELSE ; if not
SPRITELEFT ; move me back where I was
ENDIF
ENDIF
ENDIF
ENDIF
IF KEY FIRE ; is the Fire key being pressed?
JUMP 7 ; if so, make me Jump to height 7
ENDIF
FALL ; make me fall if there is nothing below me
IF DEADLY ; am I touching something deadly?
KILL ; if so, kill me
ENDIF
GETBLOCKS ; if I touch any collectible blocks, run the Collected Block scriptPortanto, o que é importante perceber neste script é:
As instruções LET DIRECTION = são apenas uma forma de nos lembrarmos em que direção vamos, caso precisemos de a consultar noutra parte do nosso código (vamos fazê-lo mais à frente)
O código da ESCADA (LADDER) parece um pouco complicado, com um monte de instruções IF adicionais: tudo o que elas fazem é facilitar a subida de uma escada; ou seja, o jogador não precisa de estar 100% por baixo da escada para subir, o código desloca-o um par de píxeis para o ajudar a ficar em posição.
Com sorte, ao leres os comentários, ficarás com uma boa compreensão de como o movimento básico e os controlos são tratados num script do MPAGD.
