В настоящее время я работаю над наведением A * на сетку и пытаюсь сгладить сгенерированный путь, а также учесть степень перемещения персонажа по нему. Я использую сетку для поиска пути, однако движение персонажа является свободным перемещением, а не строгим движением тайла к тайлу.
Чтобы добиться более плавного и более эффективного пути, я делаю трассировки линий на сетке, чтобы определить, есть ли неприступные плитки между плитками, чтобы сбрить ненужные углы.
Однако, поскольку трассировка линии имеет нулевой экстент, она не учитывает экстент символа и дает плохие результаты (не возвращая непроходимые тайлы, просто пропущенные линией, вызывая нежелательные столкновения).
Так что я ищу не линейный алгоритм, который определяет плитки под ним, я ищу тот, который определяет плитки под линией экстента в масштабе плитки. Вот изображение, чтобы помочь визуализировать мою проблему!
У кого-нибудь есть идеи? Я работал с линией Брезенхэма и другими альтернативами, но я еще не понял, как решить эту конкретную проблему.
источник
Ответы:
Как насчет того, чтобы нарисовать линию из каждого угла «плитки», в которую вы попадаете, в каждый угол плитки, в которую вы хотите перейти. Вы можете даже оптимизировать это до 3 строк вместо четырех. Разве это не правильно обнаружит все плитки на пути?
Что касается более плавных путей, проверьте статьи о «поведении руля», особенно те, которые сочетают его с A *, например, эти ссылки:
источник
Я только что реализовал этот алгоритм для моей игры пару дней назад! (-8
Вот моя идея в виде картинки:
Обратите внимание, что алгоритм работает с прямоугольниками любого размера. это основано на факте, что один угол прямоугольника всегда сталкивается сначала с любой линией сетки. Это означает, что вы можете проследить только один луч и получить все необходимые пересечения.
Вот пошаговый алгоритм:
Здесь есть некоторые крайние случаи, например, когда луч точно вертикальный / горизонтальный, или когда он точно попадает в угол, но это не сложно.
источник
Эта процедура является адаптацией Bresenham, которая решает оригинальный вопрос.
источник