En el primer codigo, puede que dé error porque al ser destruida la ultima roca, el programa sigue buscando si hay mas, me paso algo parecido, puedes intentar agregar
Una manera que se me ocurre , seria crear un "pico", puede ser invisible o visible dependiendo de lo que busques.
entonces en el evento step del jugador colocamos:
para las rocas:
en evento create:
step event:
en esta parte la roca parpadeara para que asi la colision no le reste hp en cada frame, y solo lo haga al dejar de ser "invulnerable"
y en collision con el pico seria
el hp lo puedes colocar en las definiciones de variables, asi puedes cambiar mas facilmente cada variable su hp:

Por ultimo creamos el obj_pico, este no es necesario que tenga nada.
Código [Seleccionar]
if instance_exists(ob_roca)
ocurra lo siguiente.Una manera que se me ocurre , seria crear un "pico", puede ser invisible o visible dependiendo de lo que busques.
entonces en el evento step del jugador colocamos:
Código [Seleccionar]
if keyboard_check_pressed(ord("Q"))
{
pico = instance_create_layer(x,y,"Player",obj_pico)
}
if keyboard_check_released(ord("Q"))
{
instance_destroy(pico)
}
para las rocas:
en evento create:
Código [Seleccionar]
invulnerable = false
t=0
step event:
Código [Seleccionar]
if invulnerable == true{
t ++
image_alpha = 0
if t ==10{invulnerable = false;t=0;image_alpha=1}
}
if hp <= 0 {instance_destroy()}
en esta parte la roca parpadeara para que asi la colision no le reste hp en cada frame, y solo lo haga al dejar de ser "invulnerable"
y en collision con el pico seria
Código [Seleccionar]
if invulnerable == false {hp-=1;invulnerable = true}
el hp lo puedes colocar en las definiciones de variables, asi puedes cambiar mas facilmente cada variable su hp:

Por ultimo creamos el obj_pico, este no es necesario que tenga nada.