1

2D タイルマップ ゲーム用のマップ ジェネレーターを作成しようとしています (Civilization のようなゲームに似ています。小さな島や大きな大陸などを作成する機能が必要です)。私がやりたいことをほぼ実行する記事を見つけましたが、それはフラッシュで書かれています。パーリン ノイズからビットマップを生成する便利な関数があるようです。

class BitmapData
function perlinNoise(
    baseX:Number, 
    baseY:Number, 
    numOctaves:uint, 
    randomSeed:int, 
    stitch:Boolean, 
    fractalNoise:Boolean, 
    channelOptions:uint = 7, 
    grayScale:Boolean = false, 
    offsets:Array = null):

これは記事で使用されています(ただし、Javaを使用しています)。だから今、私は自分でパーリンノイズを実装しようとして立ち往生しています(基本的には、純粋なJava実装を見つけてコピー/貼り付けます)。

私はパーリンノイズを使用する背後にある基本原則を理解しようとしています-私の基本的な理解:

  1. 必要なマップのサイズを定義します (私の場合は約 100 x 50 タイル)。
  2. パーリン ノイズ オブジェクトを初期化します (周波数などのパラメーターを設定します。これらのパラメーターが島のサイズなどにどのように影響するかはよくわかりませんが、しばらくの間置いておきます)。
  3. マップ内の各タイルを反復処理し、パーリン ノイズ オブジェクトに値を尋ねます。返された値は、私が推測している高さの値として解釈できます。
  4. 次に、高さの値に基づいてタイル タイプを割り当てます。

反復コードは次のようになります。

for (int x = 0; x < 100; x++) {
    for (int y = 0; y < 50; y++) {
        int height = perlin.getValue(x, y);
        if (height < 5); // this tile is water
        else if (height < 20); // this tile is shore
        else if (height < 40); // this tile is hill
        else // this tile is mountain
    }
}

それは一般的に正しいですか?それは少なくとも出発点になるでしょう。

私が探している記事 (フラッシュで書かれた): http://www.nolithius.com/game-development/world-generation-breakdown

便利なパーリン ノイズ関数が組み込まれている Flash BitmapData クラス: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#perlinNoise ()

ありがとう

4

1 に答える 1

1

適切な初期化が行われると、反復コードは私が見る限り機能するはずです。つまり、2D パーリン ノイズを水、海岸、丘、山にしきい値設定する場合です。

このページには、Perlin ノイズと疑似コードの例についての役立つ説明がいくつかあります。基本的に、このアルゴリズムは、周波数の増加と振幅の減少を伴うノイズ関数を加算します。

于 2012-08-24T21:10:47.107 に答える