2D освещение плитки - PullRequest
       84

2D освещение плитки

5 голосов
/ 26 марта 2012

Я добавляю освещение в мою игру на основе XNA 2D.

Я нашел эту статью полезной, но способ ее выполнения не поддерживает столкновение. То, что я хотел бы, это метод, чтобы сделать следующее

  • Всегда освещали точку
  • Столкновение (Если луч света попадает на блок, затемните следующий блок на любую величину до темноты, чтобы имитировать тени)

Я долго искал, но не повезло (я нашел учебник Каталина, но он показался мне немного продвинутым и не подходил для плиток из-за перерисовки всей игры для каждого пункта)

Ответы [ 2 ]

1 голос
/ 06 июня 2013

Я поделюсь своим методом применения эффекта плавного освещения к 2D-сетке. ответ от ClassicThunder предоставляет хорошую ссылку для теней.

Прежде всего, нам нужно будет рассчитать значения освещения каждой плитки, которые будут размыты позже.Позвольте мне проиллюстрировать, как это работает, прежде чем я войду в код.

Lighting

В основном мы делаем цикл по всем плиткам, начиная сверху, если плитка пуста,установите переменную CurrentLight на максимальную яркость, если мы найдем сплошную плитку, установите ее как переменную CurrentLight и вычтите величину "поглощения" из CurrentLight.Таким образом, на нашей следующей сплошной плитке, когда мы установим плитку на значение CurrentLight, она будет немного меньше.Этот процесс повторяется до тех пор, пока массив не будет повторен.

Теперь будет хороший эффект освещения сверху вниз, но он не так уж велик.Мы должны повторить этот процесс еще 3 раза, снизу вверх, слева направо и справа налево.И это может повторяться несколько раз для лучшего качества.

По сути, запуск этого кода на каждой плитке в цикле

if (tile.Light > CurrentLight) //If this tile is brighter than the last, set the current light to the tiles light
    CurrentLightR = tile.Light;
else if (CurrentLight != 0f) //If it is less, and isnt dark, then set the tile to the current light
    tile.Light = CurLightR;
if (tile.Light == CurLightR) //If it is the same, subtract absorb values
    CurrentLight -= tile.Absorb;

И вот, хорошее освещение плиток.Однако, если вам нужен менее «пиксельный» вид, вы можете проверить мой вопрос по gamedev для этого.

0 голосов
/ 26 марта 2012

Для освещения на пиксель, возможно, вам придется искать где-то еще, потому что я не знаю об этом.Для освещения на плитку,

в SpriteBatch.draw, некоторые из перегруженных методов принимают цвет.При использовании Color.White спрайт, который рисует SpriteBatch, имеет обычный цвет.

Используйте умножение цветов, создавая новый Color (Color.yourcolor.r * float, Color.yourcolor.y * float, Color.yourcolor.z * float, 255)

По сути, чтобы получить float, попробуйте найти формулу, которая рассчитывает яркость блока из-за близлежащих источников света (вероятно, сохраненных в массиве или списке).Поскольку для 2D-игр нормалей не требуется, эта формула должна быть относительно простой.

...