【问题标题】:Removing an object from a list and the game?从列表和游戏中删除对象?
【发布时间】:2016-02-25 16:44:21
【问题描述】:

我遇到的问题是我创建了一个列表,其中包含一个对象,但是当玩家与相关对象发生碰撞时,我无法将其从列表中删除。

//This is where the issue is
foreach (Objective seagull in seagulls)
{
    if (Objective.visable == false)
    {
        seagulls.Remove(seagull);
    }
}

编辑:更改为 for 循环后,我现在的问题是删除不起作用,我不知道删除功能要求我做什么?

【问题讨论】:

  • 请将您的代码和异常消息显示为相关文本。人们无需关注第三方网站即可查看您的代码。
  • 我不能有太多的代码?
  • 您不能在使用 foreach 循环遍历集合时修改集合
  • 不要使用foreach,使用带有反向索引器的for并删除最后一个。

标签: c# list xna 2d-games


【解决方案1】:

使用for 时,您应该使用RemoveAt,因为它会引用您的索引。 Remove 期望值匹配,这可能是您的新 for 实现不起作用的部分原因。


您收到该错误的原因是您正在枚举已修改的集合。如果您使用for 循环,而不是foreach,您将能够在删除特定索引的同时进行迭代。否则,您需要创建一个单独的List,它是您的List 的副本。删除它,然后将其与另一个相等。

int total = example.Count;
List<Example> example;
for(int i = 0; i < total; i++)
     if(...)
     {
           example.RemoveAt(i);
     }

条件将是您在删除之前的检查。我不确定那会是什么,但它会类似于那个。为了简洁起见,我稍微简化了代码。

【讨论】:

  • 您的示例有效,但只是为了澄清。如果将对象从列表中删除,这是否意味着它停止删除,因此该对象的所有逻辑都停止工作。因为尽管我不再有任何错误,但分数继续上升,就好像对象在那里一样。
  • 这里是新代码 if (Player.playerBound.Intersects(Objective.objectiveBound)) { Objective.visable = false; Player.score = Player.score + 10; for (int i = seagulls.Count - 1; i >= 0; i--) { if (Objective.visable == false) { seagulls.RemoveAt(i); } } }
【解决方案2】:

你可以在你的'seagull'中放置一些像'active'这样的标志,然后全部删除

seagulls.removeall(c => c.active == false) 

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多