这与我在此发布的内容类似:Only last made member of a list is updating
我还有一个玩家列表(用于多人游戏)和一个块列表(基本上是一个具有指定位置和矩形的纹理)。
我有一个名为Collision Engine
的函数假设来检测列表中每个块与播放器之间的冲突。
这是我用来尝试检测玩家是否与任何块相交的函数(在这种情况下是500个随机生成的树)。
foreach (Blocks b in main.initializer.blocklist)
{
foreach (Player p in main.initializer.playerlist)
{
if (p.Hitbox.Intersects(b.box))
{
p.intersection = true;
}
else
{
p.intersection = false;
}
}
}
起初我以为它根本就没有检测到碰撞,但后来我注意到 检测到了碰撞,但是它只检测到列表中最后放置的块(想象出来)将树木的数量限制为1,然后2)。
如果有人能向我解释如何解决这个问题,我将不胜感激。
如果有必要,我有一个辅助选项可以将交叉检测移动到switch
类中的Blocks
语句中,是否会修复它?
答案 0 :(得分:1)
你在循环的每次迭代中都覆盖p.Intersection。 不要在循环中将其设置为false。将其设置为false作为默认值,然后在检测到冲突时将其更改为true。
编辑:您还需要将播放器放在外部循环中,将块放在内部循环中。
foreach (Player p in main.initializer.playerlist)
{
p.intersection = false;
foreach (Blocks b in main.initializer.blocklist)
{
if (p.Hitbox.Intersects(b.box))
{
p.intersection = true;
break;
}
}
}