Midiendo distancias
Clase 8 de 14 • Curso de Game Maker Studio 2: Interacción y Ataque de los Personajes
Resumen
¿Cómo implementar el comportamiento de seguimiento de un enemigo en un videojuego?
El diseño de enemigos en videojuegos es un arte y una ciencia. Implica comprender cómo crear comportamientos realistas y desafiantes que mejoren la experiencia del jugador. En esta guía, vamos a profundizar en cómo programar un comportamiento básico para un enemigo que pueda detectar la distancia de un jugador y actuar en consecuencia.
¿Cómo definimos los estados del enemigo?
Para que un enemigo en un videojuego se comporte de manera coherente, es crucial definir sus estados. En nuestro diseño actual, tenemos dos estados principales:
- Idle (Inactivo): El enemigo permanece en su lugar. Tenemos una animación asignada para este estado.
- Ataque: Este estado se activa cuando el jugador está dentro de un radio específico alrededor del enemigo.
Entre estos estados, existe una lógica de transición basada en la posición del jugador. Si el jugador está fuera de este radio, el enemigo debe cambiar a un modo de persecución.
¿Cómo medir la distancia entre el enemigo y el jugador?
Para establecer cuándo el enemigo debe perseguir o atacar, es vital calcular la distancia entre el enemigo y el jugador:
var distance = distanceToObject(obj_player);
La función distanceToObject
es crucial aquí, ya que mide la distancia desde el borde de los sprites del enemigo al del jugador. Esto es efectivo en escenarios donde tenemos un solo jugador en pantalla, pero, si existieran múltiples jugadores, la lógica de selección debería adaptarse para identificar al objetivo correcto.
¿Cómo determinamos la dirección de movimiento del enemigo?
Una vez calculada la distancia, el enemigo debería moverse hacia el jugador si este está fuera del radio predefinido:
if distance >= 150 {
var direction = point_direction(x, y, obj_player.x, obj_player.y);
x += lengthdir_x(2, direction);
y += lengthdir_y(2, direction);
}
Aquí utilizamos point_direction
para calcular la dirección hacia la cual el enemigo debe moverse. La velocidad está determinada por la función lengthdir_x
y lengthdir_y
, las cuales calculan el desplazamiento basado en la dirección y la velocidad especificadas.
¿Cómo hacemos que el enemigo "mire" hacia el jugador?
Es fundamental que el enemigo voltee visualmente en la dirección hacia la que se mueve. Esto se consigue ajustando la escala del eje X de su imagen:
image_xscale = sign(lengthdir_x(1, direction));
La función sign
nos devuelve un valor de +1 o -1, logrando así reflejar la dirección en la que se desplaza el enemigo, dando la ilusión de que se mueve naturalmente hacia el usuario.
¿Qué sucede cuando el enemigo está dentro del radio del jugador?
Si el jugador está dentro del radio, entonces el enemigo debería mantenerse en su estado idle:
else {
sprite_index = enemy_idle;
}
Esto simplifica la lógica de comportamiento, asegurando que el enemigo sólo persiga cuando el jugador está lo suficientemente lejos.
Inmediatamente después de haber configurado la lógica de persecución, es crucial gestionar la ejecución en cada paso del juego para garantizar un comportamiento fluido y constante.
¿Qué debemos comprobar al probar el juego?
Corriendo el juego deberías observar:
- El enemigo permanece quieto si está cerca del jugador.
- El enemigo persigue al jugador si este se aleja a más de 150 píxeles.
A medida que desarrolles más funciones, como el estado de ataque, el comportamiento del enemigo se volverá más sofisticado. Mejorarás la interacción del juego y el desafío para el jugador. Mantener un control claro sobre tu código y tener una comprensión profunda de las funciones de los scripts es clave para lograr un desarrollo exitoso.
¿Estás listo para implementar y ajustar el comportamiento de tu enemigo? ¡Continúa explorando, corrigiendo y mejorando mientras diseñas niveles más dinámicos y complejos!