Minilop Retroware

MPAGD Avançado

Vamos criar uma gota de ácido mortal em MPAGD

3 de dezembro de 2021

Outro pedido do grupo de Facebook do MPAGD: um tutorial que aborde "o velho clássico da água / ácido a pingar que mata ao contacto".

Há várias abordagens para conseguir uma gota de ácido; esta agrada-me bastante. É um pouco cara em bytes porque usa bastantes fotogramas de sprite, mas podes adaptá-la com menos fotogramas e depois alterar os tempos. Mas acho que fica bastante bonita:

Primeiro precisamos de criar um sprite; a animação do sprite divide-se em três partes:

1) A gota cresce no teto

2) A gota cai para o chão

3) A gota espirra no chão

Este é o meu sprite:

Sequência 1: a gota cresce no teto:

Captura de ecrã do tutorialCaptura de ecrã do tutorialCaptura de ecrã do tutorialCaptura de ecrã do tutorial

Sequência 2: a gota cai para o chão

Captura de ecrã do tutorial

Sequência 3: a gota espirra no chão

Captura de ecrã do tutorialCaptura de ecrã do tutorialCaptura de ecrã do tutorialCaptura de ecrã do tutorial

Portanto, vamos usar um único sprite com vários fotogramas e escrever código que trate do que deve acontecer em cada sequência. Não vamos usar o comando ANIMATE; em vez disso, usaremos uma variável temporizador e incrementaremos o número do fotograma no código nos momentos certos.

Depois, quando uma gota tiver atingido o chão e a sequência do salpico tiver terminado, vamos repor o valor Y da gota, repor o fotograma a zero... e começar tudo de novo.

Vamos usar a variável de sprite DIRECTION para controlar as sequências

Vamos usar SETTINGA como variável de temporizador

e vamos guardar o valor y inicial do sprite em SETTINGB para podermos reiniciar depois de a gota de ácido salpicar o chão e assim crescer uma nova gota no teto

Aqui está o código para deixar cair (como uma gota de ácido) no evento do teu sprite:

;acid drop

SPRITEINK 68                ; bright green

IF DIRECTION = 0            ; INITIALISE THE DRIP
   LET SETTINGB = Y         ; store initial y value in SETTINGB
   LET DIRECTION = 1        ; prevent this running again
ENDIF

IF DIRECTION = 1            ; GROW THE DRIP
   ADD 1 TO SETTINGA        ; we use SA as the timer
   IF SETTINGA = 10         ; after 2/5ths of a second
      ADD 1 TO FRAME        ; increment the frame
      LET SETTINGA = 0      ; reset the timer
      IF FRAME = 4          ; have we reached frame 4?
         LET DIRECTION = 2  ; if so goto the drop routine
      ENDIF
   ENDIF
ENDIF



IF DIRECTION = 2            ; DROP ACID!
   IF CANGODOWN             ; if we haven't hit the ground 
      FALL                  ; drop down 
   ELSE                     ; if we've hit the ground
      LET DIRECTION = 3     ; start the HIT THE GROUND routine
      ADD 1 TO FRAME        ; but increment the frame first
   ENDIF
ENDIF
   
IF DIRECTION = 3            ; HIT THE GROUND
   ADD 1 TO SETTINGA        ; increment the timer
   IF SETTINGA = 5          ; every 1/5th of a second
      ADD 1 TO FRAME        ; increment the frame
      LET SETTINGA = 0      ; reset the timer
      IF FRAME = 9          ; have we reached the end of the splash animation?
         LET FRAME = 0      ; if so reset to the first frame
	 LET Y = SETTINGB   ; reset the drop
	 LET DIRECTION = 0  ; start the INITALISE DRIP routine
      ENDIF
   ENDIF
ENDIF

IF COLLISION PLAYER         ; if the player touches the acid drop
  KILL
ENDIF

Opção: aumentar a velocidade da gota

Se leste a minha análise detalhada do comando JUMP no guia para iniciantes, já sabes que podemos alterar a velocidade de um salto ou queda no ar. Isto consegue-se com a variável JUMPSPEED do sprite. Para aumentar a velocidade da queda, basta aumentar o Jumpspeed

Por exemplo, podias adicionar isto à rotina DROP ACID!....

IF DIRECTION = 2            ; DROP ACID!
   IF CANGODOWN             ; if we haven't hit the ground 
      FALL                  ; drop down 
      ADD 5 TO JUMPSPEED    ; increase the speed of the fall
   ELSE                     ; if we've hit the ground
      LET DIRECTION = 3     ; start the HIT THE GROUND routine
      ADD 1 TO FRAME        ; but increment the frame first
   ENDIF
ENDIF

OPÇÃO: criar um padrão para as gotas

Se queres ser ainda mais engenhoso, podias alterar a velocidade com que as gotas crescem no teto e a velocidade da queda usando um par de variáveis e fazendo READ delas a partir de uma instrução DATA; assim, as gotas seguiriam um padrão em vez de crescerem e caírem sempre à mesma velocidade.

Todo o MPAGD Avançado