IA básica de enemigo - Juego de Plataformas 2D (4)


La inteligencia artificial es algo necesario en muchos juegos de plataformas para hacer enemigos o ayudantes, y enriquecer la experiencia de juego. No soy un experto en el tema, pero en algo les puedo ayudar.
> El proyecto que puedes usar como guía se encuentra aquí.

Creando los nodos


El enemigo es un KinematicBody2D. Su diferencia con el jugador se encuentra por un nuevo nodo: "Raycast2D" un collider en forma de línea que podemos usar para detectar colisiones con Areas2D o cuerpos físicos.

Así es como los tengo puestos en el enemigo:

Cuando algo entra en la zona de esa línea, se retorna el valor del nodo para que hagamos lo que queramos. Si el jugador entra en el campo del enemigo (la línea del centro) será perseguido. De lo contrario el enemigo sólo cambiara la posición cuando sus RayCasts para el piso detecten que no hay nada para pisar.

Haciendo el script

Cuando entramos en el script del enemigo vamos a encontrar una parte del movimiento usado por el jugador. Con la diferencia de que "MoveX" no se cambia por el teclado, sino por los resultados de los Raycasts.

Si el buscador esta colisionando con algo que se encuentre en el grupo de jugador, comprobamos la posición horizontal del jugador: en caso de que sea 100 y en el enemigo sea 98 se cumple que la posición del jugador es mayor y por lo tanto se encuentra en la derecha. En caso de que el enemigo este en 158 y el jugador en 100, la condición del mayor no se cumple, por lo tanto podemos ir a la izquierda. con "is_colliding()" vamos a recibir un valor booleano para saber si estamos colisionando y con "get_collider" vamos a poder trabajar con el nodo que entró en la colisión de "buscador_jugador" que es un RayCast2D

Cuando se cumple que el jugador se encuentra en la derecha, no hace falta voltear nuestro Sprite (ya que esa imagen que tengo esta volteada a la derecha por defecto), pero tenemos que cambiar el moveX para que al momento de calcular el movimiento, le cambie la dirección. Además le vamos a dar una aceleración para que parezca interesado en los pixeles del jugador xD.

Detectando suelo


Este código se esta ejecutando todo el tiempo, cuando uno de los dos RaysCast no detecte el suelo, va a cambiar la dirección del movimiento e imagen. Es casi lo mismo que hicimos con el detector del jugador.

Activando la recuperación del jugador


Recordemos que al tener una colisión, el move_and_slide retorna un diccionario con valores que podemos usar: primero vamos a comprobar el lugar donde se produjo la colisión con "get_collider["normal"]" el "normal" es un valor en Vector2 que nos dice la dirección (izquierda,derecha,arriba,abajo) donde hemos chocado con el cuerpo físico. Si hemos chocado en la izquierda (-1 en eje X) o en la derecha (1 en eje X) y el collider del cuerpo se encuentra en el grupo de jugadores, entonces has todo.

Primero hay que comprobar que el jugador no se encuentre recuperándose, le quitamos una vida y ejecutamos la recuperación accediendo al nodo del jugador y usando las variables de su script. Además le voy a poner un salto en su "velocidad.y" para que entienda que esta siendo atacado.

NOTA: Cuando accedemos con get_node() (ahora simplemente $"") a un nodo, vamos a poder obtener los valores de sus parámetros como nodo y las variables del script que tenga activo. Usando los los puntos ($"../") estamos retrocediendo en el nivel de ubicación, como el nodo del jugador se encuentra fuera del enemigo, tenemos que retroceder.

Hasta aquí el artículo de hoy. Espero que mi ayuda les sea de utilidad, si tienen una duda la pueden dejar en los comentarios.

Desde el Nautilus, me despido

Comentarios

Entradas populares de este blog