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

03 / 03
Mon

Ziphil です。

アルゴリズム考察の続きです。 前回のエントリで、 曲線を使った方法を書きましたが、 もうちょっと具体的にしてみましょう。

まずは、 マップ全体を形作る閉曲線はどうやって描くか? 初期地点を決めて適当に曲げながら線分を描いていく方法を考えましたが、 これでは閉曲線になる保障がありません。 そこで、 最初から閉曲線を作っておいて、 それを曲げていく手法を採ってみようと思います。

  • マップ全体より少し小さめの長方形を作り、 その頂点に時計回りに 0, 1, 2, 3 のデータ値をもったノードを置く。
  • 数値が隣り合っている 2 つのノードを選び、 その中点から少しずれた位置に新たなノードを作成する。このノードは、 選んだ 2 つのノードのデータ値の相加平均のデータ値をもつ。
  • 上の処理を適当な回数繰り返す。

適当な線分描画アルゴリズム (ブレゼンハムのアルゴリズム) を使って、 隣り合うデータ値をもつノード間の線分を描画し、 通過領域とすれば、 洞窟ダンジョンの輪郭が決まります。 このとき、 輪郭の内部の座標を記憶しておきましょうか。

次は、 この閉曲線内に適当に道を作ります。

  • 通過領域から適当に 1 点選び、 内部に向かって適当な長さの線分を引き、 通過領域に変える。
  • 線分の先の点から、 前回引いた線分とのなす角が 60° 未満になるように、 新たな線分を引き、 通過領域に変える。
  • 上の線分を引く処理を、 通過領域に衝突するまで続ける。
  • 最初の処理から順に同じ処理を適当な回数繰り返す。

これで、 輪郭がいくつかの領域に分けられるはずです。 後は、 部屋になる部分を決めます。

  • 輪郭の内部の通過不能領域である点を適当に選ぶ。
  • その点を含む領域を、 部屋として通過可能領域とする。
  • 以上の処理を適当な回数繰り返す。

これで部屋の完成し、 空洞つきの洞窟ダンジョンのマップが完成する・・・と思います。

このアルゴリズムの欠点ですが、 空洞の中央から通路が伸びるということがないことでしょうか。 まあ、 後から通路を追加すれば良いだけの話ですが。 詳しいことは、 実際にコードを書いて動かしてみないことには分かりませんね。 実装はまだ今度やろうと思います。

スポンサーサイト

comment ×0
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。