我一直在寻找为什么会在几天内收到此错误消息的原因!我需要帮助来解决这个问题或改进代码。很难理解为什么会发生这种错误并找到原因,有时它会发生,而不是所有时间!但我的猜测是它与列表和列表中的项目数量有关。它位于错误事件发生的代码的第二部分。我还试图在一个特殊的“删除列表”中添加我想要删除的对象,但为什么这不起作用?感谢帮助!谢谢!
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; // ???????
}
}
}
答案 0 :(得分:1)
你认为这与列表的界限有关是正确的。我从来没有想出一种令人满意的方法来删除循环中的listitems或数组元素,正如你所说的那样,构建一个索引列表并将它们移出循环之外。 话虽如此,你是否尝试过倒退,如 -
for (int k = asteroidsSmallList.Count() - 1; k >= 0; k--)
{
...
答案 1 :(得分:0)
假设您从一枚导弹和两颗小行星开始。导弹(i = 0)撞击第一个小行星(j = 0) - 但是你继续i = -1和j = 0。你应该突破内循环并继续外循环的下一次迭代。毕竟,你已经完成导弹 - 它无法击中任何其他小行星,无论大小。
(是的,根据xanatos的评论,使用Count
属性而不是Count()
方法会更加惯用。)
答案 2 :(得分: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--;
}
}