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