每瓦照明XNA / MonoGame

时间:2015-04-28 18:51:15

标签: c# xna monogame lighting

我正在使用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)。我基本上需要一种方法来反转这种递归泛洪填充。

为了能够移除光源,我是否需要一起使用完全不同的算法,还是有某种方法?

实践中的灯光:

enter image description here

1 个答案:

答案 0 :(得分:0)

正如Micky Duncan建议的那样,我只是在每个屏幕上的磁贴上循环,将灯光设置为0,然后重新计算光照贴图。我过于注重试图消除光线,我甚至没有想过将它整体重置。