通过循环碰撞

时间:2013-04-10 04:26:58

标签: c# xna

    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个外星人并且我击中了最左边的那个,那么它右边的每个外星人都会被删除!我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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;
        }
    }
}

希望这有帮助!