我是初学者priogrammer,我得到了一个游戏,如果精灵发生碰撞,他们将被删除。但是当我玩它并且精灵发生碰撞时我得到了这个错误:"集合已经改变了。可能无法执行库存操作。" (我将这句话从荷兰语翻译成英语)。我真的不知道如何解决这个问题,感谢任何帮助。
private void checkCollisions()
{
foreach (ISprite s in allSpriteBullets)
{
Rectangle kogel = new Rectangle((int)s.position.X, (int)s.position.Y, 10, 10);
foreach (ISprite d in allSpriteObstakels) // error here
{
Rectangle blokjes = new Rectangle((int)d.position.X, (int)d.position.Y, 25, 25);
Rectangle overlap = Rectangle.Intersect(kogel, blokjes);
if (!overlap.IsEmpty)
{
if (s is Bullet)
{
d.CollisionWith(s);
s.CollisionWith(d);
hud.Score += 10;
allSpriteBullets.Remove(s);
allSpriteObstakels.Remove(d);
}
if (d is Monsters)
{
s.CollisionWith(d);
d.CollisionWith(s);
}
}
}
}
}
答案 0 :(得分:3)
在迭代时,你不能修改集合,即在他们自己的foreach循环中。
如果您需要修改集合,可以使用for循环或将要删除的项目保存在额外的集合中,并在foreach循环完成后将其删除。
答案 1 :(得分:1)
以下是使用for循环而不是foreach来修改集合的示例。
List<SomeSprite> Sprites = new List<SomeSprite>();
//add items to the collection
for (int i = 0; i < Sprites.Count; ++i)
{
SomeSprite Sprite = Sprites[i];
if (SomeCondition == true) //determine if the sprite collided here
{
Sprites.RemoveAt(i);
--i;
}
}