2012-11-24 50 views
2

好吧,所以我有一個敵人的類(與旋轉,位置,紋理等)。我在屏幕上產生了一些敵人,他們四處移動,但他們互相重疊。所以我試圖在同一個班級的兩個敵人之間進行碰撞檢查。但不管我嘗試什麼方法,它都不是很有效。我試過的最好的東西是:同一類別的兩個物體之間的碰撞

foreach (Enemy enemy1 in enemies) 
{ 
enemy1Pos = new Vector2(enemy1.position.X, enemy1.position.Y) 

foreach (Enemy enemy2 in enemies) 
{ 
    enemy2Pos = new Vector2(enemy2.position.X, enemy2.position.Y) 
    if (Vector2.Distance(enemy2Pos, enemy1Pos) < 200) 
    { 
    enemy1Pos += new Vector2((float)(enemy1.Speed * Math.Cos(enemy1.Rotation)), (float)(enemy1.Speed * Math.Sin(enemy1.Rotation))); 
    } 
} 
} 

這不是確切的代碼,所以它可能會有一些錯誤。無論如何,當我實施這個解決方案時,敵人並不重疊,所以一切都很好。但是,他們總是移動到屏幕的右側。

我也查了植絨等,但我想知道,我怎麼能檢測到同一類的兩個對象之間的碰撞?

+0

你到底在問什麼?您已經使用邊界球執行碰撞檢測。如果你想要別的東西,更多的信息是必要的。就我個人而言,每次敵人移動時我都會檢查碰撞(碰撞時將其移回)。這樣,總是負責碰撞的敵人被移動。 –

回答

2

如果enemy1等於enemy2總是會發生碰撞。 :)

避免....

foreach (Enemy enemy2 in enemies) 
{ 
    if (enemy2 == enemy1) continue; 
    enemy2Pos = new Vector2(enemy2.position.X, enemy2.position.Y) 
    if (Vector2.Distance(enemy2Pos, enemy1Pos) < 200) 
    { 
     enemy1Pos += new Vector2((float)(enemy1.Speed * Math.Cos(enemy1.Rotation)), (float)(enemy1.Speed * Math.Sin(enemy1.Rotation))); 
    }  
} 

的foreach是不是在這裏最好的...你可以完成collsion以更有效的方式與檢查:

for (int i = 0; i<enemies.Count-1; i++) 
{ 
     var enemy1 = enemies[i]; 
     for (int j=i+1; j<enemies.Count; j++) 
     { 
      var enemy2 = enemies[j] 
     } 

這你避免自我檢查,避免重複檢查。

+0

哇!它的作品,非常感謝你! +額外的解釋真的很棒! – Renet