我有一个游戏,其中的块以类似于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;
}
}
}
}
这有点缓解了我的问题。现在,如果区域中有多个发生器,一个保持关闭,一个保持打开,如果你添加更多灯关闭,但你可以打开其中一个发生器,它可以工作。
将发电机添加到该区域之外也是完美的,一旦开启,它们就会供电,只要它们远离其他发电机。
我可能会添加一些代码,阻止您在同一电源区域内构建另一个生成器。
答案 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)
如果第二次发电不在第一个灯附近,它将关闭电源。我建议为每个循环反转。如果指示灯靠近任何发电机,请打开指示灯并停止寻找发电机。
进一步解释: