2Dタイルベースの横スクロールテレインをランダムに生成するにはどうすればよいですか?


11

次のタイルセットを使用して、2Dサイドスクローラーゲームのマップをランダムに生成したいと思います。 ここに画像の説明を入力してください

たとえば、ビットマスキングプロセスに関するいくつかの優れた記事を見つけました:http ://www.angryfishstudios.com/2011/04/adventures-in-bitmasking/ http://www.saltgames.com/2010/a-bitwise -適用するタイルマップの方法/

巨大なif句やswitchステートメントを実行する代わりに、ビットマスク/タイルマスクを使用するアイデアが好きです。

ただし、プロセス全体の視覚化に問題があり、これらの記事のいずれもランダム化について述べていません。

私のタイルは、リンクした例のタイルのように、1つの方法だけでなく、複数の異なる方法で組み合わされます。

たとえば、以下はほんの数例です。

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

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

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

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

私のタイルはさまざまな方法で組み合わされているため、8ビットマスクは機能しないと思います。そのため、より大きなビットマスクを使用することを考えていました。char [8]やchar 4のようなもの。

誰かが、一般的なアルゴリズムがどのように見えるかの疑似コード/例を見せていただければ、私はそれを大いに感謝します。

回答:


3

はい、マスクサイズはオプションの数が増えると大きくなります。独自のリンクhttp://www.saltgames.com/2010/a-bitwise-method-for-applying-tilemaps/ 2番目の部分では、主なアイデアについて説明しています。

基本的に、タイル間の「境界線」ごとにXの可能性を列挙する必要があります。特定の例では、「タイルの上部/下部」は(1)白(2)カバーされているか、または(3)半分カバーされているかのように見えます。

しかし、マスクはタイルの可能性を描画できるものに制限するのに役立つだけで、それ自体は実際のマップを賢明な方法で生成する方法を示す方法ではありません。

あなたの特定のタイルセットは実際には非常に制限的です-それは単一の表面の上昇/下降のみを説明し、「整数レベル」の開始点ではいくつかの有効な選択肢しかありません。たとえば、タイル#2の後は、タイル#1または#8のみが可能です。左から右に移動して、前のタイルの後に来ることができる(少数の)タイルのリストを作成し、それらの1つをランダムに選択することができます。


これが私が探している答えだと思いますが、まだ少し曇っています。説明の最後の部分がどのように機能するかについて、テキストまたは疑似コードのどちらかでもう少し詳しく説明できますか?「左から右に移動して、前のタイルの後に来ることができる(少数の)タイルのリストを作成し、それらの1つをランダムに選択することができます。」
erebel55 2014

1
タイルタイプごとに、その後に許可するタイルのリストを用意します-タイルが非常に少ないため、手動ですばやく実行できます。「高さ」が変わり、新しいタイルの下のすべてを#10で埋めます。
Peteris 14

ああ、あなたはビットマスキングの代わりにこの方法を使うと言っているのですか?
erebel55 2014

1
はい、ビットマスキングはすべての2Dコンテンツに意味がある場合に役立ちますが、マップは単一レベルの高さの異なる水平面であるように見えます。
Peteris 14

それは理にかなっています、「山」はさまざまな高さであり、互いに流れ込みます。したがって、本質的には、移動に伴って高さが変化する連続的な山になります。さまざまなポイントでランダムな大きさを持つコサイン/サイン波のようなものです。マップを生成するときに、左から右または上から下に移動する必要がありますか?
erebel55 2014

6

1Dパーリンまたはシンプレックスノイズ関数の使用を検討しましたか?これには、次のような多くの利点があります。

  1. 無限(浮動小数点精度の範囲内)、繰り返さない地形

  2. あなたの例のように、リアルタイムで(高速なシェーダーでも)、または事前に生成してテクスチャに保存できます。

  3. パーリンとシンプレックスの両方が連続しているため、境界線は自動的に一致します。

  4. 地形自体は疑似ランダムですが、エンベロープ関数を適用したり、平坦な領域やその他の特定の地形機能が必要な領域のオクターブ数を減らしたりするのは簡単です。

1D Perlin実装のかなり完全な説明について、このリンクを参照してください

エンベロープは基本的に、出力を保存または表示する前にノイズ関数で乗算されるスカラーフィールドまたは関数です。

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

(上記の記事から借りた最初の画像。)

この例では、赤い線は次のように定義された区分関数を表します

x < 0.3 : y = (0.3-x)/0.3)
x < 0.5 : 0
x < 0.7 : (x - 0.5) / 0.2
else    : 1

...滑らかな関数を使用してより適切に定義できます。この場合、高原の前に物事を0に縮小し、その後1に戻します。

更新

これは、ディフューズ+スペキュラライティングが適用され、完全にvert + tess + fragシェーダーパイプ内で生成された、私のプロジェクトの1つからの3Dシンプレックス「テレイン」の例です。あなたの状況では、地形の傾斜を取得するために、これから垂直スライスを取り出します。

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

そして、トップダウンの正投影ビュー:

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


これは実際のタイル画像自体を生成するためのテクニックですか?
erebel55 2014

1
@ erebel55はい。2D関数を使用して、(例に基づいて)植物のさまざまな子を画像内のどこに配置するかを決定し、傾斜した地形を生成することもできます。私はこれを3Dで使用して素晴らしい結果を得ました。
3Dave 14

興味深い方法のように見えますが、すでにイメージを作成しているので、このルートをたどるのがよくわかりません。
erebel55 2014

@ erebel55ええ、それがあなたのために働いているなら、既存のものを投げる理由はありません。
3Dave 14

ランダム生成はまだ機能していませんが、私は望んでいます;)この方法は興味深いものであり、将来的に使用する可能性があるため、この方法の考えに賛成票を投じました。ありがとう
erebel55 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.