Pyxel 地形の自動生成(複雑な地形)

Pyxel 地形の自動生成 ノイズの合成

 前回の記事「Pyxel 地形の自動生成 - 勉強ボックス管理者ブログ」で,パーリンノイズを使ってタイルマップを自動で配置しました。
 丸みを帯びている境界線をでこぼこにするコード例を紹介しましたが,こちらの記事でより良さそうな形のものに訂正します。

 参考サイト
 ・コード例 地形プロシージャル生成 - パーリンノイズアルゴリズム - Qiita
 ・オクターブの説明 パーリンノイズを理解する | POSTD

 

ノイズの合成

 フラクタルの図形のように,各辺に同じ変化を加えてどんどん複雑にする考え方のようです。
 Wikipedia Von Koch curve.gif)

 

配置するタイル

 以下のタイル(水辺と陸地のイメージ)を準備します。
 ※コード例ではプログラムで設定していますが,リソースファイルに描いたタイルでかまいません。
 

コード例

game/genmap01a.py at main · benkyoubox/game · GitHub

抜粋

def genmap(self,num):
    z = 0
    fieldtile_y = 0
    for y in range(self.width//8):
        for x in range(self.height//8):
            n = 0
            scale = 0.035
            amp = 1
            for i in range(num):
                n += pyxel.noise(x*scale, y*scale, z*scale) * amp
                scale *= 2
                amp *= 0.5
                
            if n < -0.3:
                tileNo = 1
            elif n < -0.2:
                tileNo = 2
            elif n < 0.3:
                tileNo = 3
            else:
                tileNo = 4
            pyxel.tilemap(TM).pset(x,y,(tileNo,fieldtile_y))

    return

 ・各座標でnoise()命令を複数回呼び出し,ノイズ値を合成しています。
  「amplitude 振幅」の値が小さくなることで,だんだん影響が小さくなっています。
  計算回数が非常に多くなるので,ゲーム中に動的に使うのには向きませんが,全体マップの元にするデータを作るときなどには役立つと思います。(作成したタイルマップを保存するにはsave()命令を使います。例「pyxel.save("newmap.pyxres")」)

実行結果
num=1

num=2

num=3

num=4


・noise()命令コード例 game/api_math.md at main · benkyoubox/game · GitHub
 scale の値が大きいほど変化が多くなります。値を変更して確認してみてください。

 

Webブラウザでのデモ

 計算量が多いので重くなりますがブラウザでのデモです。 
 Pyxel Web Launcher

 ※スペースキーを押してしばらく待つと,合成回数を増やして地形生成
 ※上下左右方向キーで移動


関連記事

kinutani.hateblo.jp