Как стать автором
Обновить

Комментарии 8

Если посмотреть на Ваш готовый результат, то можно увидеть, что свет проходит через стены, а это не хорошо. С тенями вообще что-то непонятное…
А чем Вам пример не угодил?
P.S.
Нарисуем несколько квадратов на сером фоне:
GraphicsDevice.Clear(Color.Black);

spriteBatch.Begin();
spriteBatch.Draw(box1, Vector2.Zero, Color.White);
spriteBatch.Draw(box2, new Vector2(40, 50), Color.White);
spriteBatch.Draw(box4, new Vector2(150, 50), Color.White);
spriteBatch.Draw(box3, new Vector2(260, 50), Color.White);
spriteBatch.End();

Может проще закрасить серым, а не черным, а не выводить как бекграунт непонятную текстуру…
А мне понравилось, хотя мысль про тени тоже возникла. Но в движении, для не очень амбициозной игры — подходит, почему бы и нет? Я в своей игре для андроида похожую идею использую для создания эффекта «огненного хвоста»:)
Ну если Вас не смущает, что свет проникает через стены и тень заранее задана, как мы видим в «Готовим спрайт с тенями», то почему бы и нет.
Идея не новая, но действительно интересная, в совокупности с частицами можно получать очень красивые взрывы :-D
На самом деле для серьезного проекта здесь еще работать и работать: добавлять объемность через затенение отдельных областей игровых объектов, добавлять тени, отбрасываемые на другие объекты, пол и стены. Отдельная тема для случаев, когда свет не должен проходить через стены или выходить за рамки туннелей. Еще нужно добавить разные формы освещенных участков. Например, от ручного фонарика, или от лазерного луча. Еще было бы круто сделать поддержку разноцветных источников света: красного закатного солнца, когда грани объектов окрашиваются мягким красноватым цветом и вытягиваются длинные контрастные тени. Или зеленых радиоактивных отходов. В общем, работы много, хватит еще на несколько статей. А для новичков, что ищут с чего вообще начать, думаю, статьи должно хватить.
Вообще, могу посоветовать одну хитрость из 2D освещения, где по каким-то причинам нельзя использовать шейдеры:

Разбиваем мир на особые тайлы фиксированного размера (чем меньше, тем менее производительнее и более точнее будет освещение).
Считаем освещенность для каждого тайла, записывая эту освещенность в RT размером с x / tileSizeX, y / tileSizeY. Тени легко можно рассчитать и учитывать при освещении, используя, например, алгоритм Брезенхема или DDA-линии. Далее умножаем цвет RT-сцены на RT-лайткарты (причем благодаря несоответствию размеров последнего с первым — происходит своеобразный Upsampling, при условии линейной фильтрации).и получаются довольное красивое освещение без использования шейдеров. Этот способ хорошо подходит для тайловых игр.

___

В дополнение к методу выше (из статьи) — можно еще делать subtractive-рисование примитивами-треугольниками (правда, от spritebatch отказаться нужно для рисования, но там все просто в совмещении матрицы вида spritebatch'a и нативной матрицы вида) для создания теней.
А что за игра на изображениях, посмотреть где-то уже можно?
Игра называеться «Craft the World». Скачать, поиграть можно. Ищите в сети.
Спасибо :-)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории