只有最后一个列表成员正在更新

时间:2014-09-02 20:43:50

标签: c# list xna-4.0

我有一个游戏,其中的块以类似于Minecraft的样式添加。最近,我遇到了这些障碍的一些障碍。

有一个叫做发电机的模块,基本上如果它打开,而另一个模块(光)在该区域内,则指示灯会亮起。这是通过以下代码实现的,这很简单。

foreach (Block b in game.blphys.blocklist9)
{              
    foreach (Block v in game.blphys.blocklist7)
    {
        if (b.powerboxon == true && b.powerarea.Intersects(v.blockrectangle))
        {
            v.power = true;
        }
        else
        {
            v.power = false;
        }
    }
}

到目前为止,这一直在发挥作用。但是,由于可以通过列表添加多个发电机,当我制作新的发电机项时,先前创建的发电机无法工作。原始生成器的边界框仍然存在,并且它仍处于打开状态(我在打开时更改了精灵),它看起来就像上面的代码停止工作了。

任何帮助都会受到赞赏,我有一种感觉,我只是在愚蠢的事情

修改 这是添加块

时使用的代码
if (game.player.Builder == true && game.player.LMBpressed == true && blockspawnamount >= placeblock)
{
           if (game.build.BlockID == 10 && game.menu.open == false)
           {

             position = new Vector2((int)(game.cursor.cursorPos.X / 58) * 58, (int)(game.cursor.cursorPos.Y / 58) * 58);

             game.blocktex9 = game.powerboxoff;
             block9 = new Block(game, game.blocktex9, new Vector2(position.X, position.Y), layer);
             blockpos9.Add(position);
             blocklayer9.Add(layer);
             blocklist9.Add(block9);
             placeblock = 200.0f;

           }


}

我尝试了以下

            foreach (Block v in game.blphys.blocklist7)
            {

                foreach (Block b in game.blphys.blocklist9)
                {                   

                    if (v.blockrectangle.Intersects(b.powerarea))
                    {
                        if (b.powerboxon == true)
                        {
                            v.power = true;
                        }
                        if (b.powerboxon == false) 
                        {
                            v.power = false;
                        }
                    }

                }

            }

这有点缓解了我的问题。现在,如果区域中有多个发生器,一个保持关闭,一个保持打开,如果你添加更多灯关闭,但你可以打开其中一个发生器,它可以工作。

将发电机添加到该区域之外也是完美的,一旦开启,它们就会供电,只要它们远离其他发电机。

我可能会添加一些代码,阻止您在同一电源区域内构建另一个生成器。

2 个答案:

答案 0 :(得分:2)

您正在使用灯块测试每个电源块,并使用它来设置v.power。这意味着只有您测试的最后一个电源块会对灯块产生影响。

我建议改为做这样的事情:

iterate over light blocks
    default power to false
    iterate over power blocks
        if power block is on and close to light block, set power = true and stop iterating power blocks

答案 1 :(得分:1)

如果第二次发电不在第一个灯附近,它将关闭电源。我建议为每个循环反转。如果指示灯靠近任何发电机,请打开指示灯并停止寻找发电机。

进一步解释:

  1. 将发电机1放置在电网上并添加到blocklist9 列表。
  2. 灯1放置在发电机1附近。
  3. 您的示例中显示的代码显示有一个发电机 它打开并且它接近光1,所以它打开了灯(v.power = true)
  4. 发电机2远离灯1放置(它的电源区域不相交)
  5. 在代码显示中,发电机1打开灯。然后,确定发电机2离光1太远,因此它关闭电源(v.power = false;)