Actualmente estoy haciendo un juego de defensa de torre 2D con un carril estático predeterminado que los enemigos siguen (es decir, las torres no pueden bloquear el camino y encontrar el camino no es el problema que estoy tratando de resolver).
Estoy tratando de imaginar cómo exactamente hacer que las unidades sigan este carril de una manera suave . Tengo dos ideas aproximadas sobre cómo hacer esto, pero me encantaría recibir información sobre la que sea más fácil de implementar / la técnica más estándar. O, por supuesto, si hay una forma totalmente diferente que no he considerado, me encantaría aprender sobre eso también.
Waypoints: mi primera idea fue definir el camino como una serie de waypoints codificados. Las unidades luego usarían un algoritmo de dirección de "búsqueda" básico (como este ) para moverse a cada punto de referencia a lo largo del camino en sucesión. Sin embargo, me he preguntado si sería difícil evitar que las unidades se desvíen demasiado del carril que quiero que sigan. Me pregunto si la incapacidad de girar lo suficiente puede hacer que se "salgan" del carril deseado. ¿Supongo que podría evitar eso si permitiera que se aplicara una fuerza de dirección relativamente fuerte?
Curvas de Bezier: La segunda solución que he considerado es definir el camino con una curva de Bezier y, en cada paso de tiempo, calcular el punto a lo largo de la curva con (dt * velocidad) lejos de la ubicación actual de la unidad. Sospecho que esta técnica haría mucho más fácil definir con precisión el camino que seguirán las unidades, pero no sé exactamente cómo implementarlo. ¿Alguna sugerencia?
Además, no creo que esto cambie las respuestas de nadie, pero las unidades también deben poder viajar a una velocidad constante a lo largo del camino. Además, estoy programando este juego en Python usando el marco de Pyglet.
Si algo sobre la pregunta no está claro, hágamelo saber.
Editar: También para lo que sea que valga, estoy tratando de replicar el comportamiento de movimiento de los enemigos en el Kingdom Rush .
Respuestas:
Permítame presentarle el famoso artículo de Craig Reynolds sobre Comportamientos de dirección para personajes autónomos . Si no lo ha leído, debería hacerlo, lo ayudará a pensar en este tipo de problemas, en particular, eche un vistazo a la sección sobre búsqueda de rutas .
La idea del artículo de Reynolds es que puede usar fuerzas simples que se combinan para producir una navegación realista e improvisada alrededor del entorno. Los movimientos no se basan en la planificación de rutas o cálculos globales, sino que usan información local, como las fuerzas de los vecinos, lo que los hace fáciles de entender e implementar, pero aún así produce patrones de movimiento muy complejos.
La belleza del enfoque es que puede combinar varios de los comportamientos juntos. Entonces, por ejemplo, tus personajes pueden tener tanto un comportamiento de búsqueda de ruta como un comportamiento de separación (para evitar que se agrupen demasiado), que se pueden combinar como una suma ponderada.
Otro beneficio de usar comportamientos de dirección es que hay una serie de implementaciones de código abierto existentes en una variedad de idiomas (por ejemplo, OpenTeer ).
ACTUALIZACIÓN: Eché un vistazo a Kingdom Rush, y creo que podría haber entendido mal lo que querías decir con "sin problemas". Supuse que significaba más realista, pero creo que lo que buscas es más como si los personajes estuvieran en una vía de tren. Además, al leer más detenidamente, veo que uno de sus requisitos es que "las unidades deben poder viajar a una velocidad constante a lo largo del camino". Los comportamientos de dirección no le darán una velocidad de movimiento constante, pero sí la búsqueda simple de caminos combinados con puntos de referencia. (Es decir, no use el comportamiento de "búsqueda" para llegar al punto de referencia, en su lugar, simplemente determine el vector de dirección y haga que la unidad se mueva a toda velocidad hasta ese punto de referencia.) Use más puntos de referencia para suavizar la ruta.
fuente
La solución en este artículo de Gamasutra puede ser lo que estás buscando. La idea básica es lanzar rayos a un punto de referencia que esté dos pasos por delante de su punto de referencia actual "escalonando" el rayo una fracción de la longitud de una celda y en cada "escalonamiento" del rayo verificando si el volumen de colisión de su jugador choca con algo en la posición escalonada del rayo. Si el rayo llega al punto de referencia que está dos pasos por delante, entonces puede deshacerse del punto de referencia intermedio. luego puede continuar este mismo proceso hasta el punto de referencia de "meta" ... por lo tanto, si su camino puede lograrse mediante una línea recta hacia la meta, una línea recta hacia la meta es la ruta que tomará su personaje. Aquí está el artículo: http://www.gamasutra.com/view/feature/131505/toward_more_realistic_pathfinding.
También contiene grandes cosas sobre el radio de giro y comportamientos de giro más naturales y tales ...
fuente