2013-04-10 144 views
-4
for (int x = bulletBounds.Count - 1; x > -1; x--) 
     { 
      for (int y = alienPosition.Count - 1; y > -1; y--) 
      { 
       if (bulletBounds[x].Intersects(alienBounds[y])) 
       { 
        alienPosition.RemoveAt(y); 
        bulletBounds.RemoveAt(x); 
        hit++; 
       } 
      } 
     } 

我想要做的这段代码是通过这两个对象的列表,看看他们是否碰撞。我在另一个问题中看到,做这件事的唯一方法是在列表中向后迭代,所以我这样做了。现在的问题是,当一颗子弹与一名外星人发生碰撞时,列表中的每个外星人也将被删除。所以如果我在屏幕上有6个外星人,而且我击中了最左边的那个,那么右边的每个外星人都会被删除!我该如何解决?通过for循环冲突

+2

您是否尝试调试代码?只需在'if'语句中放置一个断点即可。 – 2013-04-10 04:29:06

回答

0

删除外星人和子弹后,你需要打破内循环。

if (bulletBounds[x].Intersects(alienBounds[y])) 
{ 
    alienPosition.RemoveAt(y); 
    alienBounds.RemoveAt(y); 
    bulletBounds.RemoveAt(x); 
    hit++; 
    break; 
} 
+0

这没有奏效:/ – 2013-04-10 04:39:19

+0

尝试从alienBounds中删除条目。 – 2013-04-10 04:43:25

0

break;添加到您的if循环中。顺便说一句,alienBounds和alienPosition有什么区别?然而,你通过alienPosition循环访问alienBounds中的数据。在下面的例子中,我只是循环通过alienBounds。如果我误解了任何内容,请告诉我,我会相应地更新我的答案。

foreach (var bullet in bulletBounds) 
{ 
    foreach (var alien in alienBounds) 
    { 
     if (bullet.Intersects(alien)) 
     { 
      bulletBounds.Remove(bullet); 
      alienBounds.Remove(alien); 
      break; 
     } 
    } 
} 

希望这会有所帮助!

+0

我有两个外星人名单,alienPosition创建了位置并绘制了外星人,而alienBounds创建了在alienPosition中创建的外星人周围的矩形。我也有我的项目符号列表相同的方法。我知道这不是最好的办法,但我不能想到另一种替代方案 – 2013-04-10 05:25:21

+0

这是行不通的。您无法迭代(foreach)集合/数组/列表并同时删除。 – 2013-04-10 23:58:23