Наткнулся на интересную проблему. Мне нужно выяснить, как имитировать линию видимости - достаточно просто, только на 2-й сетке с препятствиями. Либо ячейка сетки видна, либо нет.
Я могу добиться чего-то действительно рудиментарного - например, растянуть n мест от игрока или заблокировать горизонтальное распространение при обнаружении соседнего препятствия, но я не могу позволить себе жить с этим. Множество других приложений используют более сложные методы, которые наклоняют линию обзора по углам и т. Д., И я хочу быть на высоте.
Пока DCSS был моим источником вдохновения, когда я в тупике, я надеюсь получить что-то близкое к тому, что у них есть: http://crawl.sz.org/ .
Любое понимание будет оценено - спасибо за помощь!
(Простите, если это неловко нубистски - игра началась только несколько недель назад, изо всех сил пытаясь наверстать упущенное.)
источник
Ответы:
Лучевое литье - это очень быстрый и эффективный способ определения прямой видимости. Это в основном включает в себя отправку луча (думайте о нем как о бесконечном лазере, который нельзя перенаправить) из определенной позиции в определенном направлении. Используя этот луч, вы можете определить, например, какую точку (точки) он пересекает и как далеко от источника он находился, когда он пересек определенную точку.
Так, например, в сценарии игрок / враг луч может исходить от врага, причем направление является местоположением игрока. Если луч сталкивается с твердой плиткой, противник не может видеть игрока. Если это не так, враг может видеть игрока.
Вот отличный учебник, который должен помочь.
Вы также можете рассмотреть линейный алгоритм Брезенхэма (суммируя, он создает линии) для чего-то, что может быть легче масштабировано до тайлов.
источник
Я написал в блоге код для вычисления прямой видимости с карты высот. Простая плоская карта с препятствиями - это просто очень плоская карта высот, и эта реализация все еще полностью применима.
Вот это в C ++ и его
O(n)
; если вы знаете максимальную высоту на карте, вы можете отследить линию сканирования, в которой нет лучей, остающихся ниже этой высоты, и заблаговременно:источник