Tema 25. Godot Engine. Destrucción de enemigos
En este tema veremos cómo eliminar a los enemigos. Es importante disponer de una animación cuando el personaje muera ya que da mayor calidad al juego.
Crearemos una animación llamada “dead”
En el Script Enemigo hacemos lo siguiente:
extends KinematicBody2D var gravedad = 10 var speed = 30 var suelo = Vector2(0,-1) var velocidad = Vector2() var direccion = 1 var is_dead = false # Called when the node enters the scene tree for the first time. func _ready(): pass # Replace with function body. func dead(): is_dead = true velocidad= Vector2(0,0) $AnimatedSprite.play(«dead») # Called every frame. ‘delta’ is the elapsed time since the previous frame. func _process(delta): if is_dead == false: velocidad.x = speed * direccion if direccion == 1: $AnimatedSprite.flip_h = true else: $AnimatedSprite.flip_h = false $AnimatedSprite.play(«idle») velocidad.y += gravedad velocidad = move_and_slide(velocidad,suelo) if is_on_wall(): direccion = direccion * -1 $RayCast2D.position.x *=-1 if $RayCast2D.is_colliding() == false: direccion = direccion * -1 $RayCast2D.position.x *=-1 |
Creamos una variable is_dead para indicar si el enemigo se muere
Una función dead() que será pondrá la variable is_dead a muerto y animaremos el Sprite dead
Ahora tenemos que identificar cuando un Proyectil toca un Enemigo. Para eso vamos al Script del Proyectil y vamos a la función que hace esta acción:
func _on_Proyectil_body_entered(body): queue_free() |
Y la modificamos:
func _on_Proyectil_body_entered(body): if «Enemigo1» in body.name: body.dead() queue_free() |
Si he clonado diversos enemigos y los he renombrado como Enemigo1, Enemigo2… tendremos que repetir la condición para cada uno de ellos.
Si se llaman de la misma forma y simplemente se arrastra el mismo nodo varias veces a la escena, con el código anterior será suficiente para matarlos ya que el nombre del Nodo será el mismo. Todo depende de cómo lo hayamos implementado.
Creamos un Nodo hijo de tipo Timer que nos permitirá llamar a una función determinada cuando se agote el tiempo. En este caso podemos indicar al Nodo enemigo que cuando pasen 2 segundos, lo elimine.
El Timer tiene una propiedad para asignarle el número de segundos que queramos:
Conectamos con el Enemigo:
Y en el Script Enemigo en la función dead(), desactivamos el CollisionShape2D del enemigo para que el Player ya no colisione con él. Y activamos el Timer para que empiece a contar los segundos de borrado del enemigo.
func dead(): is_dead = true velocidad= Vector2(0,0) $AnimatedSprite.play(«dead») $CollisionShape2D.disabled = true #Godot <3.1 $Timer.start() |
NOTA Godot 3.1:
la función $CollisionShape2D.disabled = true no funciona en Godot 3.1 >
se debe reemplazar por:
$CollisionShape2D.set_deferred(“disabled”,true)
En el conector del Timer, cuando termina el tiempo, borra el enemigo.
func _on_Timer_timeout(): queue_free() |
En vez de usar el Timer, también podemos usar un conector como se hizo en temas anteriores e indicar que cuando se termine la animación “dead”, se borre el enemigo.