6

質問

タイトルについて申し訳ありませんが、より短い/より良い説明が見つからないようです..

状況は次のとおりです。大きなマップがある単純なゲームを作成しています (単純ですが、サイズが非常に大きい)。そのマップには多くの敵もいますが、アクションはメイン キャラクターの周りだけです (マップのごく一部である特定の半径内)。

各「ティック」(またはステップ、またはそれを何と呼ぶか​​)で、次の移動を決定するために、これらのオブジェクトのそれぞれに対して呼び出される特定の関数があります。パフォーマンス上の理由から、自分の視野の外側 (または少なくとも非常に遠くのもの) で何が起こるかは気にしないので、非常に異質なオブジェクトに対してその関数を呼び出したくありません。

これらのオブジェクトを管理して、マップ内を移動したときに更新される近くのオブジェクトのリストを常に保持するにはどうすればよいですか?

(C++でタグ付けされていることは知っていますが、どの言語でも構いません-コードをそれほど探しているわけではありません-それはアイデアに関するものです)


私がすでに試したこと

私はいくつかの選択肢を試しました:

  • 代替案 1:マップを「ゾーン」に分割し、各ゾーンに敵のリストを保存します。それに関する問題は、私がそれらのゾーンの端にいるとき、および(さらに悪いことに)角(私の周りの4つの異なるゾーン)にいるときに何が起こるかです。また、あるゾーンから別のゾーンに走ると、敵をゾーンに切り替えるのが難しくなります(ただし、機能する可能性のあるものを見つけました...)
  • 選択肢 2:xマップ全体をスキャンし、距離を移動するたびにアクティブな敵のリストを更新します。代替案 1 のように境界が多いことを心配する必要がないので、少しはましですが、毎回マップ全体をスキャンする必要があります。

私は今、これらの 2 つのソリューションを組み合わせることであるAlternative 3を見ていました。

ただし、より明白な解決策がないことを確認したかったのです。

4

3 に答える 3

4

敵をkd ツリーに格納し、数回の反復ごとに空間範囲検索を実行します。ただし、エントリの移動と再バランスをサポートするかなり洗練された実装が必要です。これは、適応 kd ツリーと呼ばれることもあります。

于 2012-12-31T18:21:15.330 に答える
2

次の質問に答えていただければ、適切なデータ構造と手順についてお役に立てると思います。地図の大きさは?実際の寸法は? 敵の密度について少し教えてください?平均して何人ですか?ゲームごとにランダムな数の敵を使用するか、レベルごとに敵の数を増やすことになると思います.いずれにせよ、予定している敵の最大数は?

主人公の周りだけでなく、すべてのキャラクター/敵が動き回る場合にのみ、それは本当に良いでしょう. それだけで、ゲームは本当にエキサイティングになります.ランダムな動きに完全に依存するのではなく、シンプルで現実的な動きのアルゴリズムを考え出すことができれば.レベルが上がるにつれて、敵の速度とパワーを増加させることができます。できるだけエキサイティングにするようにしてください。Caesar III のゲームを試してみて、人々の動きがどれほどうまくいくかを確認してください。単純な動きですが、本当に素晴らしいです。 . 肝心なのは、敵をどのように動かすかを考えることです。

于 2012-12-31T18:27:11.797 に答える
0

200x200は大きくありません。それぞれの場所で、範囲内にある場合、電卓で実行する予定がない限り、または1秒あたり数千回の更新が必要な場合を除いて、敵の更新は機能します。

過度に設計しないでください、それを単純にしてください。必要に応じて簡単に変更できるようにしてください。

于 2012-12-31T20:42:18.807 に答える