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:




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

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




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
ENDIFOpçã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
ENDIFOPÇÃ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.
