複数のタイルを占めるオブジェクトのグリッド内のパス検索


7

私が取り組んでいるグリッドベースのゲームで、グリッドの複数のタイルを占めるオブジェクトを追加したいと思います。この種のオブジェクトのパスを見つけるためのアルゴリズムや手法はありますか?

回答:


5

一般に、既存のパスファインディングアルゴリズムを幅に依存するように調整します。これは主にA *を適応させることを意味しますが、ゲームはグリッドベースであるため、脂肪の迷路解決するためのアルゴリズムを見つけることができます役立つ場合があります。

A *の場合、最も基本的な解決策は、移動ルールに従って、幅のアサーションを計算に追加することです。ただし、これによりパスファインディングコードが混乱し、通常サイズのエンティティのパスファインディングが遅くなります。

または、グリッドをノードベースのパスファインディングネットワークと見なすこともできます。大規模なエンティティの場合は、サイズを考慮したセカンダリネットワークを作成し、それを移動とパスファインディングに使用できます。これには、大きなエンティティに合わせてパスファインディングを調整して期待どおりの動作をさせることができるという利点がありますが、シーンごとに複数のマップを作成してメモリに保持するため、モバイルプラットフォームのゲームに影響を与える可能性があります。

これらの方法のどちらも目的に合わない場合、ナビゲーションメッシュ パスファインディングアルゴリズムでインスピレーションを探すことができます。これは、本質的に幅を認識します。


6

1つのオプションは、次のようにオブジェクトをグリッドに「ペイント」することにより、オブジェクトのサイズを考慮した2番目のグリッドを計算することです。これが元のグリッドです:

#########
#..b....#
#.#.....#
#.####..#
#.......#
#.......#
#..#.#..#
#a.#.#..#
#########

2x2オブジェクトがからaに取得できるかどうかを確認しbます。2つ目のグリッドを計算します。ここでは、壁を作成するたびに(#)、壁の上部と左側に壁を追加し(x)、各単一の壁セグメントを2x2のセグメントに変換します。今それは次のようになります:

xxxxxxxxxx
x#########
x#xxb...x#
x#x#xxx.x#
x#x####.x#
x#......x#
x#.xxxx.x#
x#.x#x#.x#
x#ax#x#xx#
x#########

次に、グリッド自体がサイズを考慮に入れるため、オブジェクトを1x1として扱うことにより、このグリッド上でパスファインドを実行できます。


1
オブジェクトのサイズごとに異なるグリッドを作成する必要があるため、このオプションはあまり好きではありません...
miguelSantirso

@miguelSantirso:いいえ、必要なのは、各タイルに使用可能な幅広い値を含めることだけです。タイルに複数のサイズがあり、最大値が小さければ、これは各サイズが各正方形に収まるかどうかを示すビットフィールドになることもあります。
Jack Aidley、

0

munificentの回答を拡張して単一のサポートグリッドを格納できます。これは、オブジェクトサイズごとに通過可能性を格納するのではなく、この場所と最も近いバリアの間のハーフタイル幅の数を記録する距離フィールドを格納します。(または、何もヒットせずにこのタイルの中央に配置できる最大のオブジェクトの幅)

  • 壁タイルの距離は-1です(このタイルの中心は壁の大部分の内側にあります)。
  • 少なくとも片側で壁に隣接するタイルの距離は1です(タイルの半分がこのタイルの中心を最も近い壁の端から分離しています)。
  • 隣接する壁のないタイル、つまり壁に隣接するタイルに隣接するタイルの距離は3です(1つのタイルの幅は隣の中心に到達し、残りの半分のタイルはそこから壁に到達します)。

このグリッドは、マップを空のスペースでマップサイズよりも大きい整数に、壁のサイトでは-1に初期化することで入力できます。次に、各タイルを繰り返し、> 0をその隣の最小値に2を加えた値に設定します。

次に、パスファインディングアルゴリズムの中で、

if (!IsPassable(PassabilityMap[x, y])) continue;

if (DistanceToObstacleMap[x, y] < pathfindingAgent.size) continue;

これで、単一のマップで任意のサイズのユニットのパスファインディングを処理できるようになり、格納/チェックの可否は、タイルごとに1ブールの場合と同等のコストで維持されます。

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