(比較的)線形のダンジョンパスを生成するにはどうすればよいですか?


8

アクションサイドスクローラーのコンセプトを開発しています。必要なのは、(比較的)まっすぐなマップを生成する方法です。これはつまり…

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

このマップが少しずれていても、1つの単純なルートに従っていることは明らかです。これで、迷走経路(ショートカット、または秘密の通路)も実装します。そのため、おそらく、3番目の円で囲まれた領域から4番目の領域に移動するには、メインパスと、より強力な敵で満たされた、より高速でより高い報酬が得られる秘密の通路があります。

ここで行き詰まりに達しました。いくつかのオプションを調査していますが、実際には何も進歩していません。この種のパスを生成するためにどのようなアプローチを使用できますか?これまでのところ、Java、C#、およびC ++で実験してきたので、プログラミング言語に縛られることはありません。同様に、特定のゲームエンジンに対する現在の依存関係もありません。


11
私はあなたが探している最終結果が何であるか明確ではないと付け加えます。表示する「地図」は、地域の真上からのビューです。あなたは、2D開発している -scrollerを。2はどのように関連していますか?
ヴァイランクール

「最良の」表現はあまり役に立たないため、質問から削除しました。私はまた、すべての潜在的に有効な回答をしているあなたの3つの提案のアプローチを、削除しました。提供されたソリューションを比較することは、通常、ここで検討するクエリではないため、質問に潜在的なソリューションを含めない方が一般的です(ただし、通常、既存のソリューションバイアスがない場合、問題を解決する方法を尋ねることが一般的です)。また、編集によって取り除かれていると思われるコメントチャットの一部をクリーンアップしました。

1
このラインは、直線から始めてパーリン(またはシンプレックス)ノイズを追加したとき(数オクターブ)とほとんど同じです。探検すべき分野かもしれません(私は動的な時変照明を作成していました)
Richard Tingle 2016年

回答:


15

必要条件

  1. AからBへの複数のパスが必要です。
  2. グリッドスペースで作業したい場合、これはおそらくサイドスクローラーのタイルスペースです。
  3. パスが交差したくない場合は、ゲームの進行が損なわれます。
  4. あなたはパスが合理的に有機的に見えるようにしたいです。

ボロノイ図

ボロノイ図は、空間を埋める平面グラフです。

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

それらの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 *を使用することを回避できます。または、島のグラフでも同じことができますが、タイルレベルでエンティティをナビゲートする必要があるため、その方法は少し複雑になります。したがって、最初の方法の方が良いでしょう。どちらの方法でも、低処理コストで目標に移動できます。


JavaでVoronoiとPerlin Noiseを使用してマップジェネレーターを作成しました。おそらく、それが出発点として役立つでしょう:github.com/dragondgold/Map-Generator
Andres
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.