必要条件
- AからBへの複数のパスが必要です。
- グリッドスペースで作業したい場合、これはおそらくサイドスクローラーのタイルスペースです。
- パスが交差したくない場合は、ゲームの進行が損なわれます。
- あなたはパスが合理的に有機的に見えるようにしたいです。
ボロノイ図
ボロノイ図は、空間を埋める平面グラフです。
それらの1つの良い点は、それらを使用して有機的なパスを作成する方法です。中心から中心まで直線を描くと、かなり予測不可能な(非直線的な)経路になります。
タイルベースのシステムで使用するボロノイ図を作成する方法
妥当なサイズのマップ(128x128など)を作成します。発生n
マップにランダム格子座標(x、y)と固有ID /色でそれぞれ取り込みます。その色のリストを作成し、その開始セルをそれに追加します。これを色ごとに行います。
これで、これらの一意のカラーポイントがボイドに浮かぶようになりましたが、周囲にカラーのアイランド全体を作成する必要があり、最終的な結果は次のようになります。
そのためには、マップ内の各セルを所有している色を確認する必要があります(上の画像のセル=ピクセル)。マップ内のすべてのセルを調べ、どのn
ピタゴラスを介してどの開始カラーポイントがそれに最も近いかをチェックします。そのセルは、その固有のID /色に関連付けられたリストに入ります...これ以降、アイランドと呼ばれます AKAボロノイセル(上の図では、同じ色のピクセルのグループ)。
これで、量子化されたボロノイ図ができました。次のステップは、各アイランドと他のアイランドの隣接関係を分析することです。単純なノードとエッジ構造体を設定して、グラフを保存できるようにします(ノードは単なるID、そのIDのリスト、空のエッジのリストです。エッジは単なる開始ノードと終了ノードです)。一意に識別されたアイランドごとに、ノードを作成し、隣接する各アイランドにリンクするエッジを追加します。
完全な図(グラフ)を取得したら、楽しい部分に到達します。グラフを使用して島のチェーンを見つけ、チェーン内の各島のすべてのセルに同じIDを設定することで、次のいずれかを作成します。あなたのパス。ID 503のすべてのセルを持つアイランドがID 657のアイランドの隣にあるとします。すべての503セルを657 IDで置き換えることにより、隣接する657の1つの大きなアイランドを作成できます。
たとえば、赤はパス1、青はパス2、マゼンタは両方です。
既存のグラフアルゴリズム(A *を含む)を使用して、最初から最後までのパスを生成できます。曲がりくねった経路を取得することは、ゴールアイランドへの最適なステップを常に使用するとは限らない場合です。
最後に、より狭いパスが必要な場合は島を縮小するか、より細かい解像度を取得するために多くの島を含む大きなマップを使用するのは簡単です。
パスファインディングのためのオプションの最終ステップ
作成した高レベルのグラフを基になるセル/タイルと組み合わせて使用してランタイムA *を実行するか、基になるセル/タイルでヒルクライミングを実行して動きをよくすることができます。
ゴールアイランドの中心(または任意の)座標に、インフルエンスセルを配置できます。この影響は、共同拡散のように「香り」を汲み出すことができます。この香りは、スタートアイランドであった場所に戻るまでずっと広がり、徐々に弱くなります。最初はエンティティですが、香りの低いセルから香りの高いセルに昇順し、毎回犬を操作するのと同じようにゴールに近づけます。各パスはほぼ線形であるため、実行時にA *を使用することを回避できます。または、島のグラフでも同じことができますが、タイルレベルでエンティティをナビゲートする必要があるため、その方法は少し複雑になります。したがって、最初の方法の方が良いでしょう。どちらの方法でも、低処理コストで目標に移動できます。