在foreach循环中排除当前对象

时间:2014-01-27 17:50:56

标签: c# list class foreach collision-detection

所以我基本上想要检测同一个类的两个对象之间的冲突。我在我的Main类中有这个来调用更新函数:

foreach (Ball i in Ball.Pool) i.update();

在更新功能中,我编写了以下碰撞检测:

foreach(Ball i in Pool)
{
    if (Math.Sqrt(Math.Pow(i.pos.X - pos.X, 2) + Math.Pow(i.pos.Y - pos.Y, 2)) < 50)
    {
        //do intesect procedure
    }
}

问题似乎是它一直与自己相交。

有没有办法从foreach循环中排除当前对象?

3 个答案:

答案 0 :(得分:1)

只需添加一个等号检查:

foreach(Ball i in Pool)
{
    if(i <> this)
        if (Math.Sqrt(Math.Pow(i.pos.X - pos.X, 2) + Math.Pow(i.pos.Y - pos.Y, 2)) < 50)
        {
            //do intesect procedure
        }
}

答案 1 :(得分:1)

使用LINQ:

foreach (var ball in Pool.Where(b => b != currentBall)) {}

答案 2 :(得分:0)

您应该只需使用ball检查foreach中的==是否与“当前的球”相同。要跳过循环的迭代 - 使用continue立即开始循环的下一次迭代:

foreach(Ball ball in Pool)
{ 
    if (ball == this) // assuming code is part of Ball class
    {
       continue;
    }
    // handle collisions 
    ....
}

附注:尽量不要将i用于非整数循环变量,因为许多代码的读者会按照约定自动假定该类型为int