2014-12-04 56 views
-1

我遇到了使用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中

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

+0

请包括您收到的错误。 – Adrian 2014-12-04 02:33:09

+0

@Adrian在这里。我真的不知道这个 – Kenneth 2014-12-04 02:41:10

回答

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声明以防止执行碰撞检查。例如

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