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 su AnimatedSprite y su CollisionShape2D
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:
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:
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 |
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
Este Nodo crea un objeto con una flecha que podemos mover alrededor del enemigo:
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.
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.