联盟类型的导弹游戏列表和小行星碰撞列表
问题描述:
我遇到了使用Rectangle.Intersect相交这两个列表的问题。 我试着在导弹或小行星内部放置回路,但它有一个错误。联盟类型的导弹游戏列表和小行星碰撞列表
for (int i = 0; i < missile.Count; i++)
{
missile[i].setMissileY();
if (rect_Light.Intersects(missile[i].getMissileRectangle()))
{
missile.Remove(missile[i]);
}
}
for (int i = 0; i < asteroid.Count; i++)
{
asteroid[i].setAsteroidY();
if (asteroid[i].getAsteroidY() >= Window.ClientBounds.Height || rect_Player.Intersects(asteroid[i].getAsteroidRectangle()))
{
if (rect_Player.Intersects(asteroid[i].getAsteroidRectangle()))
{
life -= 1;
}
asteroid[i].asteroidRectangle.X = asteroidPos.Next(Window.ClientBounds.Width - 60);
asteroid[i].asteroidRectangle.Y = asteroidPos.Next(-800, -57);
}
}
当我加入这行代码的for循环里面有missile.count
foreach (AsteroidClass ac in asteroid)
{
if (ac.getAsteroidRectangle().Intersects(missile[i].getMissileRectangle()))
{
missile.Remove(missile[i]);
ac.asteroidRectangle.X = asteroidPos.Next(Window.ClientBounds.Width - 60);
ac.asteroidRectangle.Y = asteroidPos.Next(-800, -57);
}
}
时,我的蛋蛋打型“System.ArgumentOutOfRangeException”的小行星 未处理的异常则返回出错在mscorlib.dll中
其他信息:索引超出范围。必须是非负数且小于集合的大小。
答
我的假设是,已完成的代码如下所示:
for (int i = 0; i < missile.Count; i++)
{
missile[i].setMissileY();
if (rect_Light.Intersects(missile[i].getMissileRectangle()))
{
missile.Remove(missile[i]);
}
foreach (AsteroidClass ac in asteroid)
{
if (ac.getAsteroidRectangle().Intersects(missile[i].getMissileRectangle())) // Error here
{
missile.Remove(missile[i]); // Or pehaps error here
ac.asteroidRectangle.X = asteroidPos.Next(Window.ClientBounds.Width - 60);
ac.asteroidRectangle.Y = asteroidPos.Next(-800, -57);
}
}
}
在这种情况下,这将导致System.ArgumentOutOfRangeException
如果当前missile[i]
已经从收集从交点删除rect_Light
。
如果导弹不再存在,您需要在导弹移除后添加continue
声明以防止执行碰撞检查。例如
if (rect_Light.Intersects(missile[i].getMissileRectangle()))
{
missile.Remove(missile[i]);
continue; // this will cause the foreach loop to iterate straight to the next missile without doing the asteroid check.
}
这将移动for循环到下一个导弹。
同样,你需要做类似于小行星碰撞检查的事情。 A break
声明将被需要,但是因为你需要离开foreach循环。
foreach (AsteroidClass ac in asteroid)
{
if (ac.getAsteroidRectangle().Intersects(missile[i].getMissileRectangle())) // Error here
{
missile.Remove(missile[i]); // Or pehaps error here
ac.asteroidRectangle.X = asteroidPos.Next(Window.ClientBounds.Width - 60);
ac.asteroidRectangle.Y = asteroidPos.Next(-800, -57);
break; // this will exit the foreach loop for asteroid.
}
}
+0
这个逻辑真的很有用,谢谢! – Kenneth 2014-12-04 03:10:35
请包括您收到的错误。 – Adrian 2014-12-04 02:33:09
@Adrian在这里。我真的不知道这个 – Kenneth 2014-12-04 02:41:10