類似したタイルが互いに隣り合って生成される可能性を高める


9

私はタイルマップシステムに取り組んでいます。これは、ここではこのように見えます(緑は草、空気は白、石は灰色、青は水です)。

タイル

単純な乱数ジェネレータを使用して、タイルが草である可能性が45%、水である可能性が30%、石である可能性が25%になるようにします。

とにかく、草/石のブロックが固まり、陸塊を形成する傾向を高め、ウォーターブロックを海に形成することができますか(Minecraftのようなゲームで見ることができるもののようなものですか)?

回答:


17

あなたは近くのブロックをチェックし、そこにあるものに応じて確率を変えるアルゴリズムを使うことができます-しかし、私はそれが主に間違ったアプローチだと思います。

あなたが見たいのはフラクタルノイズタイプです-この場合、パーリンまたはシンプレックスノイズです。ノイズを生成する場合、-1から1までの値を取得します。

http://en.wikipedia.org/wiki/Perlin_noise

次に、水を作るもののしきい値を設定することにより、水位を調整できます。他のブロックでは、2番目のノイズセットを実行して、岩と草を切り替えることができます。(このようにすると、水の大きな塊ができますが、石の塊は小さくなります)。

getTerrain(x,y) {
if(perlin_noise(x,y) > 0) {
    if(perlin_noise(x * scale,y * scale) > 0) {
        return rock
    } else {
        return dirt
    }
} else {
    return water
}

スキャンとトスの方法は非常に複雑であり、過度に堅牢ではないので、私が楽しんだ別の方法を提案します。

マップ全体にグリッドを配置し、マップを大きな正方形に分割します。

各交差点で乱数を生成します(0と1の間がパーセンテージで機能します)

各四角形を4つの偶数の四角形に切り分けて細分割します-古い線に沿って、細分割線を見つけたら、隣接する2つの点の間に乱数を生成します。同様に、十字の中心について、最も高い点の間にある点を生成しますおよび最低値。

すすぎ、繰り返します。最初のパスから最初のランダム性が得られますが、後者のパスではある程度の均一性が得られます。疑似乱数では申し訳ありません。

0-------5  0---3---5 0-1-3-4-5 011233455
|       |  |   |   | | | | | | 012344555
|       |  |   |   | 0-2-4-6-5 002445665
|       |  |   |   | | | | | | 123445666
|       |  2---5---7 2-4-5-7-7 234455777
|       |  |   |   | | | | | | 233455688
|       |  |   |   | 2-3-5-5-9 223455589
|       |  |   |   | | | | | | 233455589
2-------9  2---4---9 2-4-4-5-9 234445579

三角形の場合は、細分割してもクロスバーが失われないため、これはさらに効果的です。

もちろん、絶対的に最良の結果はこれらの方法を組み合わせることから得られます-レイヤーオンレイヤー、いくつかのテクニックはあなたに素晴らしい土地塊を与え、他のものはあなたに素晴らしい洞窟を与え、他のものは丘のために働き、そしてもっと多くが水システムのために働きます。


+1私はノイズへのジャンプが一般的にこれがつながるところだと思うので..それはジャンプの少し大きすぎるのではないかと思っています。
ジェームズ

3

すでに述べたように、ノイズは1つの良い解決策です。別のオプションは、データで2回目のパスを取得して、目的のレイアウトに向けてデータを微調整することです。ガウスぼかしは、これを実現する多くの方法の1つです。これでパスを実行すると、各タイプの「丸い」ブロブが得られます。

ただし、どの方法を使用する場合でも、プロセスの結果を新しい場所に保存することが重要です。マップをその場で変更すると、すでに処理した部分がアルゴリズムに影響を及ぼし始め、奇妙なパターンになってしまいます。


2

これを行う比較的簡単な方法は、ランダムな位置に多数の核を作成することです。これらの点のボロノイ図を描きます。結果の各領域に要素を割り当てます。

その結果、見た目はかなり醜く、機械的に見えます。境界線を少し濁らせれば、きちんとした形になります。

大きなマップを生成する場合は、2つのレベルでこれを行うことができます。たとえば、20個の核を使用して初期ボロノイ図を作成し、結果として得られる各地域を国と呼びます。400個の核を使用して別の図を作成し、結果の各領域を牧師館と呼びます。

国に完全に含まれるすべての牧師には、国の要素があります。2つ以上の国に部分的に含まれている牧師館は、ランダムにその包囲国の要素の1つを取ります。

この投稿は写真に値しますが、私はそれを提供するのが面倒です。



0

あなたはこの方法を使用してそれを行うことができます:

  • すべてのタイルを不特定のリストに入れます
  • 不特定のリストにタイルがある間
  • ベギン
  • そのリストからタイルを1つ選びます
  • そのタイルのネイバーをチェックし、そのネイバーに応じてタイプを選択します
  • 指定されていないリストからそのタイルを削除します
  • 終わり
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.