Рассмотрим двумерную сетку плиток и приблизительную сферу координат, центрированную на игроке, которая представляет линию видимости. Цель состоит в том, чтобы заблокировать линию обзора за препятствиями (то есть стенами).
Относительно просто определить, видна ли отдельная ячейка в зоне видимости: направить луч от игрока к целевой ячейке, используя Брезенхэма - если одна из перекрывающихся ячеек между игроком и целью является препятствием, целевая ячейка не видно
Теперь моя первая мысль состояла в том, чтобы пройтись по всем ячейкам сетки на линии прямой видимости, но мне это кажется неэффективным. Например, если игрок стоит рядом со стеной и вы определяете, что ячейка за стеной не видна, вы можете определить все ячейки на луче после того, как она не будет видна.
Также рассматривалось наведение луча на каждую ячейку по периметру поля зрения и итерацию каждой ячейки вдоль каждого луча - но тогда бы я обрабатывал некоторые ячейки более одного раза.
Есть ли более эффективный способ сделать это?
Хотя итерация ~ 50 ячеек за ход - сравнительно легкий расчет, я стремлюсь к скорости - цель состоит в том, чтобы иметь возможность циклически выполнять несколько ходов в секунду при автоматическом воспроизведении. Итак, чем эффективнее я могу это сделать, тем лучше.
источник
Ответы:
Вы можете попробовать наложить "теневые дуги", чтобы покрыть большие области сразу. Хотя фактические детали немного сложны, у Эрика Липперта есть очень подробное объяснение (с живой демонстрацией Silverlight) по адресу http://blogs.msdn.com/b/ericlippert/archive/2011/12/12/shadowcasting-in. -c-part-one.aspx .
источник
Я реализовал алгоритм, предложенный Джимми.
Видео с кодом в действии тут: https://youtu.be/lIlPfwlcbHo
источник