Creación de Videojuegos. Godot Engine. Enemigos

Tema 24. Godot Engine. Enemigos

¿Qué hacemos en un juego sin enemigos? Los enemigos es una parte fundamental de cualquier videojuego. Y hay muchas formas de implementarlos según sus características.

Para crear un enemigo usaremos una nueva Escena y crearemos un Nodo de tipo KinematicBody2D

Crearemos un Nodo de tipo KinematicBody2D. Godot
Crearemos un Nodo de tipo KinematicBody2D. Godot

Crearemos su AnimatedSprite y su CollisionShape2D

AnimatedSprite y su CollisionShape2D. Godot
AnimatedSprite y su CollisionShape2D. Godot

Creamos el Script en el Enemigo con el siguiente código, es muy parecido al que se hizo con el Player.

extends KinematicBody2D

var gravedad = 10
var speed = 30
var suelo = Vector2(0,-1)
var velocidad = Vector2()

# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.


# Called every frame. ‘delta’ is the elapsed time since the previous frame.
func _process(delta):
velocidad.x = speed
$AnimatedSprite.play(«idle»)
velocidad.y += gravedad
velocidad = move_and_slide(velocidad,suelo)

Arrastramos el Nodo Enemigo_1 a la escena principal:

Enemigo_1 en la escena principal. Godot
Enemigo_1 en la escena principal. Godot

Observaremos que el Enemigo se mueve hacia la derecha hasta encontrar una pared.

Si creamos una plataforma y ponemos al enemigo encima, observaremos que se desplaza hacia la derecha y cuando llega al final de la plataforma cae, y sigue desplazándose hasta encontrar una pared:

Enemigo sobre la plataforma. Godot
Enemigo sobre la plataforma. Godot
Enemigo cae de la plataforma. Godot
Enemigo cae de la plataforma. Godot

Si nos fijamos la orientación del enemigo no está bien ya que está mirando hacia la izquierda cuando se mueve hacia la derecha. Vamos a rectificar usando el siguiente código:

func _process(delta):
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)

Ahora cuando llegue a una pared, haremos que se mueva en dirección contraria. Le indicamos que si llega a la pared cambie la dirección.

if is_on_wall():
    direccion = direccion * -1
Le indicamos que si llega a la pared cambie la dirección. Godot
Le indicamos que si llega a la pared cambie la dirección. Godot
El enemigo cambia de dirección al tocar la pared. Godot
El enemigo cambia de dirección al tocar la pared. Godot

Ahora irá rebotando en las paredes y cambiará de sentido.

POSICIÓN DEL ENEMIGO ENCIMA DE UNA PLATAFORMA Y QUE NO CAIGA

Hay un Nodo que nos permite testear dónde se encuentra un objeto. Ahora situaremos al enemigo encima de la plataforma marrón y que no caiga. 

Para ello usaremos el Nodo RayCast2D

Creamos el Nodo en el Enemigo

Usaremos el Nodo RayCast2D. Godot
Usaremos el Nodo RayCast2D. Godot

Este Nodo crea un objeto con una flecha que podemos mover alrededor del enemigo:

RayCast2D: objeto con una flecha que podemos mover alrededor del enemigo. Godot
RayCast2D: objeto con una flecha que podemos mover alrededor del enemigo. Godot

Vamos a Activarlo desde las propiedades. Tambiń podemos hacerlo desde el código.

Veremos que hay una propiedad Cast to x, Cast to y que nos pemite dimensionar(ajustar la flecha a una posición). Esa posición será la que iremos comprobando desde el código para que cuando el objeto enemigo (castRay) no colisiones con algún otro objeto lo sepa.

func _process(delta):
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

Si el enemigo toca una pared el enemigo cambia de dirección y enseguida invertimos el Ray Cast a la izquierda (esto lo hacemos multiplicando por -1 la posicion x del RayCast) $RayCast2D.position.x *=-1

Cuando el RayCast2D no colisiona con algún objeto (es porque llega al final de la plataforma), entonces no cae porque cambia de dirección. Enseguida invertimos la posición.x del Raycast a la derecha.

Enemigo moviéndose encima de la plataforma. Godot
Enemigo moviéndose encima de la plataforma. Godot
Enemigo moviéndose encima de la plataforma sin caer. Godot
Enemigo moviéndose encima de la plataforma sin caer. Godot
Enemigo moviéndose encima de la plataforma sin caer. Godot
Enemigo moviéndose encima de la plataforma sin caer. Godot

Si situamos el personaje encima de cualquier plataforma, cuando llegue al borde de la misma, no caerá y cambiará de dirección. Podemos desactivar (false) esta opción desde el código en cualquier momento si queremos que caiga. La propiedad del RayCast2D es: enabled

Ahora podemos diseñar nuestro escenario con muchas plataformas y duplicar el objeto Enemigo varias veces por el escenario y situarlo en diferentes posiciones.

Situamos varios enemigos sobre las plataformas moviéndose sin caer. Godot.
Situamos varios enemigos sobre las plataformas moviéndose sin caer. Godot.

ÍNDICE


0 0 votes
Calificación del artículo
Suscribirse
Notify of
guest
0 Comentarios
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x