[過去ログ]
ダンジョン自動生成 (1001レス)
ダンジョン自動生成 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
192: 名前は開発中のものです。 [sage] 04/06/14 19:04 ID:HxZhdP5q ダラダラと別のことしながらローグIIのソース読んでる。 部屋生成について補足。make_level()から呼び出される、make_room()は以下の通り。 画面を3x3に分割して、その分割された領域内に矩形を作ることで部屋にしている。 サイズはランダムで、領域内の左上からの位置もランダム。この時、他の領域には 踏み入らないように計算しているので、部屋の重なりをチェックする必要はない。 必ず9個の部屋があるわけでない。条件によって部屋のあるなしが決められる。 条件は単なるランダムではなく、ある程度の法則性がある。 これはゲームバランス的なものだと思うので詳しい説明は省略。 1/2の確率で縦に3部屋並ぶ構成になる・1/2の確率で3種類の部屋の並びになる、 一つのフロアには、少なくとも3つの部屋が生成される、とか。 部屋のあるなしを決定したら、フロアマップに部屋の構成を記録すると同時に、 部屋の位置やサイズを別に記憶しておく。 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/192
193: 名前は開発中のものです。 [sage] 04/06/14 19:18 ID:HxZhdP5q おっと、一部読み間違えた。 >部屋の位置やサイズを別に記憶しておく。 サイズではなく、左上の座標と右下の座標っぽい。 あと、条件チェックで部屋がないと判断されても、先に計算した部屋の位置・・・ つまり、小領域内での左上と右下の座標値を保存している。どうやら通路?を 生成する時に利用しているっぽい。 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/193
194: ぐぅ ◆Mn5mzn8hAQ [sage] 04/06/14 19:40 ID:0lapHs9H だいたいわかったんだが、 わからないのが ペアの部屋を選定するコード。 add_maze/make_maze。 add_mazeは>>193の「部屋ではなく通路にする」場合の処理で 座標を保存して範囲を限定することで どこまでも無駄に通路を延ばしてしまうことを避け るためと読んだ。 月曜日は面白いテレビ番組がなくて退屈である。 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/194
195: 名前は開発中のものです。 [sage] 04/06/14 19:42 ID:HxZhdP5q 部屋を作ったら、次は迷路の作成らしい。通路ではない。 9個の小領域内に、ある条件を満たしたら、迷路を作る。 基点は先の部屋を作成した時に保存した左上の位置から、掘り進む。 1回(1文字)掘るごとに1/3の確率で進行方向を変える。 掘り進む方向+1と、その左右方向(画面の左右ではなく進行方向に対して)、 それから、掘り進む方向+2を調べて、すでに掘った通路があったら迷路作成終了。 掘る範囲は先にランダムに決定した部屋サイズ内なので、小領域を出ることはない。 迷路が生成される条件はゲームバランス的なので詳しい説明は略。 最初の階では絶対に迷路がない。16階以降は階を増やすごとに迷路が作られる確率が高まる。 迷路は1つの階につき1つっぽい。 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/195
196: 名前は開発中のものです。 [sage] 04/06/14 19:45 ID:HxZhdP5q >>195は、make_maze()の処理内容です。 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/196
197: 名前は開発中のものです。 [sage] 04/06/14 19:49 ID:HxZhdP5q >>195 また読み違えた。 > 掘る範囲は先にランダムに決定した部屋サイズ内なので、小領域を出ることはない。 掘る範囲は少領域内。 基点が、部屋サイズ内。 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/197
198: ぐぅ ◆Mn5mzn8hAQ [sage] 04/06/14 19:52 ID:0lapHs9H ははぁなるほど。 するってぇと通路への変更は別のコードか。 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/198
199: 名前は開発中のものです。 [sage] 04/06/14 19:57 ID:HxZhdP5q >>198 関数名だけみると、通路&ドア作成は、connect_rooms()内っぽいですよ。 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/199
200: 名前は開発中のものです。 [sage] 04/06/14 20:12 ID:HxZhdP5q 迷路を作ったら、hide_boxed_passage()を実行してる。 処理内容は、作った迷路をところどころHIDDEN属性にする。 つまり、先に迷路を掘ってから迷路の一部をHIDDEN化してる。 このルーチンは、迷路だけでなく、通路作成時にも呼び出されてる。 隠し処理は3階以降にしか発生しない。あとはゲームバランス的な条件で。 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/200
201: 名前は開発中のものです。 [sage] 04/06/14 20:14 ID:HxZhdP5q というわけで、add_mazes()もおしまい。 >>197は間違いで、やっぱり掘る領域は部屋サイズだったけど、まぁいいや。 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/201
202: ぐぅ ◆Mn5mzn8hAQ [sage] 04/06/14 20:16 ID:0lapHs9H >>199 ああ、通常の部屋同士の通路掘りはそれなんだけど、 229行で部屋でも迷路でもないものははじかれるから それ以外に部屋を通路にするロジックがあるのではないかと おもて。 R_CROSSという定数がアヤシイ・・ fill_out_level()とfill_it()がアヤシイ・・ とかおもてました。 最後に調整してるんかな、とか。 でもなんか違う気もするし・・ まぁ割と瑣末な部分なので この時点で突っ込まないでもいいのかもしれんが。 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/202
203: ぐぅ>腹ペコ ◆Mn5mzn8hAQ [sage] 04/06/14 20:29 ID:0lapHs9H >>200 ほほぅ。そうなんだ。ソース読むの早いなぁ。 部屋同士を接続するアバウトなしくみの見当ついた。 012 345 678 とわかれているエリアで ランダムに部屋を選んで、(ここでは仮に0とすると) 1,2,3,6のエリアの部屋に接続に行く。 選んだ部屋が4だったとすると5と7に接続にいく。 実は6にも接続に行ってしまうが、 connect_roomsで実際に接続する際、行か列のいずれかがあっていないと 処理を終了するので結局6には接続しない。 これをランダムな順番で0〜7について行う(8はイラン) つまり、 右、さらに右、下、さらに下の4箇所に接続に行く。 非常にアバウトだが、 これが接続先選定のアルゴリズムであった。タブンネw 夕飯買ってきてそれからそれからもうちっと読んでみます。 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/203
204: 名前は開発中のものです。 [sage] 04/06/14 21:06 ID:HxZhdP5q 連続投稿制限に引っかかって、ふてくされてた。 3x3の領域内に部屋と迷路を作ってから、迷路の部分隠しをしたあとは、 mix_random_rooms()で3x3の小領域の情報を10回ほどシャッフルしてるっぽい。 領域単位での入れ替え。 ・・・すでに部屋とか迷路をdungeon[][]内に書き込んでるけど、 そんなことしていいのか?どこか読み違えてるかも。 というわけで、そろそろ通路の処理に入りそうなんだけど、ここからが面倒っすね。 とりあえずアミュレットは26階以降にでるっつーことで。 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/204
205: ぐぅ>腹ペコ ◆Mn5mzn8hAQ [sage] 04/06/14 21:29 ID:0lapHs9H >>204 そうそう、mix_random_rooms()でしっちゃかめっちゃかと俺も悩んだw でも冷静によむと、 mix_random_rooms()はrandom_roomsをシャッフルするだけで 肝心のroomsはいじられないので大丈夫だったりしる。 random_roomsはランダムに部屋選ぶのに参照しるだけの配列にゃり。 部屋同士の接続はこれまたアバウトにいうと 部屋の出入り口を向かい合わせにつくって(dirとrevに向きを設定) 通路を延ばして途中で向きかえて座標をあわせて再度通路をのばして ドッキングしてるだけ というか、細かい話抜きにしると これでほぼ全容はわかったことになるんだなぁ。 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/205
206: 名前は開発中のものです。 [sage] 04/06/14 21:53 ID:MkSJwU7k ソースに 日本語コメントつけてうぷ汁 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/206
207: ぐぅ@満腹 ◆Mn5mzn8hAQ [sage] 04/06/14 21:59 ID:0lapHs9H >>206 なんかくれるか? http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/207
208: 名前は開発中のものです。 [sage] 04/06/14 22:10 ID:HxZhdP5q >>205 なるほど、そっちだったか〜。 深読み&変数名勘違いのトラップひっかかってました。 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/208
209: ぐぅ@凍結 ◆Mn5mzn8hAQ [sage] 04/06/14 22:35 ID:0lapHs9H 隣り合っていても部屋と部屋を繋ぐ通路がなかったりしるのは どのような理屈であろうか。 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/209
210: 名前は開発中のものです。 [sage] 04/06/14 23:18 ID:HxZhdP5q >>200の続き。 部屋と部屋をつなぐ処理・・・は>>203ですが、ちょっと補足。 1つの小領域につき1度、右とその右、下とその下の4箇所の 小領域(にある部屋)に対して通路を作成する。 connect_rooms(); まず、向かい合わせになっているそれぞれの部屋の壁に対して、 ランダムな位置に扉を作成する。そこから通路を延ばす。 draw_simple_passage(); 通路は2回曲がるように作成される。スタート地点の扉から ランダムな長さまで直線をひいて、進行方向を変えて、そこからゴールの扉の 縦座標(or横座標)まで直線をひいて、進行方向を扉の方にして、 そこからゴールの扉まで直線をひくだけ。進行方向を変えるとかいうのは90度向きを... とかではなく、部屋の位置関係が上下であれば、下にひいて、右か左にひいて、また下ひく という、ただの条件分岐と線をひくためのfor()ループ三回。 http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/210
211: 名前は開発中のものです。 [sage] 04/06/14 23:28 ID:HxZhdP5q 通路を作成したら、12%の確率で通路の一部を隠す。 迷路作成時に呼び出した、hide_boxed_passage()と同じ。 そうそう、小領域をまたぐ場合...つまり、>>200の図でいうと、0から2とか、 0から6へ通路を作成した場合には、その中間の小領域(1 or 3)には、 R_CROSSという部屋扱いになるけど・・・これが何を意味するのか、今はわからない。 もちろん、1と3に部屋があったら、通路は作成されない。 あとは、is_all_connected()とfill_out_level()を読んだらオシマイ。 ナゾというか、勘違いかもしれないけど、隠し扉ってなかったっけ? あれっていつ作ってるんだろう? http://mevius.5ch.net/test/read.cgi/gamedev/1027084016/211
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 790 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.121s*