ランダムマップ生成


63

Javaで2DタイルマップRPGゲームを開始/開始しました。ランダムマップ生成を実装したいです。さまざまなタイル(汚れ/砂/石/草/砂利など)のリストと水タイルおよびパスタイルがあります。問題は、マップをランダムに生成し始める場所がわからないことです。

地形セクションが必要になります(その一部は砂、土などです)。Minecraftでさまざまなバイオームがあり、それらが互いにシームレスに変換される場所と同様です。最後に、これにランダムなパスを追加する必要があります。また、マップ全体で異なる方向に進みます。

私は誰にも私にすべてのコードや何かを書くように頼んでいるのではなく、ただ正しい方向に私をpしてください。

tl; dr-バイオーム、パスを含むタイルマップを生成し、バイオームがシームレスに相互に入るようにします。

回答:


68

サイト上の他の多くの関連する質問の中に、マップ生成に関するリンクされた記事があります:ゲーム用の多角形マップ生成は、その記事からいくつかの優れた戦略を収集できますが、実際にはそのままでは使用できません。

チュートリアルではありませんが、ドワーフ要塞の世界地図の生成方法に関する記事があります。基本的に、高さ、湿度、温度、塩分などの複数のノイズ層を生成します。次に、次のようなものを使用します。

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

またはこれ

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

以前に生成したノイズの層に基づいてバイオームを生成します。通常、これにより、バイオーム間の移行がかなりスムーズになり、移行は論理的です。また、標高に基づいて水分マップと温度マップを変更します。これにより、自然に「木材のライン」が生成され、雪のかぶった岩山が生成されます。

私はこの戦略をゲームで使用しており、このようなマップを非常に迅速に作成しています

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

さらに、このビデオの冒頭で、さらにいくつかのマップをスクロールして見ることができます。

そして、ここから始めましょう。

タイルエンジンでランダムな「ワールド」を作成するにはどうすればよいですか?

手続き的に生成された世界でフィーチャ領域を識別するにはどうすればよいですか?

マップ生成のためにタイル化可能なソリッドノイズを作成するにはどうすればよいですか?


その一方でポリゴンマップ生成のためのゲームのリンクは非常に素晴らしい記事で、a)のそれはタイルマップグリッドではないので、私はそれがこの質問のために非常に適していないと思うと、b)それは、生物群系を持っていません-地形のテクスチャがあります高さに基づきます。
タピオ

@Tapioそのとおりです。詳細を更新しました。
マイケルハウス

@ Byte56ありがとう、これはすべて私に出発点を与えてくれます!:)
トムO

@ Byte56数年前から私の質問に言及していることに気づいたので、実際のコードで更新しました!
ニックBadal

1
ところで、ポリゴンマップ生成プロジェクトは、高さを表示しないタイルマップを持つゲーム用に作成されました。高さとポリゴンはバイオームを生成するためにありますが、実際にはゲームには表示されません。
-amitp

29

ここでの他の答えは、この特定のニーズに合った静的なランドスケープの種類を生成するのに非常に適しています。この質問に出くわす人々が、時間とともに変化する風景を作成したい場合や、この手法を使用してより現実的に見えるようにしたい場合に探している他の方法があります。

他の回答とは異なり、これは完全に空のマップで開始します。あなたが海面であると考えるものから始めてください。256の可能な高度がある場合、Perlin Noiseを使用して非常にわずかな変動を追加します。どちらの方向でも3〜5を超えて変動しないでください。これにより、実際に長時間シミュレーションを実行しなくても、ランドスケープの最初の数十億年が構築されます。

プレートテクトニクス

マップを直線または曲線に沿って分割してプレートを作成します。プレートの形状が詳細になるほど、風景が面白くなります。それらを大きくしてください。各プレートに方向、速度を与えます。一定の時間枠で、プレートをマップ上で段階的に移動し、それらの上にあるすべてのタイルをドラッグします。

