スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ランダムダンジョン生成―通路生成

空間分割、部屋生成と手順を踏んで、最後に通路の生成を行います。
(テストプレイすると分かりますが)今のところマップに長方形の部屋がいくつかあるだけです。
通路の生成では、これらの部屋と部屋をつなぐ通路を作ります。

ではまず、基本的な考え方。
通路の生成では、とりあえず一本道の通路ができるように通路を生成します。
やり方はというと結構簡単で、空間DBの隣り合っている番号について、それぞれの部屋と部屋を結ぶように通路を作ればいいです。(もっとも、これは空間分割の際に空間の並び順を整理していた場合の話であり、整理していなかったときは別の処理で隣り合っている空間を探し出す必要があります)

ということで、手順。

間に通路を生成する二つの空間を取得。それぞれの空間にある部屋情報を取得。

通路の入り口となる部屋の座標を決める。二つの部屋の位置関係を考慮して、左右で隣り合っているんだったらそれぞれ部屋の左端と右端に入り口の座標を設定する。上下のときも同様。

決めた座標から部屋の外の空間に向かって足を出す。ここで出す足(通路)の長さは、その部屋を含む空間の端っこまで。

伸ばされた足を延長してそれぞれ一マス分空間の外に出す。この時点で、それぞれの足の先はどの空間でもない場所(空間と空間の隙間一マス分の位置)にあるはず。

伸ばされた足と足を直線の通路でつなぐ。空間分割の際に空間と空間の間を一マス空けていたのはこのためで、この一マスがないと通路が思わぬところで部屋の周りの壁を削ってしまったりする。

この処理をそれぞれの空間に対して施して、とりあえず通路完成。


…はい、ややこしいですね。


この二つの部屋に通路を作ることにします。赤枠が空間、黒枠が部屋です。

それぞれの部屋の入り口を決めたら、そこから空間の端まで足を出します。

足を延長して、空間の外に一歩分だけ出します。

足と足を直線でつないで、通路が完成します。

ということで、これでとりあえず一本道の通路が完成します。あとは隣り合っている空間を検索して、そこにさらに通路を付け加えていくなどすれば不思議のダンジョンっぽい地形が出来上がります。

注意点としては、部屋の入り口を決める際は、すでにある部屋の入り口の位置を考慮すること。
入り口のすぐ隣に入り口を作ったりすると、通路と通路の間の壁が消滅して幅ニマスの通路ができたりしちゃいます。
部屋の同じ端に入り口を二つ以上つくるときは、すでにある入り口から必ず一マス以上離して作るようにしましょう。
で、さらなる注意点ですが、そうやって入り口の位置を分けていると、小さな部屋ではこれ以上どこにも入り口が作れないような状態が発生してしまいます。これに対処する処理を組み込んでいないと、500000エラーが出ることになるので注意しましょう。
具体的な対処方法としては、部屋の入り口の位置をすでにある入り口の位置と同じにしてしまうこと。
こうすると通路の途中で三叉路が作られて、ちょうどいい具合に通路を作ることができます。
ScreenShot_2014_0703_11_35_12.png
↑完成例。生成する空間の数とかはデータベース側で設定できるようにしておくと、いろんなダンジョンを作るときに個性を持たせられていいかも。なお、ちゃっかりミニマップが表示されていたりお店があったりしますが、その詳しい作り方については[TIPS]の方をご覧ください。
関連記事
スポンサーサイト

コメントの投稿

非公開コメント

No title

これはすごいですね~
何年も前にローグライクゲームを作ったことがあるのですが、結局100枚ぐらい出来合いのマップを作っちゃって、そこからランダムに選ばせるようなプログラムでごまかした記憶があります。
通常のプログラム言語だと呼び出し回数の制限などはないので、その辺りもっとラフなアルゴリズムと試行回数のみで内部処理しているゲームなんかも多いと思いますヨ

Re: No title

> これはすごいですね~
> 何年も前にローグライクゲームを作ったことがあるのですが、結局100枚ぐらい出来合いのマップを作っちゃって、そこからランダムに選ばせるようなプログラムでごまかした記憶があります。
> 通常のプログラム言語だと呼び出し回数の制限などはないので、その辺りもっとラフなアルゴリズムと試行回数のみで内部処理しているゲームなんかも多いと思いますヨ

コメントどうもです。
僕自身、不思議のダンジョンを作ろう!という意気込みだけで始めたので右も左も分からず、いろんなサイトを参考にしてようやくここまでたどり着いた感じです。
本当は部屋の形も複雑にしたかったんですが、力不足でそこまではできませんでした。
で、すいません。プログラミング言語のことはまったく分からないです。僕もプログラミングに関しては全くの初心者なので、他にいくらでもやりようがあるような気はしますが…。
Twitter
カテゴリ
最新コメント
月別アーカイブ
カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。