【问题标题】:Exclude current object in foreach loop在 foreach 循环中排除当前对象
【发布时间】:2014-02-18 17:08:04
【问题描述】:

所以我基本上想检测同一类的两个对象之间的碰撞。我的 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 循环中排除当前对象?

【问题讨论】:

  • 为什么不检查两个对象是否相等呢?这样您就不会将球与自己进行比较..

标签: c# list class foreach collision-detection


【解决方案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
        }
}

【讨论】:

    【解决方案2】:

    使用 LINQ:

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

    【讨论】:

      【解决方案3】:

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

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

      旁注:尽量不要将i 用于非整数循环变量,因为许多阅读您的代码的人会自动假定类型为int

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-06
        • 2013-05-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多