私は2Dタイルエンジンを開発しており、現在、マップ生成アルゴリズムに取り組んでいます。
私は通常、次のような単純な高さマップの生成に関係する基本的なものを試しました
しかし、私はいつも同じ問題を抱えています。この種のアルゴリズムは、高さコンポーネントもあるタイルマップを処理する場合に適しているようですが、私の場合はそうではありません。
私は基本的に草、海、砂漠などのスプライトを持っていますが、生成された高さに応じてマップ内に配置するべきではなく、次のようなものです。
どのようなアプローチを試すべきですか?
必要なことを実行するための特殊なアルゴリズムを開発することで、サブコンポーネントの問題(砂漠、丘、山など)を解決しました(たとえば、山はある地点から始まり、方向を変える可能性があります)が、次の生成に失敗しています。基本的な島(パンゲアまたは何度ものサイズにカスタマイズ可能)。
私が探しているものは、文明アルゴリズムのようなものです。
[丘の生成、パーリン、ダイアモンドスクエア] ...この種のアルゴリズムは、高さコンポーネントも含むタイルマップを処理する場合に適しているようですが、私の場合はそうではありません。
しかし、それはあなたの場合です。山は平野よりも高く、平野は水よりも高い。
___/
___/ ___ Mountain cutoff
___/
______/
____/ ___ Water cutoff
__/
データを量子化して、1セットのレベルの間にある場合は、1つのタイプのタイルとしてカウントされ、異なる範囲にある場合は、異なるタイプのタイルとしてカウントされます。ある程度の詳細を捨てることになりますが、それでも、生成しているノイズのタイプに一致するアウトラインが得られます。
おそらくかなりの調整が必要であり、他の土地の特徴(通行不能な山以外)を自分で生成する必要がありますが、コンテンツ生成ソリューションでは多くの調整が必要になります。
私は、ランダムな地形を作成するために「アリ」を使用すると他の人が言及しているアプローチを使用しました。使用されたアプローチの説明:
まず、特殊なタイルクラスの2次元長方形配列(x、y)を使用してタイルマップを生成しました。タイルクラスは、ドローポイントや地形タイプなどのタイル関連情報を保持します。
次に、特別な「ant」クラスを作成しました。これは、タイルマップの周りを「ステップ」する目に見えないエンティティと考えることができます。アリが新しいタイルに移動するたびに、基礎となる地形タイプが変更されます。アリは1タイル移動するたびに、8方向に移動でき、方向が変わります。各ステップの後に取る方向はランダムです。
一定またはランダムな量のアリを、一定またはランダムな量の寿命でスポーンします。ライフタイムは、削除される前にトラバース/ステップすることができるタイルの量です。
最も一般的な地形の種類を制御できるようにするために、「地形タイプ」配列を作成します。この配列には、地形タイプのリストが含まれています(基本的にはintのみ)。すべてのタイプのテレイン間で均等なバランスをとるには、各テレインタイプの1つだけをテレインタイプ配列に追加します。特定の地形タイプをより一般的にしたい場合は、その特定の地形タイプを使用して、配列にさらにエントリを追加します。
次に、アリが変更する地形を決定する必要がある場合、配列インデックスとしてランダムな整数を使用して、地形タイプの配列でルックアップを実行します。
パラメータ(アリの量、アリの寿命、地形タイプの配列)を微調整する必要がありますが、これまでのところ、いくつかの非常に優れた地形を実現しています。
たとえば、特殊なパターンでトラバースするなど、より洗練されたタイプのアリのクラスを使用することで、さらに強化できます。海に信頼できる島を作成するには、アリの動作を変更して、アリの動作にいくつかの制約があるようにする必要があります。移動する方法(土地の長い「スパイク」、非常に分散した小さな島などがランダムに発生しないようにします)。
以下は、アリのアプローチを使用して作成した小さなアプリによって手続き的に生成された、フォレストのタイルマップの例です。これがあなたをあなたの道に導くことができることを願っています!
アプリのソース(VB.NET)は Github で入手できます。