Есть общее затемнение через сурфейс, есть спрайт обзора. Как можно сделать то же самое что показано на картинке? Чтоб за спрайтом стены оставалась темнота.
Находятся "самая левая" и "самая правая" точки, если смотреть на плоскость с точки начала света. Для прямоугольных стен это делается вот таким странным куском кода:
Код
if (lx < x1) { if (ly < y1) { // top-left ax = x2; ay = y1; bx = x1; by = y2; } else if (ly > y2) { // bottom-left ax = x1; ay = y1; bx = x2; by = y2; } else { // left ax = x1; ay = y1; bx = x1; by = y2; } } else if (lx > x2) { if (ly < y1) { // top-right ax = x1; ay = y1; bx = x2; by = y2; } else if (ly > y2) { // bottom-right ax = x2; ay = y1; bx = x1; by = y2; } else { // right ax = x2; ay = y1; bx = x2; by = y2; } } else { if (ly < y1) { // top ax = x1; ay = y1; bx = x2; by = y1; } else if (ly > y2) { // bottom ax = x1; ay = y2; bx = x2; by = y2; } else { // light's inside the solid } }
Где lx, ly - координаты источника света, x1, y1, x2, y2 - координаты прямоугольного объекта (верхний левый, нижний правый углы), ax, ay, bx, by - искомые точки.
Потом из поверхности с нарисованным в нее светом вырезается (рисуется с draw_set_blend_mode(bm_subtract)) трапеция, у которой одна сторона - эти точки, а другая - пропорционально отдаленный отрезок.
Код
var adx = ax - lx, ady = ay - ly; var adl = sqrt(adx * adx + ady * ady); var bdx = bx - lx, bdy = by - ly; var bdl = sqrt(bdx * bdx + bdy * bdy); var fl = 1000; // расстояние отдаления, должно быть больше максимального радиуса источника света var afx = ax + adx / adl * fl; var afy = ay + ady / adl * fl; var bfx = bx + bdx / bdl * fl; var bfy = by + bdy / bdl * fl;
afx, afy, bfx, bfy - вторая пара координат трапеции.