同一类的2个对象之间的碰撞

时间:2012-11-24 14:36:21

标签: class xna collision

好的,所以我有一个敌人类(有旋转,位置,纹理等)。我在屏幕上产生了一些敌人,它们四处移动,但它们相互重叠。所以我试着在同一个班级的两个敌人之间进行碰撞检查。但无论我尝试什么方法,它都不是很有效。我尝试过的最好的事情是:

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)));
  }
 }
}

这不是确切的代码,所以它可能会有一些错误。无论如何,当我实施这个解决方案时,敌人并没有重叠,所以一切都很好。但是,他们总是移动到屏幕的右侧。

我也查了一下植绒等,但我想知道,我怎样才能发现同一类的两个物体之间的碰撞?

1 个答案:

答案 0 :(得分:2)

如果enemy1等于敌人2总是会发生碰撞。 :)

避免......

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

这样您就可以避免自我检查并避免重复检查。