Gala类型的导弹游戏列表和小行星碰撞列表

时间:2014-12-04 02:31:32

标签: c#

我使用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

其他信息:指数超出范围。必须是非负数且小于集合的大小。

1 个答案:

答案 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.
    }
 }