该系列已经改变。不执行可能的库存操作

时间:2014-11-30 19:09:51

标签: c# xna collision

我是初学者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);
                        }

                    }
                }
            }

        }

2 个答案:

答案 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;
  }
}