Если бы не подсветка стен (которую вменяемо реализовать тут затруднительно) то работал бы он по предрасчитанному дереву вообще в один проход.
Логика работы примерно следующая:
Код: Выделить всё
Предрасчет:
- Составляем список тайлов в наибольшем возможном радиусе видимости, сохраняем X и Y относительно центра
- Сохраняем расстояние до центра для каждого тайла, и сортируем список по возрастанию дистанции
- Сохраняем для каждого тайла список углов occludedAngles, которые он закрывает. По часовой стрелке,
абсолютные значения в виде int
- Создаем массив EmptyShade []uint8 из 360 элементов, заполненный нулями. И такой же из единичек под
названием FullShade
Работа:
- Создаем два массива из 360 uint8 - CurrentShade и NextShade
- Для начала CurrentShade := EmptyShade
- До тех пор пока CurrentShade не равно FullSHade: итерируемся по заранее отсортированнму списку тайлов
- Если дистанция от центра до текущего тайла не равна предыдущей проверенной дистанции - заменяем
содержимое CurrentShade на NextShade.
- Если проверяемый тайл непрозрачный: для каждого угла в списке occludedAngles этого тайла - ставим
единичку в соответствующей углу ячейке массива NextShade[angle] = 1.
- Для каждого угла в списке occludedAngles этого тайла добавляем единичку к степени освещенности этого
тайла за каждый 0 в соответствующей ячейке массива CurrentShade.
Как вам такой алгоритм? Или может быть видели что-то подобное по изяществу?