トップページgamedev
742コメント254KB

【ダンジョン】 自動生成 2 【地形】

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。2007/06/19(火) 12:21:35ID:oqLsw/ra
ランダムでダンジョンを自動作成する手法についてのスレです。
ローグタイプやシレンタイプのダンジョンや、街並みや地形など。

※過去スレ
ダンジョン自動生成
http://pc11.2ch.net/test/read.cgi/gamedev/1027084016/

関連サイトは>>2>>3
0325名前は開発中のものです。2009/08/05(水) 00:35:17ID:SND5sjgx
いろんな方法があると思うけど

たとえば各マスが「部屋ID」のようなものを持ち
部屋IDが同じマスたちはすべて同じ部屋で
部屋IDがヌル(とか0とかNaNとか)なら通路とか
そういう方法もあるかもね

あるいは同じことだけどIDではなく部屋クラスのオブジェクトへの参照とか

それか逆に部屋クラスの方でその部屋に属するマスのリストを持ってもいい

あとはたとえば各マスに「北と同じ部屋か?」「西と同じ部屋か?」
を表す真偽値のプロパティを持たせるとかいう方法もあるかも

いずれにしても壁が壊れて等のイベントの際にはいちいち判断を入れて
意図通りになるように処理するしかないかと

多分そういうイベントの方が少ないケース(コード量的にも発生頻度的にも)
なのだろうから、一般的なケースが処理しやすくなるような方法にすれば
よいと思うよ
0326名前は開発中のものです。2009/08/05(水) 01:57:00ID:djmbzU5s
>>324
俺が昔、ローグライクRPGを作ったときは、
「ダンジョンの大きさの2次元配列」と「部屋クラス」の両方を使ってた。

つるはし・大砲で壁を破壊したときは2次元配列の壁だったところを通路に変更するだけで、
部屋クラスのデータは変更しない。
(壁を壊したとき、そこは通路扱いで、部屋の一部にはならない)
大部屋の巻物を使ったときは、2次元配列を床で埋め尽くして、全部屋クラスを破棄し、
大部屋の示す部屋クラスを1つ作るというようにしていた。

部屋と部屋が繋がっても特になにも処理はしなかったが、問題はなかった。

ちなみに、2次元配列に入れるデータは「(部屋の)床」「通路」「壁」以外に
「壊せない壁」をダンジョンの外周部分に配置しておくと、つるはしでどんどん壁を
壊していって、配列の外に飛び出してしまうことを防げるので便利だった。
0327名前は開発中のものです。2009/08/05(水) 05:40:23ID:8C+6rJYo
>324
ちょっと前に作ったときは、部屋情報はマップデータとは別に部屋構造体を用意して、
マップ作成時に部屋データもいっしょに作成。
つるはしとか壁を破壊する系は実装しなかったけど、やるとしたら破壊した場所は
全部通路認定。これが一番楽。もし、破壊した場所も部屋認定したいなら、
そもそも長方形以外の形も扱える部屋情報が必要になるからね。
0328名前は開発中のものです。2009/08/05(水) 08:04:40ID:aEx2LxPn
あんまりやったことないけど、シレンて矩形に広がらないと部屋認定されないんじゃ。
もちろんシレンに合わせる必要は無いけれども。

適当に思いついたことを書くと、部屋はそれぞれ番号を振ってマップにその番号で埋めておく
11111111
11111111
11111111

2222
2222
2222

穴が開く
11111111
11111111
11111111
  1
2222
2222
2222

つながるとどちらかに帰依する
11111111
11111111
11111111
  1
1111
1111
1111
0329名前は開発中のものです。2009/08/05(水) 08:13:50ID:l8/hwzvv
俺が作ったときはつるはしは面倒臭いので仕様上除外したけど
部屋番号の情報は持たせたな
enum type
{
floor,
corridor,
wall,
}

struct cell
{
int blockNo;
int type;
}

cellで二次元配列作ったので
部屋を識別する所まではできたけど
■ このスレッドは過去ログ倉庫に格納されています