2012-11-24 48 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