私は、基本的に「2次元の側面図」に見えるゲーム(シミュレーション)に取り組んでいるアプリケーションのパーリンノイズを調べています。パーリン ノイズがどのように機能するかは完全には理解していませんが、一般的な考え方は理解できます。
コードPerlin Noiseでこの記事を見つけたので、前にそれを与えることにしました。現時点でワールド ジェネをセットアップする方法は、各「チャンク」に 16x16 のタイルがあり、Y >= HEIGHT / 2 の場合にすべてを作成すると述べたところです。 tiles 'solid' else 'air' なのでうまくいきます.. しかし、ご想像のとおり、土地は非常に平らです。そこにパーリン ノイズが入ると思ったので、上記の Web サイトにあるコードを使用しましたが、ノイズをソリッド/エア タイルに変換する方法がわかりません。
あなたが見ることができるように、非常に現実的な地形ではありません
地形が以下のようになることをもっと探しています。山となだらかな丘のように見えるはずです)鋭いエッジは気にしません(正方形)
タイル配列を反復してノイズを上に変える方法がわかりません
現時点では、タイル配列 (2d) をそのように反復処理していますが、最初の図からわかるように、タイルが固体であるかどうかをランダム化するだけで、なだらかな丘や山は作成されません。
for(int Y = 0;Y < HEIGHT;++Y) {
for(int X = 0;X < WIDTH;++X) {
Tile Tile;
if(noise(X,Y) < 0) {
Tile.Type = BLOCK;
} else {
Tile.Type = Air;
}
// Then I push the Tile on to a vector
また、この 16x16 の「チャンク」の右側には、このチャンクと一致させる必要がある別のチャンクがあり、その後の次のチャンクについても同じことが言えます。チャンクは以前と同じであってはなりません。意味がある場合は、別々のチャンクではないように見えるようにするだけです。
どんな助けでも大歓迎です!ありがとうございました
アップデート
パーリン関数をこれに変更し、フレネルが提案したものを実装しました:
PerlinNoise *test=new PerlinNoise(0.25, 6); //0.25 is Persistance 6 is Octaves
float f,h;
float seed = 804.343;
for (int X=0; X!=MAP_WIDTH; ++X) {
f = test->GetNoise((X * ChunkX) * seed);
h = f * MAP_HEIGHT + (MAP_HEIGHT / 2);
for (int y=0; y<h; ++y) {
Tile tempTile;
tempTile.Tile = TILE_NONE;
Tiles[X][y] = tempTile;
}
for (int y=h; y<MAP_HEIGHT; ++y) {
Tile tempTile;
tempTile.TileID = TILE_BLOCK;
Tiles[X][y] = tempTile;
}
}
これを行った後、見た目がずっと良くなりました。X * ChunkX
各ノイズについて、すべてのチャンクが同じではないかのように、次のようになりました。
ご覧のとおり、地形は以前よりも希望どおりになりましたが、実際の地形のようには見えません。滑らかではないため、なだらかな丘を作成するために全体的な外観を滑らかにするためにできることはありますか?平原
そのノイズ値の下でのタイルの作成を削除したので、範囲が見やすくなりました
ご覧のように問題ないように見えますが、疑似乱数のように見えないように、値を「平滑化」するだけで済みます。また、左側に表示されている最初のチャンクが途中で同じ値を持っているのも不思議です。
ありがとう。