Game Maker – Crear instancia cuando la salud es 0

Tengo cinco objects: obj_Boss , obj_bossHealth , obj_GameOver , obj_BtnOK y obj_rec2 .

Esto es lo que quiero. Cuando obj_Boss no tenga más salud, obj_GameOver y obj_BtnOK aparecerán.

Este es mi primer método:

En obj_bossHealth , tengo estos events:

Crear evento: establezca var global.bossHealth to 100

Evento de sorteo: draw_healthbar

En obj_Boss , tengo estos events:

Colisión con obj_rec2 : establecer var global.bossHealth relative to -1.5 ; destruir la instancia (otro)

No More Health: crea una instancia de obj_GameOver ; crear instancia de obj_BtnOK

Este es mi segundo método:

En obj_bossHealth , tengo estos events:

Crear evento: establezca var global.bossHealth to 100

Evento de sorteo: draw_healthbar

Paso Evento: si global.bossHealth is equal to 0 entonces crea una instancia de obj_GameOver y crea una instancia de obj_BtnOK

En obj_Boss , tengo estos events:

Colisión con obj_rec2 : establecer var global.bossHealth relative to -1.5 ; destruir la instancia (otro)

El resultado de ambos methods:

obj_GameOver y obj_BtnOK no aparecerán. ¿Cómo puedo arreglar esto? Por favor explica tu respuesta. Gracias.

Añado algunas imágenes: method1 method2

La razón por la que su obj_GameOver y obj_BtnOK no aparecerán es porque está marcando la variable incorrecta. El evento No More Health se activa al verificar el valor de la health variable. De la documentation de YoYo :

No más salud

GameMaker: Studio tiene un sistema de salud integrado, que, como Lives above, es básicamente una variable de scope global que se crea para usted al inicio de un juego. Hay acciones para establecer y cambiar la variable de salud, así como para dibujar una barra de salud, con un código disponible para cambiarlas también si prefiere usar GML. Este evento se desencadena siempre que la salud sea menor o igual a 0. Normalmente se usa para networkingucir el número de vidas o reiniciar el juego o la sala.

Dado que en el primer método está trabajando con la variable global.bossHealth , que fue definida por usted , en lugar de health , una variable incorporada modelada alnetworkingedor de las funcionalidades del framework GM: S, no hay absolutamente ninguna posibilidad de que su Evento No More Health ser activado Si establece global.bossHealth en 0 o less, la health seguirá siendo 100 o algo más.

Al ser la variable de health única en cualquier lugar desde donde la leas / escribas, es por eso que recomiendo tu segundo método.

Es solo un asunto de matemáticas

La razón por la que tus botones no aparecerán es solo un problema matemático: si tu bossHealth comienza desde 100 y restas 1.5 por golpe, llegaremos al punto donde obj_Boss ha sido golpeado 66 veces. Entonces, la cantidad de salud que perdió el Jefe es:

66 [aciertos] * 1.5 [daño por golpe] = 99 [daño]

En este punto, su salud será:

100 [salud] – 99 [daño] = 1 [salud]

Y aquí viene el problema: si el Jefe es golpeado de nuevo, su salud será:

1 – 1.5 = -0.5

Pero como está comprobando que global.bosHealth sea ​​igual a 0, esta condición nunca se evaluará como verdadera.

La solución

Esto es MUY simple: solo edite su condición para global.bossHealth valor de global.bossHealth : no solo verifique si es igual a cero, pero menor o igual a .

En el evento Step del object obj_bossHealth , su código se verá de la siguiente manera:

 // Step event - Check health if (global.bossHealth <= 0) { instance_create(x1,y1,obj_GameOver); instance_create(x2,y2,obj_BtnOK); } 

Aquí, x1 , y1 , x2 e y2 están destinados a establecerse en los valores correctos para sus objects.

No he trabajado antes en GameMaker Studio, pero al observar tu captura de pantalla, parece que cuando obj_rec2 colisiona con obj_Boss literalmente establece bossHealth en -1.5, de modo que después de la colisión, bossHealth = -1.5. Por lo tanto, bossHealth nunca llega a 0 para crear instancias de obj_BtnOK y obj_GameOver