完全なプロジェクトのダウンロードは最後にあり、最初に効果があります。
赤い四角は、2x2 のサイズのモンスターの番号 1 です。
黄色はターゲット番号 3 です。
白い点は障害物です。
モンスターの攻撃範囲は 2x2 (自分のサイズ) です。
(ここでは、見やすいように、アルゴリズムの各ステップを遅らせています)
モンスターのサイズは1×1で、モンスターの攻撃範囲は1×1(自身のサイズ)です。
探索中に出てくる赤い道が道で、最後に描き直された赤い道が斜め方向に歩ける道です。
実装手順
- BFS (幅優先検索) を使用して、
現在の検索位置の前後の位置を毎回検索キューに追加します。
周囲の位置は抽象的な概念であり、上下左右と 4 方向を加えると、毎回 4 方向のみ最適な経路が選択されます。
展開するには:
Q: 任意の角度で斜めに歩く必要がある場合はどうすればよいですか? 45 度の角度で歩く必要がある場合はどうすればよいですか?
A: 周囲の位置の定義を変更するだけです。
優先度を追加
実際にはBFSが優先され、ターゲットが選択されるたびに、私たちが計算した最適値から検索されます。(このように、検索は意図的なものです)
つまり、BFS + プライオリティ キュー = A*、(これはほとんど A* のコア アイデアであり、プライオリティ キューは最適なものを選択する方法にすぎません)
最適なパスを見つける方法
まず、最適なパスが見つかったと仮定できます。では、最適なパスのプロパティは何ですか?
それぞれのポイントにはいつでも到達できますが、到達する方法が異なるため、到達するまでの歩数が異なります。したがって、マップ内のこのポイントに到達するために使用される最小ステップ数を記録できます。歩数が少ない動きがあれば上書きします。
歩数が最も少ない方向を記録することで、パス全体を復元できます。(もちろん、8方向などどの方向でも同じです)。
コリジョン ボリュームを実装する
ボリュームを達成するために対処する必要があるのは、実際には2つの部分だけです。
- 物体の中心はどこですか?
- オブジェクトのボリュームを表現する
方法 ボリュームの表現方法を決定するとき、それは簡単です:
検索プロセス中に各ボリューム単位の衝突チェックを使用するだけです!
複数のターゲットを動的に検索する方法
- 最も簡単な方法の 1 つは、複数回検索を行い、そのたびに別のターゲットを検索することですが、
この方法の欠点は明らかで、ターゲットの数が増えると、検索の数も増え続けます。
そして、最初のターゲットの検索では、多くの場所の最短ソースを既に知っていますが、2 番目のターゲットを検索するときに再度検索する必要があり、これは本当にもったいないことです。
上のデモ画像はこのアプローチを使用しています。多対象同時検索への切り替えは簡単です。
- 複数のターゲットを同時に検索
各検索では、複数のターゲットの距離を計算して比較し、最短経路のみを選択します。
この方法の利点は明らかで、多くのターゲットを検索でき、最短のターゲットをすばやく選択できます。
以下は、同時に複数のターゲットを検索し、最も近いターゲットのみを見つけるために使用するパスです。
デモンストレーションで使用される構成情報:
プロジェクトの完全なデモ パッケージ:
https://download.csdn.net/download/qq_41709801/86911269