Базовое 2D освещение очень просто. Просто сделайте проверку расстояния от вашего блока до вашего источника света и используйте это значение для масштабирования вашего источника света.
Это то, что вы можете сделать довольно просто, так как Spritebatch.Draw имеет хороший параметр Color tint [ссылка]
псевдо-функция может быть
distance = (block.position - light.position). Length();
lightPower = distance / light.MaxDistance;
finalTint = light.Color * lightPower;
Render Block, with finalTint
Для более приятного на вид света вы можете заменить «расстояние / свет. Максимальное расстояние» более плавным эффектом.
Если вы также хотите, чтобы источники света проходили через несколько блоков, таких как Terraria, вы можете сосчитать все блоки между вашим блоком и источником света. Уменьшите свою силу света на эту величину, и вы получите тот же эффект, что и у Terraria.
Конечно, это неоптимизированный способ сделать это, но он должен работать.
Однако последняя версия Terraria, похоже, имеет плавное освещение на пиксель, а не на блок [превью] . Для этого я предполагаю, что они использовали вторую цель рендеринга и / или Pixel Shader, чтобы сохранить высокую производительность. Это может быть немного сложно, если вы не знакомы с рендерингом конвейеров.
Надеюсь, это поможет!