0

几天来我一直在寻找为什么我收到此错误消息的原因!我需要帮助来解决这个问题或改进代码。很难理解为什么会发生此错误并找到原因,它只是有时而不是一直发生!但我的猜测是它与列表和列表中的项目数有关。它位于发生错误事件的代码的第二部分。我还尝试将要删除的对象添加到特殊的“删除列表”中,但是为什么这不起作用?帮助表示赞赏!谢谢!

public void CollisionControlMissileHitAsteroid(ContentManager content)
{
    for (int i = 0; i < missilesList.Count(); i++)
    {
        // Stora asteroider
        for (int j = 0; j < asteroidsBigList.Count(); j++)
        {
            if (missilesList.ElementAt(i).Bounds().Intersects(asteroidsBigList.ElementAt(j).Bounds())) // Fel här ??
            {

                for(int x = 0; x < 2; x++)
                AddNewSmallAsteroidToList(new AsteroidSmall(content, asteroidsBigList.ElementAt(j).Position));
                missilesList.RemoveAt(i);
                i--;

                asteroidsBigList.RemoveAt(j);
                j--;
            }
        }


        if (missilesList.Count() > 0 && asteroidsSmallList.Count > 0)
        {

            for (int k = 0; k < asteroidsSmallList.Count(); k++) 
            {
                if (missilesList.ElementAt(i).Bounds().Intersects(asteroidsSmallList.ElementAt(k).Bounds())) // THIS IS WHERE THE ERROR EVENT HAPPENS!
                {
                    missilesList.RemoveAt(i);
                    i--;
                    asteroidsSmallList.RemoveAt(k); 
                    k--;
                }
            }
        }
    } 
}

编辑:

这是我应该休息的地方吗?问,因为它仍然会发生!我可以玩五分钟,直到它发生!

if (missilesList.Count() > 0 && asteroidsSmallList.Count() > 0)
{

    for (int k = 0; k < asteroidsSmallList.Count(); k++) 
    {
        if (missilesList.ElementAt(i).Bounds().Intersects(asteroidsSmallList.ElementAt(k).Bounds())) 
        {
            missilesList.RemoveAt(i); 
            i--;
            asteroidsSmallList.RemoveAt(k);
            k--;
            break; // ???????
        }
    }
}
4

3 回答 3

1

您认为这与列表的边界有关,这是对的。我从来没有想出一个令人满意的方法来删除循环中的列表项或数组元素,就像你说的那样,建立一个索引列表并在循环之外删除它们。话虽如此,您是否尝试过向后浏览列表,例如-

for (int k = asteroidsSmallList.Count() - 1; k >= 0; k--) 
{
    ...
于 2012-07-19T09:08:55.263 回答
0

假设您从一枚导弹和两颗小行星开始。导弹 (i=0) 击中了第一颗小行星 (j=0) - 但你继续使用 i=-1 和 j=0。您应该跳出内部循环并继续在那里进行外部循环的下一次迭代。毕竟,你已经“完成”了导弹——它不能击中任何其他小行星,无论大小。

Count(是的,根据 xanatos 的评论,使用属性而不是方法会更惯用Count()。)

于 2012-07-19T09:05:03.923 回答
0

我认为问题很明显,因为您的代码在 for 循环中运行。在第一个 for 循环中,您得到了i=0. 阅读我的评论

for (int i = 0; i < missilesList.Count(); i++)
    {
        // Stora asteroider
        for (int j = 0; j < asteroidsBigList.Count(); j++)
        {
            if (missilesList.ElementAt(i).Bounds().Intersects(asteroidsBigList.ElementAt(j).Bounds())) // Fel här ??
            {

                for(int x = 0; x < 2; x++)
                    AddNewSmallAsteroidToList(new AsteroidSmall(content, asteroidsBigList.ElementAt(j).Position));
                missilesList.RemoveAt(i);
                // In the first iteration of the outer for loop i=0, so what if the line below is executed
                // you will get negative index Hope this help
                i--;

                asteroidsBigList.RemoveAt(j);
                j--;
            }
        }
于 2012-07-19T09:10:59.240 回答