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 100Así 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
ENDIFTambié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:

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
ENDIFHora 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.
