2014-01-27 62 views
0

所以我基本上想要檢測同一類中兩個對象之間的衝突。我有這個在我的主類調用一個更新功能:在foreach循環中排除當前對象

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循環中排除當前對象?

+1

爲什麼不檢查,如果兩個對象是平等的嗎?這樣你就不會把球與自己比較。 – Olaf

回答

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 
     } 
} 
0

您應該能夠簡單地檢查在foreach是否與使用==的「當前球」相同。跳過循環的迭代 - 使用continue並立即開始一個循環的下一次迭代:

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

邊注:儘量不要使用i非整數循環變量代碼的許多讀者會自然而然地認爲類型按照慣例是int

1

使用LINQ:

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