Minilop Retroware

MPAGD Principiantes · Parte 25 de 29

Vamos a crear un juego con MPAGD, Parte 25: PLOT de un medidor de pureza del aire

2 de noviembre de 2021

Vale, esto puede ser un reto, pero por suerte el excelente Jonathan Cauldwell, el desarrollador de AGD, publicó un vídeo de YouTube sobre cómo crear barras de energía y de tiempo, etc. en MPAGD que voy a usar sin vergüenza como base para este tutorial.

Para Stinky Dog quiero un “Medidor de toxicidad del aire” que mida lo tóxico que se ha vuelto el aire de la habitación por culpa de los pedos de Stinky Dog. La pureza del aire tiene que poder subir y bajar, y quiero mostrarla como un medidor.

Para empezar, necesitaremos una variable que mida el nivel actual de pureza del aire; usaremos “P”.

Para dibujar el medidor, también necesitaremos una variable que guarde la coordenada y. No podemos usar “Y” porque está reservada, así que usaremos Q.

Después usaremos el comando PLOT para dibujar una serie de píxeles que formarán el medidor. PLOT P Q dibujará un píxel en la coordenada de pantalla donde x = P e y = Q.

Ahora ampliaremos la rutina para que cambie los valores de P y Q y dibuje el medidor:

Como cada vez que empezamos una pantalla queremos que el aire esté al 100% de pureza, el mejor sitio para inicializarlo será el evento RESTART SCREEN. Pon 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

Así que empezamos con P (la coordenada x) a 0 y Q a 178.

¿Por qué 178? Recuerda que el valor y en una pantalla del Spectrum va de arriba abajo, de 0 a 191. Quiero que la barra tenga 4 píxeles de alto empezando en y = 178

El bucle WHILE...ENDWHILE exterior asegura que dibujemos una barra de 100px de ancho; el bucle END...WHILE interior asegura que la barra tenga 4px de alto.

Vale, eso debería dibujar el medidor de pureza del aire cuando empiece la pantalla.

¿Cómo hacemos que el medidor suba y baje?

Hagamos que el medidor baje (es decir, que el aire se vuelva más tóxico) cuando Stinky Dog se tire un pedo.

Si recuerdas, en la Parte 16 usamos una variable (F) para indicar que había un pedo (Fart) en pantalla. Así que si comprobamos si F = 1 sabremos que hay un pedo en juego y, en ese caso, ejecutaremos código que reduzca la pureza del aire.

Vamos a poner este código en nuestro Main Loop 2, para que se ejecute al final de cada ciclo. Puede que lo movamos más adelante, pero esto debería 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

También añadiremos código al PLAYER EVENT que matará a Stinky Dog si el aire se vuelve demasiado tóxico...

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

¿Y qué pasa con subir el medidor?

Voy a crear un OBJECT nuevo, un bote de ambientador, que mejorará la pureza del aire si Stinky Dog lo coge. Algo así debería servir por ahora:

Captura de pantalla del tutorial

También he puesto la posición inicial de este objeto en la Screen 0 (haz clic en el cuadro blanco para pasar a la Room 0, pulsa P para ir a la sala y haz clic en la sala donde quieras que esté su posición inicial.

Como hicimos en la PARTE 17, vamos a añadir código al evento Player que controle qué debe pasar si Stinky Dog recoge 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 probar...

Espero que hayas notado que el medidor baja cuando el pedo está en juego y subió 20px cuando recogimos el ambientador.

Con esto basta por ahora. No me voy a obsesionar con cuánto sube y baja; ahora que las mecánicas básicas funcionan, siempre podemos ajustarlo más tarde. También rediseñaremos la barra para que quede mejor. Eso es solo cosmética, ¡lo difícil ya está hecho!

Además, cuando el medidor llegó al borde izquierdo, Stinky Dog murió.

Ya hay unas cuantas formas de matarlo, así que probablemente sea buena idea mejorar la rutina de muerte, porque ahora mismo reaparece al instante si aún nos quedan vidas.

Todo MPAGD Principiantes