2013-12-11 48 views
0

我對BoundingBox和make中的東西有奇怪的問題。 For循環不會正常工作,並導致不更改變量的問題。XNA中的BoundingBox有些奇怪

for (int i = 0; i < thing.Length; i++) 
     { 
      for (int j = 0; j < thing.Length; j++) 
      { 
       if (thing[i].bb.Intersects(thing[j].bb) && i != j) 
       { 
        thing[i].spriteSpeed *= -1; 
        thing[j].spriteSpeed *= -1; 
        soundEffect.Play(0.2f, -1f, 0f); 
       } 
      } 
     } 

但是,如果我改變j變量中,以靜態數量,如零,代碼將正常工作。

for (int i = 0; i < thing.Length; i++) 
     { 
      for (int j = 0; j < thing.Length; j++) 
      { 
       if (thing[i].bb.Intersects(thing[0].bb) && i != 0) 
       { 
        thing[i].spriteSpeed *= -1; 
        thing[0].spriteSpeed *= -1; 
        soundEffect.Play(0.2f, -1f, 0f); 
       } 
      } 
     } 

P.S.事情是一個看起來像這樣的結構:

struct Thing 
    { 
     public Texture2D myTexture; 
     public Vector2 spritePosition; 
     public Vector2 spriteSpeed; 
     public BoundingBox bb; 
     public Vector3 start, end; 
    } 
+0

Tnx Corey。這對我來說可以。 – Rincew1nd

回答

0

問題是你兩次更新兩個對象。

考慮在列表中有兩個項目並且它們的邊界框重疊的情況。通過你的循環傳遞你:

i == 0, j == 0: Skip because (i == j) 
i == 0, j == 1: Reverse direction of [0] and [1] 
i == 1, j == 0: Reverse direction of [1] and [0] 
i == 1, j == 1: Skip because (i == j) 

通過你已經扭轉了項目的順序工作兩次,他們回到原來的標題。

爲了防止這種情況,順帶減少的處理對象的完整列表中選擇所需的測試數量,j變量應該總是開始比i高1,因爲對於所有i <= j比較要麼已經完成,或者是無效的。

試試這個代碼,而不是:

for (int i = 0; i < thing.Length; i++) 
{ 
    for (int j = i + 1; j < thing.Length; j++) 
    { 
     if (thing[i].bb.Intersects(thing[j].bb)) 
     { 
      thing[i].spriteSpeed *= -1; 
      thing[j].spriteSpeed *= -1; 
      soundEffect.Play(0.2f, -1f, 0f); 
     } 
    } 
} 

這有大約一半的減少比較的數量的效果(其實(n^2-n)/2如果我們是準確的),以及刪除所有雙逆轉。列表中每個可能的項目組合都只被測試一次。