2013-10-15 34 views
1

我想測試兩個BoundingBox是否相交。我有一個列表:從通用列表中測試BoundingBox

List<BoundingBox> Mapa_BB = new List<BoundingBox>(); 

然後我邊框添加到這個列表中,效果很好 - 我被它改變爲一個字符串,然後繪製測試它 - 所以我敢肯定,他們的存在。 BoundingBox hero;是我的英雄的邊框。

接下來,我做了一個函數來測試是否發生了碰撞:

public void Collision() 
{ 
    foreach (BoundingBox BB_map in Map_BB) 
    { 
     if (hero.Intersects(BB_map)) 
     { test = "true"; } 
     else 
     { test = "false"; } 
    } 
} 

正如你可以看到,如果發生了衝突,我想設置字符串變量test"true";如果沒有的話,請致電"false"。我認爲我的列表有問題,但是如果我將英雄與列表中的最後一個邊界框相碰撞,那麼效果很好;對於任何其他邊界框,它不會。

回答

2

如果您發現相交中,你需要打破foreach循環:

public void Colision() 
{ 
    foreach (BoundingBox BB_map in Map_BB) 
    { 
     if (hero.Intersects(BB_map)) 
     { 
      test = "true"; 
      break; 
     } 
     else 
      test = "false"; 
    } 
} 

沒有break;,下面,不匹配的箱子將設置test"false"

2

當您發現碰撞並且每次在循環中覆蓋test時,您都不會離開循環,因此唯一真正應用的測試(如您注意到的)是最後一個。

除此之外,正確的方法是返回布爾值而不是使用表示布爾值的全局字符串。這也解決了你的問題。所以:

public bool Collision() { 
    foreach (BoundingBox BB_map in Map_BB) { 
     if (hero.Intersects(BB_map)) { 
      return true; 
     } 
    } 

    return false; 
}

這也可以寫成:

public bool Collision() { 
    return Map_BB.Any(bb => hero.Intersects(bb)); 
}