Creación de VideoJuegos. Godot Engine. Destrucción de enemigos

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”

Animación del enemigo llamada “dead”. Godot
Animación del enemigo llamada “dead”. Godot

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:

Nodo Timer. Godot
Nodo Timer. Godot

Conectamos con el Enemigo:

Conectamos una señal con el Enemigo. Godot
Conectamos una señal con el Enemigo. Godot

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.


ÍNDICE


0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x