Minilop Retroware

MPAGD Iniciantes · Parte 14 de 29

Vamos criar um jogo em MPAGD: Parte 14: Editar o script do jogador

2 de abril de 2021

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

GETBLOCKS

Vamos ver este script em detalhe na próxima Parte, mas por agora repara que o script está dividido em várias cláusulas:

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
ENDIF

Outra 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:

Além disso, cada sprite tem três parâmetros definíveis pelo utilizador, que podemos usar para o que quisermos. São:

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 script

Portanto, 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.

SEGUINTE: PARTE 15: Objetivos do jogo, DATA e READ

Todo o MPAGD Iniciantes