Los comportamientos de dirección apuntan a ayudar a los personajes autónomos a moverse de una manera realista, mediante el uso de fuerzas simples que se combinan para producir una navegación improvisada y realista. En este tutorial, cubriré la huir comportamiento, que hace que el personaje se aleje de un perseguidor, y la llegada comportamiento, que hace que el personaje disminuya la velocidad y se detenga cuando se aproxima a un objetivo.
Nota: Aunque este tutorial está escrito con AS3 y Flash, debería poder utilizar las mismas técnicas y conceptos en casi cualquier entorno de desarrollo de juegos. Debes tener una comprensión básica de vectores matemáticos.
El comportamiento de búsqueda descrito anteriormente se basa en dos fuerzas que empujan al personaje hacia el objetivo: la velocidad deseada y la dirección..
desired_velocity = normalizar (destino - posición) * max_velocity direction = desired_velocity - speed
los localidad_velocidad deseada
, en este caso, es la ruta más corta entre el personaje y el objetivo. Se calcula restando la posición del objetivo de la posición del personaje. El resultado es un vector de fuerza que va desde el personaje hacia el objetivo.
El comportamiento de huida usa esas mismas dos fuerzas, pero se ajustan para hacer que el personaje corra lejos del objetivo:
Esa nueva localidad_velocidad deseada
el vector se calcula restando el caracteres posición desde el objetivo posición, que produce un vector que va desde el objetivo hacia el personaje.
Las fuerzas resultantes se calculan casi de la misma manera que en el comportamiento de búsqueda:
desired_velocity = normalizar (posición - objetivo) * max_velocity direction = desired_velocity - speed
los localidad_velocidad deseada
en ese caso, representa la ruta de escape más fácil que el personaje puede usar para huir del objetivo. La fuerza de dirección hace que el personaje abandone su ruta actual, empujándolo hacia la dirección del vector de velocidad deseado.
Comparando el vector de velocidad deseado del comportamiento de huida con el vector de velocidad deseado del comportamiento de búsqueda, se puede establecer la siguiente relación:
flee_desired_velocity = -seek_desired_velocity
En otras palabras, un vector es el negativo del otro..
Una vez calculada la fuerza de dirección, se debe agregar al vector de velocidad del personaje. Dado que esa fuerza está empujando al personaje lejos del objetivo, cada cuadro dejará de moverse hacia el objetivo y comenzará a alejarse de él, produciendo una huir camino (la curva naranja en la figura de abajo):
La adición de esas fuerzas y el cálculo de velocidad / posición final se manejan de la misma manera que antes. A continuación se muestra una demostración que muestra a varios personajes realizando el comportamiento de huida:
Cada personaje se coloca en el centro del área en movimiento con una velocidad aleatoria. Intentarán huir del objetivo (el cursor del ratón). La adición de todas las fuerzas hace que cada personaje abandone suavemente su ruta actual y huya del objetivo..
Actualmente el objetivo afecta a todos los personajes, ignorando la distancia de ellos; podría haberse limitado a un "área de efecto", donde el personaje huiría solo si está lo suficientemente cerca del objetivo.
El comportamiento de búsqueda, como hemos visto, hace que un personaje se mueva hacia un objetivo. Cuando llega al destino, la fuerza de dirección sigue actuando según las mismas reglas, haciendo que el personaje "rebote" de un lado a otro alrededor del objetivo..
los llegada el comportamiento evita que el personaje se mueva a través del objetivo. Hace que el personaje se ralentice a medida que se acerca al destino, deteniéndose finalmente en el objetivo..
El comportamiento se compone de dos fases. La primera fase es cuando el personaje está lejos del objetivo y funciona exactamente de la misma manera que lo hace el comportamiento de búsqueda (moverse a toda velocidad hacia el objetivo).
La segunda fase es cuando el personaje está cerca del objetivo, dentro del "área de desaceleración" (un círculo centrado en la posición del objetivo):
Cuando el personaje entra en el círculo, disminuye la velocidad hasta que se detiene en el objetivo..
Cuando el personaje entra en el área de desaceleración, su velocidad se reduce linealmente a cero. Esto se logra agregando una nueva fuerza de dirección (la fuerza de llegada) al vector de velocidad del personaje. El resultado de esta adición eventualmente se convertirá en cero, lo que significa que no se agregará nada a la posición del personaje en cada cuadro (por lo que no habrá movimiento):
// Si (velocidad + dirección) es igual a cero, entonces no hay velocidad de movimiento = truncar (velocidad + dirección, velocidad máxima) posición = posición + función de velocidad truncar (vector: Vector3D, max: Número): void var i: Number; i = max / vector.length; i = i < 1.0 ? i : 1.0; vector.scaleBy(i);
Para garantizar que el personaje se desacelere gradualmente antes de detenerse, la velocidad no debe ser cero inmediatamente. El proceso de desaceleración gradual se calcula en función del radio del área de desaceleración y la distancia entre el personaje y el objetivo:
// Calcule la velocidad deseada con el objeto deseado_velocidad = objetivo - distancia de posición = longitud (deseado_velocidad) // Verifique la distancia para detectar si el carácter // está dentro del área de desaceleración si (distancia < slowingRadius) // Inside the slowing area desired_velocity = normalize(desired_velocity) * max_velocity * (distance / slowingRadius) else // Outside the slowing area. desired_velocity = normalize(desired_velocity) * max_velocity // Set the steering based on this steering = desired_velocity - velocity
Si la distancia es mayor que desaceleración radio
, significa que el personaje está lejos del objetivo y su velocidad debe permanecer Velocidad máxima
.
Si la distancia es menor que desaceleración radio
, significa que el personaje ha entrado en el área de desaceleración y que su velocidad debería ser reducida.
El termino distancia / desaceleraciónRadio
variará de 1
(cuando distancia
es igual a desaceleración radio
) a 0
(cuando distancia
es casi cero). Esta variación lineal hará que la velocidad disminuya suavemente:
Como se describió anteriormente, el movimiento del personaje se realiza de la siguiente manera:
dirección = ciudad / velocidad deseada - velocidad velocidad = truncar (velocidad + dirección, velocidad máxima) posición = posición + velocidad
Si la velocidad deseada se reduce a cero, la fuerza de dirección se convierte en -velocidad
. Como consecuencia, cuando esa fuerza de dirección se agrega a la velocidad, resultará en cero, haciendo que el personaje deje de moverse.
A continuación se muestra una demostración que muestra el comportamiento de llegada:
Lo que realmente hace el comportamiento de llegada es calcular una fuerza que será igual a -velocidad
, evitando que el personaje se mueva mientras esa fuerza esté en su lugar. El vector de velocidad original del personaje no cambia y continúa funcionando, pero se anula por la adición de dirección.
Si se eleva la fuerza de dirección de llegada, el personaje comenzará a moverse nuevamente, utilizando su vector de velocidad original.
El comportamiento de huida hace que el personaje se aleje del objetivo deseado, mientras que el comportamiento de llegada lo hace más lento y se detiene en la posición del objetivo. Ambos pueden usarse para crear un escape suave o seguir patrones de movimiento, por ejemplo. También se pueden combinar para crear movimientos aún más complejos..
Este tutorial describió más sobre los comportamientos de la dirección, explicando los comportamientos de huida y llegada. En las próximas publicaciones, aprenderemos sobre más comportamientos. Manténgase actualizado al seguirnos en Twitter, Facebook o Google+.