敵AIが聞こえる音を追加するにはどうすればよいですか?


10

与えられた:

  • 2Dトップダウンゲーム
  • タイルは2D配列に格納されます
  • すべてのタイルにはプロパティがあります-減衰(レンガは-50db、空気は-1になる可能性があります)

これから、ポイントx1、y1でサウンドが生成され、「波及」するように追加したいと思います。下の画像は、その概要を示しています。明らかに、最終目標はAIの敵が音を「聞く」ことができることです。しかし、壁がそれを遮っている場合、音は遠くまで伝わりません。

ここに画像の説明を入力してください

赤は50dbの減衰がある壁です。

3番目のゲームティックでは、数学を混乱させていると思います。

これを実装する最良の方法は何でしょうか?


1
反射/残響音が気になりませんか?つまり、防音壁の一部が音源とAIエージェントの間に直接あるが、壁を自由に歩き回れる場合でも、AIエージェントはまだ音を聞く必要がありますか?答えが「いいえ」の場合、サウンドごとに1回だけ各セルを更新するため、ダンプニングは各音源に1回だけ適用されます。AIエージェントが少ない場合は、ソースからエージェントまでの線をたどるだけです。
Sean Middleditch、2012

目標は、壁の周りの音とそうでないものに多くの「愚かな」エージェントを従わせることです。
クリス

回答:


7

合理的なアイデアのようですが、これはゲームプレイの機能であるため、ゲームプレイに必要な機能よりも複雑にしないでください。

スキームを変更して、サウンドがすぐに広がるようにします。これは、おそらくプログラムがより簡単で、実際のサウンドの速い広がりとより一貫しているようです。

これは本質的にパスファインディングの問題であり、おそらくダイクストラのアルゴリズムを使用して解決するのが最善です。これは1対多のポイント検索(1つの音源、複数の敵)であり、1つのポイントから開始することで効率的に解決できます。

まずソースからスプレッドを行い、まだマークされておらず、計算されたボリュームが0を超えるすべてのネイバーにマークを付けます。各ネイバーはリストに追加します。そのリストは、計算されたボリュームでソートする必要があります。次に、リストで最もボリュームの大きいエントリに対してこのプロセスを繰り返し、必要に応じてリストに新しいエントリを追加し、処理したエントリを削除します。リストが空になるまで繰り返します。

このプロセスの間にあなたが敵のいるタイルに到達するときはいつでも、あなたはその敵が聞く音量を知っています。


1
+1は即時のサウンドトラベルです。あなたがそのことを気にする物理シミュレーションを作っているのでなければ、KISS。
ハックワース2012

うーん、本当にいいですね。また、@ Hackworthをシンプルにすることにも同意します。すぐに聞こえる音は、言及されたその瞬間に「ペニーが下がった」瞬間でした。ダイクストラのアルゴリズムについて読み始めましたが、確認のために、さまざまなタイプの壁に合わせて調整するための重み付けされたノードを含めることができますか?
Chris

@Chrisはい、ダイクストラは壁をモデル化するのに適した重み付けされたノードでも機能します(たとえば、重量は体積を減らすなど)
bummzack

9

パスファインダーは必要ないと思います。エリア内の各AIにレイキャストするだけで、邪魔な壁がある場合は聞こえません。これはある種のシーングラフ+空間分割で最もよく機能します


私はこの答えに同意します。
bobobobo 2012

この方法でも、サウンドを格納するためのデータ構造ははるかに単純になります。
クリス

レイキャストのアイデアは好きですが、それがさまざまな種類の壁を通過する音の原因となるかどうかはわかりません。たとえば、小さな足音は壁を通過しませんが、銃の発砲音は通過します。レイキャスティングは、それらの状況を整理するかどうしかし、この場合には、私にはわからない
クリス

1
クリス、レイキャストのアイデアを取り入れて少し拡張してください。レイがオブジェクトと交差するたびに、サウンドのボリュームがある程度減少します。AIに到達する前に音量がゼロに減少しても、聞こえません。AIに到達した場合は、「ボリューム」の値が手元にあります。この種の「ボリュームが減少したレイトレース」を使用して、距離に応じてサウンドドロップオフを適用することもできます。
Tim Holt、

@ティムホルト-良い点、私はそれらの線に沿って考えていませんでした
Chris

0

あなたの実装は、セル内のサウンドレベルが累積的であり、振幅が単にすべての方向に均一に外側に移動することを想定していると思います。サウンドがフレームごとに広がらず、再生中かそうでないかのどちらかであり、特定のポイントで再生する際の振幅を確認する必要があります。

タイルをレイキャスティングすることは、それを行う1つの方法(そしておそらく最も効果的な方法)です。エミッターとレシーバーの間に線を引き、途中で各セルの減衰値を差し引くだけです。数値が正の場合は、サウンドを再生します。

間接音をモデル化したい場合は、パスを見つける必要があります。エミッターをツリーのルートとして扱い、隣接する各セルをリンクされたノードとしてモデル化します。各リンクには、現在のボリュームから差し引かれたコストがあります。レシーバーが見つかるか、ボリュームがゼロを下回るまでグラフをトラバースし続けます(ゼロに達した場合は、バックトラックして別のパスを試します)。音量が正のレシーバーへのパスがない場合、エミッターは聞こえません。注意:エミッターからレシーバーへのパスが複数ある可能性があり、最大のボリュームを持つパスが必要なため、レシーバーを見つけたときにトラバースをあきらめることはできません。

サウンドがどこから来たのかを気にするAIをモデリングしている場合、後者のアプローチが役立ちます。AIは、パスの最後のセグメントの方向からのサウンドを「聞く」ことになります。うまく言えば、レシーバーへの2つの可聴パスがある場合、それらのAIは複数のサウンドとどの方向をとるかについて混乱する可能性があります。


1
流体を伝わる波です。ゲームでそのようにシミュレーションすることは適切ではないかもしれませんが、それは確かに「サウンドの動作方法」ではありません。
ケビンリード

フェアポイント、編集済み
MrCranky
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.