1

我现在正在编写拾音器(硬币等),但是当你捡起东西时......它不再在地上了。

但我得到一个例外:System.InvalidOperationException. 由: 引起,并由循环map.Remove()抛出。foreach

那么,如何从列表中正确删除取件?

foreach (CollisionTiles tile in map.CollissionTiles)
{
    if (!tile.isTransparant)
        player.Collision(tile.Rectangle, map.Width, map.Height);
    else
    {
        if (player.PickUp(tile, map.Width, map.Height))
            map.Remove(tile);
    }

    camera.Update(player.Position, map.Width, map.Height);
}

map.Remove()虚空:

public void Remove(CollisionTiles tile)
{
    this.collissionTiles.Remove(tile);
}
4

2 回答 2

9

最简单的方法是记住所有要删除的元素,然后再删除它们:

var tilesToRemove = new List<CollisionTiles>();
foreach (var tile in map.CollisionTiles)
{
    if (!tile.IsTransparent)
    {
        player.Collision(tile.Rectangle, map.Width, map.Height);
    }
    else if (player.PickUp(tile, map.Width, map.Height))
    {
        tilesToRemove.Add(tile);
    }
    camera.Update(player.Position, map.Width, map.Height);
}

// Remove all the ones we didn't want
foreach (var tile in tilesToRemove)
{
    map.Remove(tile);
}
// Potentially call camera.Update here? We don't know if it uses the tiles

(顺便说一下,不清楚为什么你经常打电话——你能不能在循环camera.Update不打电话一次?)

于 2013-08-30T16:37:43.563 回答
2

使用for循环而不是foreach

for (int i = map.CollisionTiles.Count - 1; i >= 0; i--)
{
    CollisionTile tile = map.CollisionTiles[i];
    if (!tile.isTransparant)
        player.Collision(tile.Rectangle, map.Width, map.Height);
    else
    {
        if (player.PickUp(tile, map.Width, map.Height))
            map.Remove(tile);
    }

    camera.Update(player.Position, map.Width, map.Height);
}
于 2013-08-30T16:40:54.920 回答