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 deambular Comportamiento, que hace que el personaje se mueva al azar..
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.
A menudo, los personajes de un juego deben moverse al azar alrededor de su entorno. Por lo general, esos personajes solo esperan que algo suceda (como una batalla contra el jugador) o están buscando algo. Cuando el jugador puede ver ese comportamiento, la habilidad de vagar del personaje debe ser visualmente agradable y lo suficientemente realista..
Si el jugador puede identificar líneas de ruta bien definidas o un comportamiento de movimiento poco realista, generará frustración. En el peor de los casos, el jugador descubrirá cómo anticipar los movimientos del personaje, lo que resulta en una experiencia de juego aburrida..
los deambular El comportamiento de la dirección tiene como objetivo producir un movimiento realista "casual", que hará que el jugador piense que el personaje está realmente vivo y caminando..
Hay varias formas de implementar el patrón de desplazamiento usando comportamientos de dirección. Lo más simple es usar el comportamiento de búsqueda descrito anteriormente. Cuando un personaje está realizando una búsqueda, se moverá hacia un objetivo..
Si la posición de ese objetivo cambia cada pocos segundos, el personaje nunca podrá alcanzar el objetivo (e incluso si lo hace, el objetivo se moverá de nuevo). Colocar al objetivo al azar en el área del juego hará que el personaje se mueva por todo el entorno persiguiendo al objetivo. La siguiente demostración muestra este enfoque en acción:
El código para esta implementación sería:
// Calcular la función privada wander force wander (): Vector3D var now: Number = (new Date ()). GetTime (); if (now> = nextDecision) // Elija una posición aleatoria para "target" // return una fuerza de dirección que empuja el carácter // hacia el target (el comportamiento de búsqueda) return seek (target); // En el circuito del juego, maneja las fuerzas y el movimiento justo // como antes: actualización de la función pública (): void direction = wander () direction = Truncate (direction, max_force) Steering = direction / mass speed = truncate (speed + dirección, max_speed) posición = posición + velocidad
Aunque este es un enfoque simple y bueno, el resultado final no es tan convincente. A veces el personaje invierte completamente su ruta porque el objetivo se coloca detrás de él. El comportamiento del personaje se parece mucho más a "Maldita sea, olvidé mis llaves!" que "Está bien, voy a seguir esta dirección ahora".
Otra implementación del comportamiento errante fue propuesta por Craig W. Reynolds cuando inventó esos comportamientos. La idea básica es producir pequeños desplazamientos aleatorios y aplicarlos al vector de dirección actual del personaje (la velocidad, en nuestro caso) en cada cuadro de juego. Dado que el vector de velocidad define hacia dónde se dirige el personaje y cuánto mueve cada fotograma, cualquier interferencia con ese vector cambiará la ruta actual.
Usando pequeños desplazamientos, cada cuadro evita que el personaje cambie bruscamente su ruta. Si el personaje se mueve hacia arriba y gira a la derecha, por ejemplo, en el siguiente cuadro del juego, seguirá subiendo y girando a la derecha, pero en un ángulo ligeramente diferente..
Ese enfoque también se puede implementar de diferentes maneras. Una de ellas es usar un círculo delante del personaje, y usar eso para calcular todas las fuerzas involucradas:
los fuerza de desplazamiento tiene su origen en el centro del círculo y está restringido por el radio del círculo. Cuanto mayor sea el radio y la distancia del personaje al círculo, más fuerte será el "empuje" que recibirá el personaje en cada cuadro del juego..
Esta fuerza de desplazamiento se utilizará para interferir con la ruta del personaje. Se utiliza para calcular el fuerza errante.
El primer componente requerido para calcular la fuerza de desplazamiento es la posición central del círculo. Dado que el círculo debe colocarse delante del personaje, el vector de velocidad se puede usar como guía:
// La constante CIRCLE_DISTANCE a continuación es // un número definido en otro lugar. // El código para calcular el centro del círculo: var circleCenter: Vector3D; circleCenter = velocity.clone (); circleCenter.normalize (); circleCenter.scaleBy (CIRCLE_DISTANCE);
los circleCenter
el vector de arriba es un clon (copia) del vector de velocidad, lo que significa que apuntan a la misma dirección. Se normaliza y se multiplica por un valor escalar (CIRCLE_DISTANCE
, en este caso) que resultará en el siguiente vector:
El siguiente componente es la fuerza de desplazamiento, que es responsable del giro hacia la derecha o hacia la izquierda. Dado que esta es una fuerza utilizada para producir perturbaciones, puede apuntar a cualquier parte. Usemos un vector alineado con el eje Y:
desplazamiento var: Vector3D; desplazamiento = nuevo Vector3D (0, -1); displacement.scaleBy (CIRCLE_RADIUS); // // Cambia aleatoriamente la dirección del vector // haciendo que cambie su ángulo actual setAngle (desplazamiento, wanderAngle); // // Cambie wanderAngle solo un poco, para que // no tenga el mismo valor en // el siguiente cuadro de juego. wanderAngle + = (Math.random () * ANGLE_CHANGE) - (ANGLE_CHANGE * .5);
La fuerza de desplazamiento es creada y escalada por el radio del círculo. Como se describió anteriormente, cuanto mayor sea el radio, mayor será la fuerza de desplazamiento. los WanderAngle
es un valor escalar que define cuánto debe "inclinarse" la fuerza de desplazamiento; después de que se usa, se agrega un valor aleatorio para hacerlo diferente para el siguiente marco de juego. Produce la aleatoriedad requerida en el movimiento..
En aras de la comprensión, supongamos que la fuerza de desplazamiento calculada anteriormente se coloca en el centro del círculo. Dado que fue escalado por el valor del radio del círculo, sería algo como esto:
Propina: Recuerde que los vectores matemáticos no tienen una posición en el espacio, tienen una dirección y una magnitud (longitud). Como consecuencia se pueden colocar en cualquier lugar..Después de calcular el centro del círculo y el vector de desplazamiento, deben combinarse para producir el fuerza errante. Esa fuerza se calcula sumando esos dos vectores:
var wanderForce: Vector3D; wanderForce = circleCenter.add (desplazamiento);
Podemos representar visualmente estas fuerzas así:
La fuerza de desplazamiento se puede imaginar como un vector que va desde el personaje hasta un punto en la circunferencia del círculo. Dependiendo de la posición de ese punto, la fuerza de desplazamiento empujará al personaje hacia la izquierda o hacia la derecha, fuerte o débilmente:
Cuanto más se alinee la fuerza de desplazamiento con el vector de velocidad, menos cambiará el personaje su ruta actual. La fuerza de desplazamiento funcionará exactamente igual que las fuerzas de búsqueda y huida: empujará al personaje hacia una dirección.
Similar a buscar y huir donde la dirección de la fuerza se calcula en base a un objetivo, la dirección de desplazamiento se calcula en base a un punto aleatorio en la circunferencia del círculo. El código final para la fuerza de desplazamiento es:
función privada wander (): Vector3D // Calcule el centro del círculo var circleCenter: Vector3D; circleCenter = velocity.clone (); circleCenter.normalize (); circleCenter.scaleBy (CIRCLE_DISTANCE); // // Calcule la fuerza de desplazamiento var desplazamiento: Vector3D; desplazamiento = nuevo Vector3D (0, -1); displacement.scaleBy (CIRCLE_RADIUS); // // Cambia aleatoriamente la dirección del vector // haciendo que cambie su ángulo actual setAngle (desplazamiento, wanderAngle); // // Cambie wanderAngle solo un poco, para que // no tenga el mismo valor en el // siguiente marco de juego. wanderAngle + = Math.random () * ANGLE_CHANGE - ANGLE_CHANGE * .5; // // Finalmente calcule y devuelva el wander force var wanderForce: Vector3D; wanderForce = circleCenter.add (desplazamiento); devuelve wanderForce; función pública setAngle (vector: Vector3D, valor: Número): void var len: Number = vector.length; vector.x = Math.cos (value) * len; vector.y = Math.sin (value) * len;
Una vez calculada la fuerza de desplazamiento, se debe agregar a la velocidad del personaje para que pueda afectar su movimiento. La adición de esa fuerza se realiza de la misma manera que antes:
dirección = desviar () dirección = truncar (dirección, fuerza máxima) dirección = dirección / velocidad de masa = truncar (velocidad + dirección, velocidad máxima) posición = posición + velocidad
La fuerza de desplazamiento afectará la ruta del personaje de la misma manera que lo hicieron los comportamientos descritos anteriormente, con la diferencia de que empuja al personaje a una dirección aleatoria en cada marco de juego:
La demostración de arriba muestra varios personajes vagando en el entorno. Si salen de la pantalla, vuelven a aparecer en el centro..
El comportamiento errante es una excelente manera de implementar movimientos aleatorios. Está controlado por un círculo imaginario situado delante del personaje, que se puede modificar para producir el patrón de movimiento deseado.
Este tutorial describió los comportamientos de la dirección, explicando el comportamiento de vagar. En el próximo post, aprenderemos sobre más comportamientos. Manténgase actualizado al seguirnos en Twitter, Facebook o Google+.