Así que he comprendido cómo usar A * para encontrar rutas, y puedo usarlo en una cuadrícula. Sin embargo, mi mundo de juego es enorme y tengo muchos enemigos que se mueven hacia el jugador, que es un objetivo en movimiento, por lo que un sistema de cuadrícula es demasiado lento para encontrar el camino. Necesito simplificar mi gráfico de nodos usando una malla de navegación.
Comprendo el concepto de "cómo" funciona una malla (encontrar un camino a través de nodos en los vértices y / o los centros de los bordes de los polígonos).
Mi juego utiliza obstáculos dinámicos que se generan procesalmente en tiempo de ejecución.
No puedo entender cómo tomar un avión que tiene múltiples obstáculos y dividir programáticamente el área transitable en polígonos para la malla de navegación, como en la siguiente imagen.
¿Dónde empiezo? ¿Cómo sé cuándo un segmento de área transitable ya está definido, o peor, cuando me doy cuenta de que necesito subdividir un área transitable previamente definida a medida que el algoritmo "recorre" el mapa?
Estoy usando JavaScript en nodejs, si es importante.
fuente
Respuestas:
@Stephen - Comentario largo - Parece que valdría la pena leerlo cuando tenga algo de tiempo. Básicamente, lo que hubiera sugerido es algo similar al algoritmo Hertel-Mehlhorn que se menciona en el documento (puede encontrar una referencia para este algoritmo específico aquí http://www.bringyou.to/compgeom/ ) con la adición de subdividir los lados del mapa (fuera del límite del área de juego) una cierta cantidad de tiempo para reducir la aparición de múltiples triángulos pequeños formados en las esquinas. Esos triángulos pequeños pueden ser problemáticos, ya que pueden llegar a ser más pequeños que lo que estás buscando para encontrar el camino. El Hertel-Mehlhorn es para la reducción de los polígonos producidos por una partición triangular, si está interesado aquí hay más sobre triangulación:http://www.personal.kent.edu/~rmuhamma/Compgeometry/MyCG/PolyPart/polyPartition.htm .
Además, si prefiere no reinventar la rueda, creo que esta biblioteca realmente hará todo lo que necesita: http://code.google.com/p/polypartition/ . Preforma las triangulaciones y reducciones con una de varias opciones diferentes, incluyendo Hertel-Mehlhorn. Es una licencia MIT, lo que significa que puede usarse para proyectos de código cerrado y comerciales si eso es un problema.
Si decides seguir trabajando en tu propia implementación, me encantaría ver qué se te ocurre.
fuente
En lugar de una malla, podría considerar un enfoque jerárquico A *. La mayor ventaja de una malla es tratar con mundos de juego que no están alineados con la cuadrícula, en lugar de reducir la complejidad de una cuadrícula.
Con un enfoque jerárquico, usted subdivide su mundo repetidamente (como un árbol cuádruple) y genera información de conectividad entre los nodos. Luego, puede generar rápidamente una ruta entre grandes porciones del mundo, y solo usar la cuadrícula de alta resolución para encontrar la ruta dentro de una porción más grande.
El enfoque jerárquico le dará a las órdenes de magnitud un mejor rendimiento, mientras que una malla en el mejor de los casos solo le dará una pequeña mejora lineal.
El enfoque ingenuo es simplemente dividir su mundo en trozos alineados de cuadrícula X por X más grandes, generar la información de conectividad entre ellos (por ejemplo, ¿hay una ruta entre el fragmento 2x1 de 3x1 a 2x2, y cuál es la distancia de la ruta promedio) .
Tenga en cuenta que no siempre puede obtener caminos ideales con este enfoque en algunas circunstancias particulares. La generación de capas de trozos de tamaño variable alivia el problema, pero honestamente, por lo general, es mucho más fácil evitar la creación de caminos problemáticos y confiar en el hecho de que es muy poco probable que el jugador note a algún enemigo tomando caminos subóptimos, excepto en el La mayoría de los casos degenerados.
fuente
Creo que podrías estar complicando demasiado esto. Probablemente no necesite generar mallas de navegación sobre la marcha. En cambio, tenga una malla de navegación estática para su mundo base.
El camino alrededor de los obstáculos se puede resolver utilizando comportamientos de dirección (evite los obstáculos). Si en caso de que su obstáculo sea tan grande que se llene o bloquee completamente el viaje de un nav-poly al siguiente, entonces tenga alguna forma de verificar este caso límite y recalcule el camino entre el poly en el que se encuentra actualmente y el uno del que estás bloqueado.
fuente