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

敵1が敵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 は最適ではありません... 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 に答える