Además de la capacidad de seguir un camino, un personaje (o un grupo de ellos) también necesita poder seguir un personaje específico (como un líder de escuadrón). Esto se puede lograr usando el líder siguiendo Comportamiento, que explicaré en este tutorial..
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 siguiente del líder es una composición de otras fuerzas de dirección, todas dispuestas para hacer que un grupo de personajes siga a un personaje específico (el líder). Un enfoque ingenuo usaría búsqueda o búsqueda para crear un patrón de seguimiento, pero el resultado no es lo suficientemente bueno.
En el comportamiento de búsqueda, un personaje es empujado hacia un objetivo, ocupando finalmente la misma ubicación que ese objetivo. El comportamiento de búsqueda, por otro lado, empuja a un personaje hacia otro personaje, pero apunta a atraparlo (basado en predicciones) en lugar de simplemente seguirlo.
En el comportamiento de líder del líder, el objetivo es mantenerse lo suficientemente cerca del líder, pero ligeramente detrás de esto. El personaje también debe moverse más rápido hacia el líder cuando está distante, pero debe disminuir la velocidad cuando la distancia es pequeña. Todo esto se puede lograr mediante la combinación de tres comportamientos de dirección:
Las siguientes secciones explican cómo cada uno de estos comportamientos se combinan para crear el siguiente patrón líder..
Un personaje debe tratar de mantenerse ligeramente detrás del líder durante el siguiente proceso, como un ejército que se queda detrás de su comandante. El punto a seguir (llamado detrás
) se puede calcular fácilmente en función de la velocidad del objetivo, ya que también representa la dirección del personaje. Compruebe el pseudo-código:
tv = leader.velocity * -1; tv = normalizar (tv) * LEADER_BEHIND_DIST; detrás = leader.position + tv;
Si el vector de velocidad se multiplica por -1
, el resultado es el inverso del vector de velocidad. Ese vector resultante (llamado televisión
) se puede normalizar, escalar en consecuencia y agregar a la posición actual del personaje.
Aquí hay una representación visual del proceso:
Operaciones de vectores involucradas en encontrar el lugar correcto a seguir..El mayor LEADER_BEHIND_DIST
es decir, cuanto mayor es la distancia entre el líder y el punto de atrás es. Como los personajes seguirán ese punto, cuanto más distante esté del líder, más distantes estarán los personajes del líder..
El siguiente paso es hacer que un personaje siga al líder. detrás
punto. Al igual que todos los demás comportamientos, el siguiente proceso será guiado por una fuerza, generada por el followLeader ()
método:
función privada followLeader (leader: Boid): Vector3D var tv: Vector3D = leader.velocity.clone (); var force: Vector3D = nuevo Vector3D (); // Calcula el punto trasero tv.scaleBy (-1); tv.normalize (); tv.scaleBy (LEADER_BEHIND_DIST); behind = leader.position.clone (). add (tv); // Crea una fuerza para llegar al punto de atrás force = force.add (llega (detrás)); fuerza de retorno
El método calcula el detrás
Punto y crea una fuerza para llegar a ese punto. los seguir Líder
La fuerza se puede agregar a la fuerza de dirección del personaje, al igual que todos los demás comportamientos:
dirección = nada (); // el vector nulo, que significa "magnitud de fuerza cero" dirección = dirección + followLeader (); dirección = truncar (dirección, fuerza máxima) dirección = dirección / velocidad de la masa = truncar (velocidad + dirección, velocidad máxima) posición = posición + velocidad
El resultado de esa implementación es un grupo de personajes que pueden llegar al líder detrás
punto:
Cuando los personajes están muy cerca uno del otro mientras siguen al líder, el resultado puede parecer poco natural. Dado que todos los personajes estarán influenciados por fuerzas similares, tienden a moverse de manera similar, formando un "blob". Este patrón se puede arreglar usando la separación, una de las reglas que guían el comportamiento de flocado.
La fuerza de separación evita que un grupo de personajes se amontone, por lo que mantienen una cierta distancia entre sí. La fuerza de separación se puede calcular como:
separación de funciones privadas (): Vector3D var force: Vector3D = nuevo Vector3D (); var neighborCount: int = 0; para (var i: int = 0; i < Game.instance.boids.length; i++) var b :Boid = Game.instance.boids[i]; if (b != this && distance(b, this) <= SEPARATION_RADIUS) force.x += b.position.x - this.position.x; force.y += b.position.y - this.position.y; neighborCount++; if (neighborCount != 0) force.x /= neighborCount; force.y /= neighborCount; force.scaleBy( -1); force.normalize(); force.scaleBy(MAX_SEPARATION); return force;
La fuerza de separación se puede añadir a la seguir Líder
fuerza, haciéndolo capaz de empujar a los personajes alejándose unos de otros al mismo tiempo que intenten llegar al líder:
función privada followLeader (leader: Boid): Vector3D var tv: Vector3D = leader.velocity.clone (); var force: Vector3D = nuevo Vector3D (); // Calcula el punto trasero tv.scaleBy (-1); tv.normalize (); tv.scaleBy (LEADER_BEHIND_DIST); behind = leader.position.clone (). add (tv); // Crea una fuerza para llegar al punto de atrás force = force.add (llega (detrás)); // Añadir fuerza de separación fuerza = fuerza.add (separación ()); fuerza de retorno
El resultado es un patrón de seguimiento mucho más natural:
Caracteres siguiendo al líder utilizando la separación. Mueve el cursor del ratón para guiar al líder. Haga clic para mostrar fuerzas.Si el líder cambia repentinamente la dirección actual, existe la posibilidad de que los personajes terminen interponiéndose en el camino del líder. Dado que los personajes siguen al líder, no tiene sentido permitirles permanecer frente al líder.
Si algún personaje se interpone en el camino del líder, debe alejarse inmediatamente para despejar la ruta. Esto se puede lograr utilizando el comportamiento de evasión:
Evadiendo la ruta del líder.Para verificar si un personaje está a la vista del líder, usamos un concepto similar a cómo detectamos obstáculos en el comportamiento de evitación de colisión: en función de la velocidad y dirección actuales del líder, proyectamos un punto delante de él (llamado adelante
); si la distancia entre el líder adelante
punto y el personaje es menor que 30
, por ejemplo, entonces el personaje está a la vista del líder y debe moverse.
los adelante
punto se calcula exactamente como el detrás
punto, con la diferencia de que el vector de velocidad no se invierte:
tv = leader.velocity; tv = normalizar (tv) * LEADER_BEHIND_DIST; adelante = leader.position + tv;
los followLeader ()
El método debe actualizarse para comprobar si el personaje está a la vista del líder. Si eso sucede, la variable. fuerza
(representando la siguiente fuerza) se agrega por el retorno de evadir (líder)
, que devuelve una fuerza para evadir la ubicación del líder:
función privada followLeader (leader: Boid): Vector3D var tv: Vector3D = leader.velocity.clone (); var force: Vector3D = nuevo Vector3D (); // Calcular el punto adelante tv.normalize (); tv.scaleBy (LEADER_BEHIND_DIST); adelante = leader.position.clone (). add (tv); // Calcula el punto trasero tv.scaleBy (-1); behind = leader.position.clone (). add (tv); // Si el personaje está a la vista del líder, agregue una fuerza // para evadir la ruta inmediatamente. if (isOnLeaderSight (leader, ahead)) force = force.add (evade (leader)); // Crea una fuerza para llegar al punto de atrás force = force.add (llega (detrás, 50)); // 50 es el radio de llegada // Agregar fuerza de separación fuerza = fuerza.add (separación ()); fuerza de retorno función privada isOnLeaderSight (leader: Boid, leaderAhead: Vector3D): Boolean distancia de retorno (leaderAhead, this) <= LEADER_SIGHT_RADIUS || distance(leader.position, this) <= LEADER_SIGHT_RADIUS; private function distance(a :Object, b :Object) :Number return Math.sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
Cualquier personaje evadirá inmediatamente su posición actual si está a la vista del líder:
Personajes que siguen al líder utilizando la separación y evadiendo la vista del líder. Mueve el cursor del ratón para guiar al líder. Haga clic para mostrar fuerzas.A continuación se muestra una demostración que muestra al líder siguiendo el comportamiento. El soldado azul (el líder) llegará al cursor del ratón, mientras que los soldados verdes seguirán al líder..
Cuando el jugador hace clic en cualquier parte de la pantalla, todos los soldados se encontrarán con el cursor del mouse y dispararán. Los monstruos llegarán a ubicaciones aleatorias, cada pocos segundos..
Mueve el cursor del ratón para guiar al líder (los soldados seguirán). Haz click para disparar a los monstruos..El siguiente comportamiento del líder permite a un grupo de personajes seguir un objetivo específico, quedándose ligeramente detrás de él. Los personajes también evaden su ubicación actual si eventualmente se interponen en el camino del líder..
Es importante tener en cuenta que el comportamiento siguiente del líder es un combinación de varios otros comportamientos, como llegar, evadir y separar. Demuestra que se pueden combinar comportamientos simples para crear patrones de movimiento extremadamente complejos..
¡Gracias por leer! Espero que pueda comenzar a combinar los comportamientos explicados anteriormente para crear su propio comportamiento complejo.!