2012-01-10 11 views
4

ゲームの周りでプレイヤーを追いかける敵を作りましたが、問題があります。敵は完全すぎて、プレイヤーに近づくとすぐに互いに収束します。これは、ゲームが更新されるたびに、プレイヤーの方向に移動するためです。プレイヤーを追いかけている間にAIの敵が互いに集まってきます

私はおそらく、動きの角度で敵にいくつかのランダム性を導入したいと思います。

Angle = (float)Math.Atan2((HeroPosition - Position).Y, (HeroPosition - Position).X)// Positions are Vector2s 
GlobalForce Propellant = new GlobalForce((float)Math.Cos(Angle)/2, (float)Math.Sin(Angle)/2); 
ApplyForce(Propellant); 

私はそこ角度に乱数を追加しよう:これは私が(それはまだ終わっていないとして、私はそれを最適化していないので、私は、高オーバーヘッドの承知している)、これまで持っているものです問題のカップルです:

  1. 彼らはすべてがシード時間は、それらのすべて

  2. 乱数がその角度ごとの更新にとても異なっても同じであることをお互いの後にこんなに早く更新されますの敵のジャンプが不規則に。

私が知りたいことは、ほとんどのゲームはどのようにこの問題を回避しますか?敵を(他の敵のリストにアクセスすることなく)異なる経路にするにはどうすればよいですか?

EDIT:そのので、彼らドンほとんどのゲームは、敵がお互いをブロックすることによってこの問題を回避

Angle = (float)Math.Atan2((HeroPosition - Position).Y, (HeroPosition - Position).X); 
GlobalForce Propellant = new GlobalForce((float)Math.Cos(Angle)/2, (float)Math.Sin(Angle)/2); 
ApplyForce(Propellant); 

foreach (Enemy e in OtherEnemies) 
{ 
    if (e != this) 
    { 
     if ((e.Position - Position).Length() < 64) 
     { 
      float angleBetween = MathHelper.TwoPi-(float)Math.Atan2((e.Position-Position).Y, (e.Position-Position).X); 
      GlobalForce avoidance = new GlobalForce((float)Math.Cos(angleBetween)*2, (float)Math.Sin(angleBetween)*2); 
      ApplyForce(avoidance); 
     } 
    } 
} 

答えて

2

:によって

これは私が将来の通行人のために、以下の提案をした後に使用していたコードです同じ空間に移動しません。

これは、ハード制約(たとえば、各矩形に1つの敵のみが許可され、既に占有されている四角形に移動することはできません)またはソフト拘束彼らはお互いに近づきすぎる)。

+0

各敵が独立しており、他の敵の位置にアクセスできない場合はどうなりますか? – annonymously

+0

なぜ彼らはアクセスできませんか?おそらく、周囲の地図領域を検索する "findNearbyUnits()"メソッドによって、このデータにアクセスできるようにする必要があります。 – mikera

+0

私は今アップデートメソッドで敵のリストへの参照を渡し、それらの間の角度を計算し、あまりにも近すぎるとそれらを押し離す力を作り出すことに決めました – annonymously

4

AI戦術(および人間戦術BTW)の重要な部分は、敵の所在を知って行動するだけでなく、あなたの同盟国がどこにいるかを知って行動することです。最も簡単で最もよく知られている操縦の大部分は、それがなければ不可能です(包囲を考えてください)。

「これを避けることができれば、同盟国に近づけないでください」ということはほとんどありません。

基本的には、敵に引き付けられるだけでなく、味方にも拒否されるような方法で力を管理する必要があります。これを2段階のウェイファインダーと組み合わせれば完了です。

+0

私は各インスタンスに敵のリストの参照を与え、すべての後に同盟者を避けなければならないように見えます:) – annonymously

+0

これはあなたのユースケースに依存します:あなたのキャラクターに何らかの検出地平線があると思われます検出された同盟国をプッシュバック・プロバイダとして使用することができます。私は、これはむしろ現実的な動きのパターンとして機能すると思います。 –

0

昨年私はストレートフォワードが完璧な敵を得られます。このアルゴリズムを実行する敵

ためA-Star search algorithmを使用

を取ったコースの一つのためのPACMANゲームをコーディングしなければなりませんでした。

トリックは、アルゴリズムの結果にいくつかのランダム性を追加することです。難易度が下がるにつれて敵が「間違いを犯さない」ようにします。難易度が下がるにつれて、敵がより多くの「間違い」をもたらすように、アルゴリズムとは異なる方向に進む)

+0

これは便利なアイデアですが、残念ながら私はすでにステアリング動作を使用しています – annonymously

1

中間解決策は、異なるAIのための異なる戦略を持つことです。例えばプレイヤーが現在どこにいるのか、プレーヤーがどこにいるのかを知っている別のAI、プレイヤーが直進している場合を除いて、プレイヤーの南の数台を慣れさせようとする別のAI。 ...

あなたのAIは友達の所在を考慮したストラテジーを持っているのと同じくらいうまくはありませんが、(正しく書かれていれば)行動が違ってきます。

関連する問題