13の折重です。

工大祭でこんな感じのゲームを展示しました。
ss

真っ暗な洞窟の中を岩を壊しながら洞窟を進んでアイテムや金を集めていくというゲームです。
製作にあたっての目標としては
・とりあえずopenGLとGLSLを使ってみる
・マップの自動生成をしてみたい
でした。
openGLとGLSLについては1週間ほど勉強しただけだったのですが、工大祭も近いですしとりあえず勉強がてら使ってみようかなという感じです。
ただ描画などは三次元空間に行っているのですが、画像を見ればわかる通り完全に2Dゲームです。まあ勉強勉強...

今回はマップの自動生成部分について書いていきたいと思います。

まず、マップを自動で生成するにあたり、ランダムな値をどうするかという問題があります。
ランダムな値がないと単調なマップであったり予測可能なマップになってしまいあまり面白くありません。
今回のゲームではマップをグリッドで区切り、対応するランダムな値が正か負かによって空洞にするか岩を置くか決める、といった方法でマップを生成していきます。
洞窟を作らなければいけないので基本的には岩で、ところどころに道となる空洞があったり、たまに大きな空洞があったりしても面白いかもしれませんね。
C言語には標準で乱数を生成する関数としてrand関数があります。C++11にはrandomライブラリという強力な乱数生成ライブラリもあります。
ですが、これらの乱数生成方法ではあまりに前後の値に関連が無さすぎて変化が急になってしまい、今回のマップの自動生成に使うのはあまり向いていません。

そこで、今回はパーリンノイズというものを使用しました。
パーリンノイズとは、次の画像のような模様を生み出すことの出来る技法です。
Perlin_noise

白色の隣が突然黒色になったりせずに、徐々に変化している様子がわかります。
この、比較的変化が柔らかであるという特性から様々なゲームの地形生成などに利用されています。
今回のゲームの地形生成にも非常に向いていました。

具体的な生成方法について解説しようかと思ったのですが、思ったより長く煩雑になってしまいそうなのと、ネット上に日本語のわかりやすい解説がたくさんあるので割愛させていただきます。
ここらへんがわかりやすいかと思います…

では実際にパーリンノイズを使ってマップを自動生成していこうかと思います。(見えやすいように画面全体を明るくし、描画する範囲も広くしております)
最初に、純粋に黒っぽい部分は岩、それ以外(白っぽい部分)は空洞、という様に設定してみました。
結果はこんな感じ
blog_black

あまり良いマップができていません...
岩も空洞も固まりすぎており、細い道などが無いのであまり洞窟っぽさがありません。
無駄な努力だったかな...と落ち込んでいたのですが、ここで先輩から灰色の部分を空洞にしてみてはどうかとの助言をいただきました。
その結果がこんな感じ。
blog_ash

完璧、完璧です。
ノイズの画像を見ていただければわかる様に、ノイズの性質上白と黒が点在しているということはその中間に必ず灰色の部分はあり、それらは連続しているので道のようになります。
灰色とみなす値を調整することで道の太さをある程度操作することもできます。
また、これに加えて特に黒っぽい部分を空洞にするなどすれば大きな空洞や道を小さな道が繋いでいるような洞窟にすることもできます。アリの巣みたいでいいですね。今回のゲームでは岩の部分が減ってしまうとシステム上困ってしまうのでやりませんでしたが。
blog_mix

こうして無事洞窟っぽいマップを生成することができました。
ひたすらマップを生成していくので情報を保存しておけばプチオープンワールドっぽくなります。
今回のゲームも画面から見切れた部分は別で保存してメモリから破棄していたのでひたすら掘り続けられますし、戻れば掘った道がそのまま残されています。

最初に書いた目標のうち、openGLとGLSLを使うことに関しては本当に使って描画しただけみたいな感じで全く使いこなせていなかったので、現在も引き続き勉強中です。
次に出すゲームはバリバリ3Dでゴリゴリシェーダー使ったものしたいですね。