В настоящее время я делаю 2d игру защиты башни со статической, заранее определенной линией, по которой следуют враги (то есть башни не могут заблокировать путь, и поиск пути - не проблема, которую я пытаюсь решить).
Я пытаюсь понять, как именно заставить юниты плавно следовать по этой полосе . У меня есть две грубые идеи о том, как это сделать, но я хотел бы получить некоторую информацию, которая, вероятно, будет легче реализовать / более стандартную технику. Или, конечно, если бы у меня был какой-то совершенно другой способ, который я не учел, я бы тоже хотел узнать об этом.
Маршрутные точки: моя первая идея состояла в том, чтобы определить путь как серию жестко закодированных маршрутных точек. Затем подразделения будут использовать базовый алгоритм управления «поиск» (такой как этот ) для последовательного перемещения к каждой путевой точке на пути. Тем не менее, я задавался вопросом, может ли быть трудно удержать юниты от большого отклонения от полосы, по которой я хочу, чтобы они следовали. Интересно, может ли неспособность повернуть достаточно резко, чтобы они как бы «скользили» из желаемой полосы? Я полагаю, что смогу предотвратить это, хотя и приложу относительно сильную рулевую силу?
Кривые Безье: Второе решение, которое я рассмотрел, состоит в том, чтобы определить путь с кривой Безье и на каждом временном шаге вычислять точку вдоль кривой с удалением (dt * speed) от текущего местоположения устройства. Я подозреваю, что этот метод намного облегчит точное определение пути, по которому будут следовать юниты, но я не знаю, как именно это осуществить. Какие-либо предложения?
Кроме того, я не изменю чьи-либо ответы, но юниты также должны иметь возможность двигаться с постоянной скоростью по пути. Кроме того, я программирую эту игру на python, используя платформу pyglet.
Если что-то по этому вопросу неясно, пожалуйста, дайте мне знать.
Изменить: Кроме того, что бы это ни стоило, я пытаюсь повторить поведение движения врагов в Королевском порыве .
Ответы:
Позвольте мне представить вам знаменитую статью Крейга Рейнольдса « Поведение рулевого управления для автономных персонажей» . Если вы не читали его, вам следует, это поможет вам обдумать подобные проблемы, в частности, посмотрите раздел, посвященный поиску путей .
Идея статьи Рейнольдса заключается в том, что вы можете использовать простые силы, которые объединяются, чтобы создать реалистичную импровизационную навигацию по окружающей среде. Движения не основаны на планировании пути или глобальных вычислениях, но вместо этого используют локальную информацию, такую как силы соседей, которая делает их простыми для понимания и реализации, но все же создает очень сложные модели движения.
Прелесть этого подхода в том, что вы можете сочетать несколько вариантов поведения вместе. Так, например, ваши персонажи могут иметь как поведение при поиске пути, так и поведение при разделении (чтобы не допустить их слишком сильного скопления), которые могут быть объединены как взвешенная сумма.
Еще одним преимуществом использования методов управления является то, что существует ряд существующих реализаций с открытым исходным кодом на различных языках (например, opensteer ).
ОБНОВЛЕНИЕ: я взглянул на Kingdom Rush и думаю, что, возможно, неправильно понял, что вы имели в виду под «гладко». Я понял, что это означает более реалистично, но я думаю, что то, что вам нужно, больше похоже на то, как персонажи находятся на железнодорожном пути. Кроме того, читая более внимательно, я вижу, что одним из ваших требований является то, что «юниты должны иметь возможность перемещаться с постоянной скоростью по пути». Поведение руля не даст вам постоянной скорости движения, но простое нахождение пути в сочетании с путевыми точками даст. (То есть, не используйте поведение «поиск», чтобы добраться до путевой точки, вместо этого просто определите вектор направления и заставьте юнит двигаться на полной скорости к этой путевой точке.) Используйте больше путевых точек, чтобы сгладить маршрут.
источник
Решение в этой статье Gamasutra может быть то, что вы ищете. Основная идея состоит в том, чтобы направить лучи в путевую точку, которая находится на два шага впереди вашей текущей путевой точки, «шагая» лучом на долю длины ячейки и на каждом «шаге» луча, проверяя, сталкивается ли объем столкновения вашего игрока с чем-либо в ступенчатом положении луча. Если луч проходит весь путь до промежуточной точки, которая на два шага впереди, тогда вы можете избавиться от промежуточной промежуточной точки. затем вы можете продолжить этот же процесс вплоть до «целевой» путевой точки ... таким образом, если ваш путь может быть пройден прямой линией к цели, прямая линия к цели - это путь, по которому будет идти ваш персонаж. вот статья: http://www.gamasutra.com/view/feature/131505/toward_more_realistic_pathfinding.
Он также содержит отличные сведения о радиусе поворота и более естественном поведении поворота и тому подобное ...
источник