Estoy haciendo juegos de hack & slash y quiero que mis personajes se muevan como, por ejemplo, en Torchlight, Diablo, etc. Actualmente genero un conjunto de nodos para todas las áreas transitables de un piso. Cuando hago clic en algún lugar, el jugador pasa a través de la ruta interpolada de nodos. Esto no se ve muy natural. El jugador se mueve como un robot. Los enemigos también usan este sistema de nodos para moverse y comparten el mismo problema, pero tengo un problema más con ellos. Cuando los enemigos detectan al jugador, van hacia él por el camino más corto. A veces usan el mismo camino y se alinean con el jugador en lugar de rodearlo. No sé cómo hacer que los enemigos elijan diferentes caminos y rodeen al jugador. ¿Sabes cómo puedo resolver estos problemas? ¿Tal vez debería usar un enfoque diferente para el movimiento del personaje?
Mi tecnica actual:
Captura de pantalla de la antorcha:
---ACTUALIZAR---
Quiero saber cómo lidiar con estas situaciones:
Situación 1, tengo obstáculos dinámicos / estáticos en mi camino
Situación 2, los enemigos tienen el camino sam al jugador (ponte en la cola para pelear con nosotros)
Respuestas:
Comportamientos de dirección en combinación con una estructura de datos de navegación .
Hay varias maneras de hacer esto, pero ese es el concepto básico. Puede ser más fácil usar una malla de navegación para que pueda aplicar el trazado de ruta dentro de cada sección convexa.
Si no está convencido de mantener un gráfico, puede usar un comportamiento de Búsqueda para cada nodo en la ruta, en lugar de seguir rígidamente una ruta de nodo a nodo.
Otro método que podría emplear es el suavizado de ruta, pero tenga en cuenta que esto es bastante costoso desde el punto de vista computacional.
Espero que ayude.
EDITAR:
Para ayudarlo con sus problemas para evitar obstáculos, use algún tipo de Evitación de obstáculos .
fuente
Si prefiere seguir con un diagrama de nodo en lugar de cambiar a una malla de navegación como otros han sugerido, entonces puede resolver el problema de "alinearse con el jugador en lugar de rodearlo" asignando a cada enemigo para que ataque desde una dirección particular.
Hay muchas formas de lograr esto, pero generalmente uso un sistema de 'fichas' para asignar direcciones únicas a los monstruos, donde el objeto jugador posee una ficha para cada dirección (norte, noreste, este, etc.). Cuando un enemigo quiere llegar al jugador, primero debe adquirir una ficha de él. La dirección especificada por la ficha le dice al monstruo a qué lado del jugador se le permite encontrar el camino. Dado que el jugador solo tiene una ficha para cada dirección, y los monstruos necesitan una ficha antes de que puedan atacar, varios monstruos no tratarán de llegar al mismo lado del jugador, lo que debería romper sus caminos un poco.
Además, es posible que también desee aplicar una pequeña penalización a los nodos durante el proceso de búsqueda de caminos, para alentar a los monstruos a acercarse desde una dirección que coincida con la ficha que tienen. (Es decir, si un monstruo tiene la ficha que le permite atacar desde el este, entonces con el propósito de determinar el "camino más corto" para ese monstruo, trate los nodos de la ruta que están al norte / oeste / sur del jugador como si son varios nodos, en lugar de solo uno). Esto hará que los monstruos se separen más rápido e intente flanquear al jugador, en lugar de marchar hacia el jugador en una sola fila y solo expandirse en el último paso.
fuente
Básicamente para los enemigos, lo que quieres hacer es encontrar caminos en un nivel macro (piensa en generar áreas convexas y rutas en el área en la que se encuentra el jugador), y haz algunos comportamientos de dirección de estilo boid en el nivel micro (una vez que estés cerca al jugador).
Aquí hay un ejemplo de comportamiento de boid: http://www.red3d.com/cwr/boids/
Para el jugador, creo que la luz de las antorchas hace la búsqueda de caminos en una malla de navegación para hacer clic / arrastrar, y eso funciona bastante bien. Puede sentirse un poco más desconectado que el control directo, pero conduce a mejores resultados para el jugador.
fuente
hay un algoritmo llamado rrt que se usa para problemas de búsqueda de caminos del mundo real. la superficie sobre la que puede caminar su héroe (o enemigos) es una entrada junto con la superficie que los objetos pueden mover, y al usar un algoritmo de optimización, encuentra un camino hacia su destino. Por lo que sé, este algoritmo se usa mucho en las ligas de robocup. es rápido, encuentra el camino más corto y evita colisiones y giros bruscos. puedes usar este programa de powerpoint para comprender cómo genera el camino.
fuente
Para hacer que las rutas de búsqueda de caminos se vean más "realistas", le sugiero que consulte el artículo sobre A * de aspecto natural en Game Programming Gems Vol.1
fuente