Если вы используете простые формы, чтобы заблокировать вид объекта, есть простой способ сделать это, который я реализовал:
Создайте VisionWave
объект, который может двигаться как горизонтально, так и вертикально. Вы можете определить VisionWave
, используя исходную координату, две линии, которые пересекают эту точку, и расстояние от исходной точки.
У вас должно быть 4 волны: одна идет вверх, одна вниз, одна влево и одна справа, а линии, которые их определяют, должны иметь наклон 1 и -1 (то есть X). Мой грубый рисунок ниже показывает одну волну (направо), представленную символом >
.
\ /
\ />
\ / >
@ >
/ \ >
/ \>
/ \
Создайте петлю, которая распространяет каждую волну по одному пикселю за раз. Когда вы распространяете волну, вы хотите сделать следующее:
- Отметьте каждый пиксель, к которому соприкасается волна, как видимый.
- Если какой-либо из пикселей, которым волна касается, блокирует свет, то вы хотите разделить волну на два и рекурсивно распространить каждый из них.
Я внедрил подобную систему в моем Roguelike, и она очень быстрая. Обязательно профилируйте свой код для узких мест.
Если вы очень умны, вы можете попробовать круговые волны вместо прямых, но я не знаю, будет ли это быстрее из-за тригонометрических расчетов.