Minilop Retroware

MPAGD Avanzado

Cómo hacer que caigan objetos de bonificación y mostrar mensajes llamativos en MPAGD

17 de noviembre de 2020

Un tutorial un poco distinto hoy: en lugar de centrarme en los eventos de sprites enemigos, aquí tienes un método para añadir caídas aleatorias de objetos de bonificación...y mensajes de banner llamativos en tus juegos de MPAGD.

Es algo que escribí por primera vez para Cocoa and the Time Machine y que luego mejoré en 24 Hour Parsley People.

Lo que quería conseguir era...

  1. El jugador derrota a un enemigo

  2. Cae aleatoriamente un objeto de bonificación (elegido entre 4 posibles, ponderados de modo que los más potentes caigan con menos frecuencia)

  3. El jugador recoge el objeto de bonificación

  4. El objeto de bonificación otorga energía/puntos/lo que sea

  5. Aparece un banner parpadeando en pantalla

Aquí tienes un ejemplo en acción en una pantalla de demostración, usando parte del código de mi último juego, en el que nuestro héroe Cocoa puede desviar las balas de los Agentes con el Tesla Device...y cuando se derrota a un Agente, soltamos un objeto de bonificación para que Cocoa lo recoja.

En este ejemplo tengo cuatro posibles objetos de bonificación:

Lo que nos deja con un 10% de probabilidad de que no caiga nada

Aquí está en acción:

Primero necesitaremos diseñar unos OBJECTS que se usarán como los objetos coleccionables que caen; he creado 4 objetos y los he marcado todos como 'Hidden' (porque no se colocarán en una pantalla concreta ni estarán automáticamente en el inventario del jugador)

También necesitaremos algo de texto para nuestro banner parpadeante. Voy a mantener el código lo más eficiente posible, así que será buena idea que cada número de MESSAGE corresponda a su respectivo número de OBJECT.

i.e

Así que abre tu archivo de TEXT MESSAGES, asegúrate de que empieza con DEFINEMESSAGES y añade tus mensajes. He añadido algunos espacios al principio de varios de ellos porque los vamos a imprimir en el mismo sitio de la pantalla y quiero que queden lo más centrados posible:

Captura de pantalla del tutorial

A continuación vamos a escribir un poco de código que activará nuestra rutina de bonificación. Voy a usar la variable B para la propia rutina de bonificación, y en concreto el valor 2 se usará para llamar a la rutina.

Voy a activar la rutina de bonificación cuando el enemigo muera por una bala rebotada. (Así que podría ponerlo en el evento del sprite de la bala o en el del Agente.) En este caso lo he puesto en el evento del Agente, y el sprite de la bala es de Tipo 2,

   IF COLLISION 2        ; has the bullet hit the agent?
      LET N = X          ; if so, remember the agents X & Y co-ords
      LET O = Y          ; store them in N & O
      LET B = 2          ; start the bonus routine
      REMOVE             ; remove the agent
   ENDIF

A continuación crearemos la propia rutina de bonificación, que seleccionará un objeto de bonificación aleatorio según las ponderaciones que prefiramos; tienes que ponerla en un script MAIN LOOP:

IF B = 2                           ; BONUS ROUTINE
   GETRANDOM 50                    ; get a random number from 0 to 49
   IF RND <= 19                    ; is it less than 20? (i.e. 40%)
      PUT N O 0                    ; if so, put the PARSLEY object at N O
   ELSE                            ; if not
      IF RND <= 34                 ; is it less than 35 (i.e. is it 20-34 30%)
         PUT N O 3                 ; if so, put the DEVICE FUEL CELL object at N O
      ELSE                         ; if not
         IF RND <= 40              ; is it less than 40? (i.e 35-40 or 12%)
            PUT N O 1              ; if so, put the ULTRA PARSLEY object at N O
         ELSE                      ; if not
            IF RND <= 44           ; is it less than 45? (i.e 41-44 or 8%)
               PUT N O 2           ; if so, put the ONE UP object at NO
	    ENDIF
         ENDIF
      ENDIF
   ENDIF
   LET B = 3                       ; we've slected the bonus so we change B to stop it running again
ENDIF

Así que ahora, cuando el jugador derrota al enemigo, hay un 90% de probabilidad de que se le recompense con un objeto de bonificación para recoger. La bonificación aparecerá en N,O (que eran las coordenadas x e y del AGENTE cuando fue neutralizado).

Ahora añadiremos algo de código al evento del jugador que gestionará lo que ocurre cuando el jugador recoge su bonificación:

DETECTOBJ                    ; has the player touched an object?
IF OBJ <> 255                ; is it valid?
   BEEP 25                   ; make a sound
   GET OBJ                   ; collect the object
   IF OBJ = 0                ; is it the standard parsley?
      ADD 33 TO L            ; if so, increase health by 33
   ENDIF
   IF OBJ = 1                ; is it the mega parsley?         
      LET L = 99             ; if so, max the health
   ENDIF
   IF OBJ = 2                ; is it the one-up?               
      ADD 1 TO LIVES         ; add an extra life
   ENDIF
   IF OBJ = 3                ; is it the device fuel cell?                 
      ADD 33 TO V            ; increase the device power by 33
   ENDIF
   IF OBJ > 0                ; if it was a Bonus drop object collectded
      IF OBJ <= 3
	 LET B = 5           ; trigger the banner
         LET N = OBJ      ; we'll store the object number in N so that we can call the correct message in the banner
      ENDIF
   ENDIF
ENDIF

Bien, eso gestionará la recompensa del jugador cuando recoja la bonificación; ahora queremos imprimir en pantalla un banner llamativo, por diversión

Volvamos al script MAIN LOOP y, debajo de nuestro IF B=2 ...ENDIF, añadamos el código del banner:

IF B = 5            ; the banner routine
   PRINTMODE 1      ; let's use big text!
   GETRANDOM 8      ; get a random number from 0 to 7
   INK RND          ; make the ink that colour
   AT 9 9           ; this is where the banner will appear on screen
   MESSAGE N        ; display the objects corresponding message
   ADD 1 TO C       ; we'll use C as a counter
   IF C = 30        ; has the banner flashed 30 times?
      LET C = 0     ; reset the counter
      LET B = 0     ; end the bonus
      REDRAW        ; remove the banner from the screen
      PRINTMODE 0   ; go back to normal text size
   ENDIF   
ENDIF

Como puedes ver en el código de arriba, uso la variable C como contador para que el banner parpadee 30 veces. Elegí este método en lugar de un bucle REPEAT porque quería que el juego continuara mientras el banner está activo, en vez de tener que esperar a que termine el banner antes de seguir.

Y eso es todo en su forma más simple.

Obviamente, puedes personalizarlo a tu gusto. Uso la rutina del banner para varias otras cosas durante mis juegos, pero en esencia así es como lo hago.

¡Espero que te sirva de ayuda!

Todo MPAGD Avanzado