前回、ダンジョン自動生成の区画作成と部屋作成を行ったんでした。
【javascript】プログラムリハビリ、ダンジョン生成
ちょっと期間が開いてしまいましたが、
少しずつやってます。
____________________________________
Runstant
前回に引き続きRunstantでプログラムを組んでいます。
Runstant
前回のからForkして作成しています。
流石にGitみたいな管理ではないのでバックアップを取っておかないと、
実行後に「あ、やっぱ動かねえわ」ってなってから
「あ、戻せねえわ」ってなって詰んだりします(2敗)
注意しよう…。
____________________________________
前回までのプログラムから
詳細は前回のリンク先で…
とりあえず区画と部屋を作るところまでやったんでした。
次は通路ですね。
部屋と部屋を通路でつなげていきます。
____________________________________
部屋と部屋を通路でつなぐ
で、部屋と部屋を通路でつないでいくのですが、
問題はどのようにつないでいくかですよね。
変につないでしまうと
「通路が交差したり」
「たどり着けない部屋が出来てしまったり」
といったことが起きてしまうと思います。
なので、前回の区画と部屋の情報を基に、
下記の条件で部屋をつないでいくことにしました。
1.部屋は区画に属する
2.区画を分割した際の方向に通路をつなぐ(縦or横)
3.通路は上記の分割方向から作成する(縦方向なら上下から)
4.二つの部屋A,Bから線を伸ばし、区画の境界でその通路をつなぐ
2の部分は本当は側面からも通路がつなげられると
自動生成のバリエーションがかなり広がるんですが、
ちょっと条件が面倒になるので今回はカットで…
で、それぞれ順を追って説明していきたいと思います。
結構雑多に書いているので分かりにくいかも~
1.部屋は区画に属する
前回、全体領域から区画(Section)を作成し、
その区画の中に部屋(Room)を作成したんでした。
この区画と部屋は一対一で対応しますので、
「部屋は区画に属する」とします。
また、下記の情報を格納しておきます
・区画作成時の分割方向
・区画サイズ
・部屋位置、部屋サイズ
上の部屋の場合は
「区画①の領域内にある部屋Aは区画①に属する」
という感じですね。
2.区画を分割した際の方向に通路をつなぐ(縦or横)
1の格納情報として「区画作成時の分割方向」を入れるようにしました。
区画作成時には縦か横で2分割するようにしていたので、
縦の場合は上(A)と下(B)
横の場合は左(A)と右(B)
で分割する形になります。
区画作成でBはさらに分割されていきますが、
通路はAを基準にして作成していくことにするので
「Aからどの方向に分割した区画があるか?」という情報を基に
通路を引いていくことにします。
上の①の部屋の場合は横方向に2分割(①と(②③④))してできた区画のため
このルールに沿った場合、横方向(右側)へ通路を作成します。
3.通路は上記の分割方向から作成する(縦方向なら上下から)
2で通路を作成する方向が決定しましたね。
次は区画Aの部屋からどの区画に属する部屋に通路を引くか、を決定します。
1でいろいろな情報が格納されているので、
下記の条件で部屋と部屋をつなぐことにします。
・すべての部屋を検索対象にする
・2つの区画の通路作成方向の境界が一致する
①の部屋の場合、
①と②、①と③、①と④をそれぞれ確認していきます。
④に関しては一致する境界がないですが、
①と②、①と③に関しては横方向で一致する領域が存在します。
このため、
①と②、①と③に横方向で通路を作成することにします。
4.二つの部屋A,Bから線を伸ばし、区画の境界でその通路をつなぐ
3で通路でつなぐ候補となる2部屋が決定したと思います。
この2部屋から区画の境界に向けて直線に通路を引きます。
境界位置まで引いたら、境界部分を通路として繋げれば出来上がりです。
これを全部屋分行えば出来上がりです。
ただ、無条件で線を引いてしまうと境界部分で共有する
ハブのようなダンジョンになってしまうので、
下記のような条件を追加しておきましょう。
・通路にする予定の境界部分が既に通路であった場合
その部屋と部屋は通路ではつながない
①と②をつなぐ場合は下記のような順になりますね。
1.①から境界まで
2.②から境界まで
3.手順1~2の境界部分
これらを一つのステップとして、
①と他の部屋に対して
②と他の部屋に対して
③と他の部屋に対して…
とすべての部屋を対象にして行っていきます。
____________________________________
結果(ダンジョン自動生成)
最終的にはこのような感じのものができるようになりました。
毎回リロードするのは煩雑なので、「ダンジョン作成」ボタンを設置しました。
ボタンを押すと領域内でダンジョンの作成が行われます。
見た感じ割とそれっぽいものが出来上がるんではないでしょうか?
たま~にすごく単純なダンジョンが出来てしまったりしますね。
左下のヤツとか、たまに作成されます。
そのあたりは乱数条件とかなんかな…。
もっと条件とか、分割単位を工夫していくと
もっとそれらしいものができると思います。
とりあえず今回はこのような感じで。
____________________________________
今後?
せっかく作ったので、これを使って何かやってみたいですね…。
というのはある。
ローグライクかー。