2つのプレートが交差するとき、どちらが上に行くか、下に行くかを選択します。この選択はランダムにすることができます。下に指定されたプレートのタイルは、5段階で瞬時に高さが減少します。プレートが上下に指定されると、プレートとの今後のすべての相互作用は次のルールに従います。

  • 指定されたプレートが指定されていないプレートと交差する場合、指定されていないプレートは反対のタイプになります。(したがって、UDプレートは、オーバーを横切るときに下になります。)
  • オーバープレートがアンダープレートの上にある場合、これらのタイルはすべて0〜1の高さのステップで移動し、タイルはオーバープレートの経路をたどります。
  • オーバープレートがオーバープレートと交差する場合、それらのタイルはすべて1〜2ステップ上に移動し、クロスオーバー領域のタイルはドリフトしなくなります。
  • アンダープレートがアンダープレートと交差する場合、クロスオーバー領域の両方のプレートの標高が66%を超えるエリア内のタイルは1〜3ステップ上に移動します(火山活動により、十分な時間をかけて島ができます) )およびこの領域のタイルはドリフトを停止します。

交差するすべてのプレートは、各ステップで現在の速度の20%ずつ遅くなります。さらにリアルにするには、各ステップで移動方向に-10%から10%のランダムな変化を追加します。

必要な数のステップを実行した後。おそらく5〜10個で十分です。プレートが存在しないタイルは、既存の最も低いレベルにドロップする必要があります。

大小?

このマップはそのまま使用することも、拡大して4X4タイル(セル)チャンクに分割し、個々の標高に基づいてそれらのセクションを展開することで、より大きなマップを作成することもできます。各セルの標高をポイントとして扱い、それらのポイント間の大きなマップに滑らかなグラデーションを作成します。したがって、大きいマップが4X4ではなく40X40で、ポイント(0,0)が10で、ポイント(0,1)が1の場合、それらの間の大きいマップ上のタイルは10,9,8,7,6になります、5、4、3、2、1高さ。さらに傾斜を滑らかにするために、Perlin Noiseを追加できます。このすべてのスケーリング手法は、Diamond Squareアルゴリズムに似ています。

川や湖、海、地下水面をシミュレートするため。私はセルオートマトンを使用することを好みます。

高さは浮動小数点または拡張された整数範囲になり、よりきめ細かい追跡が可能になります。水セルの飽和値は、たとえば1〜256の範囲です。マップは均等に開始する必要があります。個々のマップサイズの数値で遊ぶ必要がありますが、通常は次のようなルールに従います。

  • 隣接セルの飽和度が高い場合は、飽和度を上げて高さを増やします。
  • 隣接セルの飽和度が低い場合、飽和度を下げて高さを失います。

すべての隣接セルに対してこのチェックを行います。十分な数のステップを実行します。必要に応じて、その温度による飽和の損失/増加の量を変更することにより、このシミュレーションに温度を追加できます。標高に基づいて変更することもできます。自然の湖と川が形成されるはずです。いくつかは海に落ちます。(海はどのようなメトリックでも満たされることはおそらくありませんが、いずれにせよ、海面下の何でも、最後に満たされる水として指定します。)

他の回答のように、バイオームを作成するために使用する温度と飽和データを保持できます。より正確で興味深いものでなければなりません。極に雪に覆われたバイオーム、中央に暑いバイオーム(温度の滑らかな目盛り付きリストを使用している場合)

風をシミュレートすることもできるため、標高に基づいて温度が変化します。必要に応じて、温度シミュレーションと水シミュレーションの実行を前後に切り替えることができます。ただし、温度変化を使用して何も作成していないため、その方法についてはコメントしません。

進化する風景

周囲の土地、水、熱のシミュレーションを維持し、それらの影響を劇的に減らし、プレートの動きを止める場合、これらのメトリックを時間の経過とともに変更し続けることができます。私はあまり頻繁に計算を実行しませんが、この方法で変更に応答する世界地図を取得できます。

結論

これらの種類のテクニックはかなり複雑ですが、より現実的で進化する効果を生み出します。それが価値があるもののためにそれを取る?


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