0

我正在制作一个在玩 Minecraft 时使用的程序,它是一个模拟地板的网格,我想要做的是能够点出障碍物和灯光,并计算哪些“块”可以获得足够的光。这是一个规划工具,因此您可以概览地板并通过足够的闪电制作漂亮的东西。

我可以点出障碍物和灯光,创建正确的传播,但我的问题在于我想用这个程序解决的问题的性质,我搞砸了很多,必须重做所有事情,所以我希望能够移除灯光当然,还有光会发出的光。

点出灯光时的灯光计算代码。

public void changeLightUp(int light)
    {           
        //no light left, return
        if(light == 0)
            return;

        //not a source or block, change light
        if(type == 0)
        {
            //light is greater, return
            if(lightLevel >= light)             
                return;
            lightLevel = light;
        }
        //solid block, ignore
        else if(type == 1)
            return;

        if(xCoord != main.gridSizeX - 1)
            main.grid[xCoord + 1][yCoord].changeLightUp(light-1);
        if(xCoord > 0)
            main.grid[xCoord - 1][yCoord].changeLightUp(light-1);
        if(yCoord != main.gridSizeY - 1)            
            main.grid[xCoord][yCoord + 1].changeLightUp(light-1);
        if(yCoord > 0)              
            main.grid[xCoord][yCoord - 1].changeLightUp(light-1);
    }

所以它的作用是:我检查是否有剩余的光(该方法是递归的,所以我将光发送到下一个块,减 1),然后我检查它是否是一个“地板”块,只要新的光更大 - 更新。如果它不是障碍物,我将光(减 1)发送到四个相邻的块,直到一切都完成。

我想不出一个“倒退”的好方法,这不可能是这类问题的第一个问题,所以我相信答案就在那里!不知道要搜索什么。对不起,如果答案遍布整个网络:)

编辑:似乎我对实际问题还不够清楚。网格由“块”组成,每个块都有自己的光照级别。当一个源被添加到网格中时,它会向它的邻居“发射”光,这是通过代码片段中可以看到的递归方法完成的。问题是当我要删除一个块时,我不知道如何以正确的方式移除光,很容易简单地计算出被光源“击中”但不包含在内的块考虑到附近可能存在其他来源,因此如果我将所有内容都设置为 0,那么光照水平将是错误的。希望可以解决问题,再次感谢所有回答我问题的真棒人 <3

4

1 回答 1

1

我认为有两种解决方案:

  • 您可以将lightSourceId属性添加到您的块类。这样,就可以找到刚刚关闭的光源所点亮的所有块
  • 每次更改(添加/删除/移动)任何光源时,您都可以重新计算所有网格。
于 2012-08-27T13:06:49.153 回答