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

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

我也查看了植绒等,但我想知道,如何检测同一类的 2 个对象之间的碰撞?

4

1 回答 1

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 在这里不是最好的......您可以使用 for 以更有效的方式完成碰撞检查:

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

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

于 2012-11-24T23:00:53.590 回答