我使用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);
}
}
当我使用missile.count
在forloop中添加这行代码时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);
}
}
当我的导弹击中小行星时,它会返回错误 未处理的类型&#39; System.ArgumentOutOfRangeException&#39;发生在mscorlib.dll
其他信息:指数超出范围。必须是非负数且小于集合的大小。
答案 0 :(得分:0)
我的假设是完成的代码如下所示:
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
声明,以防止在导弹不再存在时执行星期碰撞检查。 e.g。
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循环移动到下一个导弹。
同样,您需要执行类似于小行星碰撞检查的操作。但是,由于您需要离开foreach循环,因此需要break
语句。
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.
}
}