Minilop Retroware

MPAGD Iniciantes · Parte 25 de 29

Vamos criar um jogo com MPAGD, Parte 25: PLOT de um medidor de pureza do ar

2 de novembro de 2021

Ok, isto pode ser um desafio, mas felizmente o excelente Jonathan Cauldwell, o programador do AGD, publicou um vídeo no YouTube sobre como criar barras de energia e de tempo, etc. no MPAGD que vou usar descaradamente como base para este tutorial.

Para o Stinky Dog, quero um “Medidor de toxicidade do ar” que meça quão tóxico o ar da sala se tornou por causa dos peidos do Stinky Dog. A pureza do ar tem de poder subir e descer, e quero mostrá-la como um medidor.

Para começar, vamos precisar de uma variável que meça o nível atual de pureza do ar; vamos usar “P”.

Para desenhar o medidor, vamos também precisar de uma variável que guarde a coordenada y. Não podemos usar “Y” porque está reservada, por isso vamos usar Q.

Depois vamos usar o comando PLOT para desenhar uma série de píxeis que formarão o medidor. PLOT P Q desenha um píxel na coordenada do ecrã em que x = P e y = Q.

Agora vamos ampliar a rotina para que altere os valores de P e Q e desenhe o medidor:

Como de cada vez que começamos um ecrã queremos que o ar esteja a 100% de pureza, o melhor sítio para o inicializar será o evento RESTART SCREEN. Coloca este código...

LET P = 0            ; initial air purity level
WHILE P < 100        ; has P reached 100 yet?
   LET Q = 178       ; starting y co-ord for meter
   WHILE Q < 182     ; ending y co-ord for meter
      PLOT P Q       ; put a dot at P Q
      ADD 1 TO Q     ; increment Q
   ENDWHILE          ; keep doing this until weve drawn 4px
   ADD 1 TO P        ; increment P
ENDWHILE             ; keep doing this until P reaches 100

Assim, começamos com P (a coordenada x) a 0 e Q a 178.

Porquê 178? Lembra-te de que o valor y num ecrã do Spectrum vai de cima para baixo, de 0 a 191. Quero que a barra tenha 4 píxeis de altura, começando em y = 178

O ciclo WHILE...ENDWHILE exterior garante que desenhamos uma barra com 100px de largura; o ciclo END...WHILE interior garante que a barra tem 4px de altura.

Ok, isto deve desenhar o medidor de pureza do ar quando o ecrã começar.

Como fazemos o medidor subir e descer?

Vamos fazer o medidor descer (ou seja, o ar tornar-se mais tóxico) quando o Stinky Dog peidar.

Se te lembras, na Parte 16 usámos uma variável (F) para indicar que havia um peido (Fart) no ecrã. Por isso, se testarmos se F = 1 ficamos a saber que há um peido em jogo e, nesse caso, executamos código que reduz a pureza do ar.

Vamos colocar este código no nosso Main Loop 2, para que seja executado no fim de cada ciclo. Talvez o mudemos mais tarde, mas isto deve funcionar...

IF F = 1               ; is there a fart in play?
   SUBTRACT 1 FROM P   ; if so, reduce air purity by 1
   LET Q = 178         ; y co-ord start at 178
   WHILE Q < 182       ; run this 4 times
      PLOT P Q         ; plot a pixel at P Q
      ADD 1 TO Q       ; increment Q (the y value)
   ENDWHILE
ENDIF

Vamos também acrescentar código ao PLAYER EVENT que mata o Stinky Dog se o ar se tornar demasiado tóxico...

   IF P <= 0           ; if air purity is 0
      KILL             ; kill stinky dog
   ENDIF

E que tal fazer o medidor subir?

Vou criar um novo OBJECT, uma lata de ambientador, que melhora a pureza do ar se o Stinky Dog a apanhar. Algo como isto deve servir por agora:

Captura de ecrã do tutorial

Também coloquei a posição inicial deste objeto no Screen 0 (clica na caixa branca para passar à Room 0, prime P para ir para a sala e clica na sala onde queres que fique a sua posição inicial.

Tal como fizemos na PARTE 17, vamos acrescentar código ao evento Player que controla o que deve acontecer se o Stinky Dog apanhar este Object:

DETECTOBJ            ; is sprite touching an object?
IF OBJ <> 255        ; did we detect an object?
   GET OBJ           ; automatically pick it up.
   IF OBJ = 0        ; is it the Dog Bowl
     AT 10 4         ; at line 10 column 4
     COLOUR 13       ; green ink on blue paper
     PRINT "you got the dog food bowl!"   ; display a message
     DELAY 50        ; wait a couple of seconds
     WAITKEY         ; then wait for a key press
     REDRAW          ; redraw the screen & remove the message
   ENDIF
   
   IF OBJ = 2           ; air freshner
      REPEAT 20         ; do this 20 times
      IF P < 100        ; prevent P from exceeding 100
         LET Q = 178    ; starting y-co-ord
         WHILE Q < 182  ; do this 4 times
            PLOT P Q    ; plot a pixel
	    ADD 1 TO Q  ; increment the y co-ord
         ENDWHILE
         ADD 1 TO P     ; increment the x co-ord
      ENDIF
      ENDREPEAT
   ENDIF
ENDIF

Hora de testar...

Espero que tenhas reparado que o medidor desce quando o peido está em jogo e subiu 20px quando apanhámos o ambientador.

Por agora chega. Não me vou prender à quantidade que sobe e desce; agora que as mecânicas básicas funcionam, podemos sempre afiná-lo mais tarde. Também vamos redesenhar a barra para ficar com melhor aspeto. Isso é só cosmética, o trabalho difícil já está feito!

Além disso, quando o medidor chegou ao limite esquerdo, o Stinky Dog morreu.

Já há algumas formas de o matar, por isso provavelmente é boa ideia melhorar a rotina de morte, porque neste momento ele reaparece instantaneamente se ainda tivermos vidas.

Todo o MPAGD Iniciantes