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...
El jugador derrota a un enemigo
Cae aleatoriamente un objeto de bonificación (elegido entre 4 posibles, ponderados de modo que los más potentes caigan con menos frecuencia)
El jugador recoge el objeto de bonificación
El objeto de bonificación otorga energía/puntos/lo que sea
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:
Standard Parsley (restaura 1/3 de la salud): 40% de probabilidad de caer
Mega Parsley (restaura toda la salud): 12% de probabilidad de caer
Device fuel cell (restaura 1/3 de la energía del dispositivo): 30% de probabilidad de caer
One Up (una vida extra): 8% de probabilidad de caer
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
OBJECT 0 (Standard Parsley ) MESSAGE 0
OBJECT 1 (Ultra Parsley) MESSAGE 1
OBJECT 2 (Standard Parsley ) MESSAGE 2
OBJECT 3 (Ultra Parsley) MESSAGE 3
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:

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
ENDIFA 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
ENDIFAsí 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
ENDIFBien, 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
ENDIFComo 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!
