2011-01-16 32 views
25

私は2Dタイルエンジンを開発していますが、現時点ではマップ生成アルゴリズムに取り組んでいます。この種: 2Dタイルマップの生成

は、私は通常

  • 丘生成
  • パーリンノイズ
  • ダイヤモンド平方

が、私はいつも同じ問題を取得するような単純なハイトマップ生成に関与する基本的なものを試してみました高さのコンポーネントも持っているタイルマップを扱うときはアルゴリズムの方が適しているようですが、これは私の場合ではありません。

私は基本的にそうに草、海、砂漠などのスプライトを持っていますが、それらがマップ内に配置すべきではありません生成された高さに応じて何か

  • などのすべては海から始まる
  • の島ですマップの中央に配置
  • 砂漠が生成される
  • 山とチェーンが生み出している丘は、(彼らは蛇のようにする必要があります)
  • (彼らは周りのランダムな斑点のようにする必要があります)(これは私が試したアルゴリズムは、ほとんどが失敗した場所です)

私はどのようなアプローチをとるべきですか?

私は、必要なものを実行するための特殊なアルゴリズムを開発することで、砂漠、丘、山などのサブコンポーネントの問題を解決しました(山はポイントから始まり、基本的な島々(パンゲアやそれ以上の大きさのものにカスタマイズすることができます)の生成に伴って発生します。

ただ、私が探しているものをあなたに実用的なアイデアを与えるためには文明化アルゴリズムのようなものです:

alt text

+1

でアプリ(VB.NET)のソースを取得することができます

、私はこれが存在していたとは思いません。最近、http://gamedev.stackexchange.com/ – Hooked

答えて

14

[丘の生成、パーリン、ダイヤモンド平方] ...この種の高さコンポーネントも持っているタイルマップを扱うときにはアルゴリズムが適しているようですが、これは私の場合ではありません。

しかし、あなたの場合です。山は平野より高く、平野は水よりも高い。

     ___/ 
        ___/ ___ Mountain cutoff 
       ___/ 
     ______/ 
    ____/ ___ Water cutoff 
__/ 

それはレベルの1セットの間にある場合、それは別の範囲にあるとき、それはタイルの異なるタイプであるのに対し、それは、タイルの一種としてカウントされるように、あなたのデータを量子化することができます。細かいところを投げ捨てるつもりですが、生成しているノイズの種類に合ったアウトラインが得られます。

これは多分微調整が必​​要になりますが、他の土地の機能(混乱しやすい山のほかに)を自分で作成する必要がありますが、コンテンツ生成ソリューションで多くの調整が必要になります。

+6

があります。手続き型コンテンツ生成アルゴリズム、テクニック、経験などの詳細情報が必要な場合は、最近[このwikiページが見つかりました](http://pcg.wikidot.com/category-pcg-algorithms)を参照してください。それは素晴らしいリソースのように思えますし、あなたの質問で述べたhightmapアルゴリズムをカバーしています。私のサイトではなく、私はそれらに何らかの形で関わっていません - それはちょうど素晴らしいので、私はそれを差したいと思います:) –

15

私は、他の人がランダムな地形を作成するために "アリ"を使用すると言ったアプローチを使用しました。

最初に、特殊なタイルクラスの2次元の長方形配列(x、y)を使用してタイルマップを生成しました。タイルクラスは、描画ポイントや地形タイプなどのタイル関連情報を保持します。

次に、特殊な「ant」クラスを作成しました。このクラスは、タイルマップの周りに「ステップ」を持つ不可視のエンティティと考えることができます。アリが新しいタイルに移動するたびに、基礎となる地形タイプが変更されます。アリは8方向に移動でき、1つのタイルを移動するたびに方向を変えます。各ステップの後にかかる方向はランダムです。

固定またはランダムな量のアリを生存期間の固定またはランダムで生成します。寿命は、除去される前に踏み越えることができるタイルの量です。

どのような種類の地形が最も一般的であるかを制御できるように、私は「地形タイプ」の配列を作成します。この配列には、地形タイプのリスト(基本的にはちょうどint)が含まれています。すべての種類の地形間で均等なバランスを取るには、各地形タイプの1つだけを地形タイプの配列に追加します。特定の地形タイプをより一般的なものにしたい場合は、配列にその地形タイプを追加するエントリを追加します。

次に、変更する地形をアリが判断する必要がある場合は、配列インデックスとしてランダムな整数を使用して地形型配列を参照します。

これはパラメータ(アリの量、アリの生涯、地形のタイプの配列)を調整するのに少し時間がかかりますが、これまでのところ本当に良い地形を達成しています。

さらに洗練されたタイプのantクラスを使用することで、たとえば特殊なパターンなどにトラバースすることで、この機能をさらに強化することができます。海に信じられないほどの島を作るには、antの動作を変更して、どのように移動するかという点では(土地の長い「スパイク」、非常に分散した小さな島などをランダムに取得することはありません)。

以下は、私がantアプローチを使用して作った小さなアプリケーションによって手続き的に生成された、フォレストのタイルマップの例です。これがあなたをあなたの目の前に置くことを願っています!あなたが尋ねる時Github

Procedurally generated 2D tile map of a forest section

+1

+1;これは興味深いアプローチで、[Cellular Automata](http://pcg.wikidot.com/pcg-algorithm:cellular-automata)と多少似ています。基本的にグループ化されたランダムな分布が得られるようですが、それはあなたが望むようなものに見えます。特に、Perlinノイズと比較して、このアプローチでは滑らかなグラデーションが得られそうにないと思うので、特定のタイルタイプ(木など)の方がはるかに魅力的かもしれません。 "数字のテーブル"に関しては、これは[PRNGの重み付け方法](http://stackoverflow.com/questions/3966809)の私の答えと似ています。 –

関連する問題