2019年6月4日火曜日

【javascript】プログラムリハビリ、ダンジョン生成


最近気候の関係とか、仕事の関係とか相関があると思うのですが、
ちょっと気持ち的に落ち込んできていて
ほんとうになにもやる気が起きなくてですね、
あ、これはいかんなって思ったんで少しjavascriptのプログラムでもやろうと
思ったので組んでみよう。



____________________________________

Runstant


プログラムはここで書いています。

複数ファイルで書いたりはどうやるかまだ分かってないんですが、
ちょこちょこっと書いて動かしてみるくらいだと十分すぎるくらいは使えます。

WebGLとかもできるみたいなんですが、
そこまで凝ったものは考えてなかったのでPhina.jsだけ入れて作ってみました。


Phina.jsはHTML5でゲーム系作成に向いているというライブラリですね。
前はenchant.jsを使っていたのですが、これに近い間隔で使えます。
というか、関連性があったりする…?



____________________________________

ローグライクダンジョンの生成プログラム(を組んでみる)



そんな感じで、とりあえずプロジェクトを作成して組み始めます。
あーん、ローグライクのダンジョン生成プログラムとか組んでみよう。
http://runstant.com/Chubachi/projects/1117ae84

ローグライクっていうと「不思議なダンジョン」系ですね。
「シレン」とか「トルネコ」とか。
最近だと「チョコボ」の新作も出たんでしたっけ。
あれ系のダンジョンを自動生成するプログラムですね。



大まかな組み方は分かるんですが、
細かいところがあんまりわかってないですね。


今回は部屋作るところまでやってみました。
白い領域がマップの1マス1マス(全体40×40)
青が区画を分割した線
グレーが部屋として作成された部分ですね。


イメージとしてはここから通路を引ければ
最低限の体面はできるのかなと


再帰的に処理を行っているので、どこかで処理が終わるよう
区画分割の限界値(最小値)があったり
部屋領域が小さすぎたりしないように最小値を設定したりしているのですが、
この辺りの設定値が適当な値すぎると
ちょっとマップとしてきったないのが出来たり、
縦に3分割だけしたような手抜きマップが出来たりしますね。





____________________________________

今の仕組み


大体以下の手順で作成していきます。

1.マップ領域の初期化
2.手順1のマップを縦か横に分割する
3.手順2で出来た2つの領域をさらに縦か横に分割する
  (分割する際には2つの領域それぞれ部屋が作れるように領域を確保する)
4.分割すると部屋が作れない状態になるまで手順3を繰り返す
5.分割しない領域まで進んだら、その領域内で部屋を作成する

(※以降未実装)
6.隣接する部屋同士で通路をつなぐ


1.マップ領域の初期化

全体の領域を初期化します。






2.手順1のマップを縦か横に分割する

手順1で初期化したマップ領域を縦か横に分割していきます。
分割のサイズは「部屋領域を確保している」ことでしょうか。






3.手順2で出来た2つの領域をさらに縦か横に分割する

手順2で分割してできた領域に対して
さらに分割を行っていきます。
本来は①側も分割するといいんでしょうけど、
図は面倒なので②側だけ








4.分割すると部屋が作れない状態になるまで手順3を繰り返す

更に③についても分割していきます。
これで合計4つの区画領域を作成することが出来ました。




2~4を分割不可となるまで繰り返していきます。



5.分割しない領域まで進んだら、その領域内で部屋を作成する




①の区画内で1部屋
②の区画内で1部屋…
という感じですべての区画に部屋を作成します。
部屋は区画内を飛び出さないようにすれば大丈夫かな、と。



____________________________________

現状はここまで


あと残りとして部屋と部屋をつなぐ通路の作成が必要なのですが
これはまだ未実装です。


大体は
ここまで作成してきた部屋が属する区画が
隣り合う同士でつないでいけばできると思うのですが…
どうでしょうね?


実際組むと結構面倒なのかな~と思いつつ、
今回はここまでです。

0 件のコメント:

コメントを投稿