【问题标题】:The collection has changed. Possible inventory operation is not performed集合已更改。未执行可能的库存操作
【发布时间】:2015-01-28 18:57:45
【问题描述】:

我是初学者,我有一个游戏,如果精灵发生碰撞,它们将被移除。但是当我播放它并且精灵发生碰撞时,我收到此错误:“集合已更改。可能的库存操作未执行。” (我把这句话从荷兰语翻译成英语)。我真的不知道如何解决这个问题,感谢任何帮助。

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);
                        }

                    }
                }
            }

        }

【问题讨论】:

    标签: c# xna collision


    【解决方案1】:

    您不能在迭代时修改集合,即在它们自己的 foreach 循环中。

    如果您需要修改集合,请使用 for 循环或将要删除的项目保存在一个额外的集合中,并在 foreach 循环完成时将其删除。

    【讨论】:

      【解决方案2】:

      这是一个使用 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;
        }
      }
      

      【讨论】:

      • 感谢您提供这个遮阳篷,这对我很有帮助
      • 我更新了它,它有一个错字,Sprites[0] 应该是 Sprites[i]。 Sprites[0] 总是会返回第一个精灵。
      • for 循环也可以比 foreach 循环更快,因为 for each 循环依赖于集合 IEnumerable 的实现(例如,一些 foreach 比其他更快)。
      • 这是错误的循环,因为如果您删除索引为“i”的项目,则所有下一个索引都将减少为 1。因此,如果您在“for”条件下使用 Sprites.Count,您将不会迭代 Sprite .Count,但是 (Sprites.Count-removed_count) 个项目。如果在“for”条件下使用一些 int count = Sprites.Count 变量,则会在 (count-removed_count) 索引处出现错误。使用 for(int i = Sprites.Count-1, i>=0; i--) 循环来避免这些问题。
      • 好 pt Silveor,我忘了。
      猜你喜欢
      • 2015-06-17
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 2011-07-22
      • 1970-01-01
      • 2011-10-05
      相关资源
      最近更新 更多