ウディタでローグライク制作.1 ランダム生成ダンジョンについて
こんにちは、Purpleです。
今回から本格的にローグライクゲームの話に入りたいと思います。
さて、本題に入る前にこの記事を読んでくださっている皆様に少々(?)残念なお知らせがあります。
今回の記事ではまだ実践には入りません。
何故かと言いますと、まだ説明しなくてはならないことが残っているからです。
ローグライクゲームといえばランダム生成ダンジョン、あれがどういう理屈で作られているか、今回の記事ではそれについて触れていきたいと思います。
退屈な時間が続くかと思われますが、あと少しだけ辛抱して頂けますと幸いです。
1. ダンジョン自動生成の仕組み
筆者の調べた限りでは、いわゆる「ランダム生成ダンジョン」と呼べるものは概ね以下の3つの手順によってつくられているようです。
1.空間分割:マップにランダムに仕切りを置く
2.部屋生成:仕切りの中にこれまたランダムに部屋を生成する
3.通路生成・連結:部屋同士を通路で結ぶ
これだけだと説明が大雑把過ぎて分かりにくいので、それぞれもう少し詳しく見ていきたいと思います。
2. 空間分割
マップ全体を一度まっさらな(何もない)状態にして、それをいくつかの空間に分けていく処理です。
イメージとしては概ねこんな感じかと。
まっさらなマップがあります。※記事では見やすいように色を付けています。
適当な位置に仕切りをおきます。
これを何度か繰り返します。
最終的にこんな感じになりました。
分割してできた空間の情報(角の座標や仕切り線同士の間隔など)はデータベースや変数に格納しておきます。
※今回の記事では横→縦の順に分割していますが、分割の順番に決まりはないようですので、お好みで大丈夫かと。
3. 部屋生成
各仕切りの中に、これまたランダムな大きさの床を置いていきます。
まず、データベースなどから分割した空間の情報を取得します。
今回の場合は始点(左上)と終点(右下)のX/Y座標になります。
この中に、
このように適当なサイズの床を置いていきます。
繰り返すと、こんな感じに床が置けました。
4.通路連結
最後に、部屋同士を繋ぐ通路を作ります。
まずは通路の入口の座標を決め、
(下図の黄色の点)
そこから仕切りの外に向けて足(通路)を伸ばします。
部屋を含む空間の端っこに到達したら、
足を空間の外に1マス分だけ延長します。
(水色で囲んだ、仕切り線に被っている部分)
最後に足と足を直線で繋ぎます。
これを繰り返して、
通路の完成です。
仕上げに仕切り線を消します。
マップができました。
5.終わりに
ここまでお付き合いいただき、ありがとうございました。
次回からはいよいよ実践パートに入っていきたいと思います。
それでは、またお会いしましょう。