我正在使用MonoGame制作基于平铺的2D游戏。我一直在尝试实现每个瓦片照明,并最终使用递归填充填充来实现此答案https://gamedev.stackexchange.com/a/68803的效果。
private void UpdateLight(int X, int Y, int LightLevel)
{
//Check if position is out of bounds
if (X >= 0 && X < MapWidth && Y >= 0 && Y < MapHeight)
if (LightLevel > BlockMap[X, Y].Light)
{
BlockMap[X, Y].Light = LightLevel;
UpdateLight(X, Y - 1, LightLevel - 1);
UpdateLight(X, Y + 1, LightLevel - 1);
UpdateLight(X - 1, Y, LightLevel - 1);
UpdateLight(X + 1, Y, LightLevel - 1);
}
}
这似乎很有效,直到我想要移除光源。我根本想不出办法做到这一点。当我想放置一个光源时,我只需要调用UpdateLight(LightSourceX,LightSourceY,LightSourceStrength)。我基本上需要一种方法来反转这种递归泛洪填充。
为了能够移除光源,我是否需要一起使用完全不同的算法,还是有某种方法?
实践中的灯光:
答案 0 :(得分:0)
正如Micky Duncan建议的那样,我只是在每个屏幕上的磁贴上循环,将灯光设置为0,然后重新计算光照贴图。我过于注重试图消除光线,我甚至没有想过将它整体重置。