マップについての考察

さて、前回僕を苦しめた(ないしは僕が勝手に苦しんだ)
「マップって何よ?」ということですが、
あの後、いろいろと考えてみました。
問題は、「地面にあるものが動けば、自分も動く」ということ。

何か、こういうことを書いてあるページはないかなーと思い、
いろいろあさってみたところ、3Dについてのことがたくさん書かれている
ページがあったので、それを読んでみました(devilmanさんのページです)。

「ふぅん、座標系かぁ。こういう考え方もあるんだなぁ」

と、まず思いました。んで、自分の作ったゲームには
いわゆる「ワールド座標系」「カメラ座標系」しかないのか、と思いました。
「何それ」
という方は、devilmanさんのページにて(ごめん、アドレスわからん)。

各キャラクタの位置はワールド座標系、ディスプレーに表示するときは、
カメラ座標系に変換して出力していたわけですね。
多分、スクロールのまったくないゲームには、カメラ座標系はいりません。
だって、カメラの位置が固定だもん(^^;)

よくあることですが、話がちょっとずれました。
そして、新しい「考え方」にヒントを与えてくれたのが、
「オブジェクトの階層構造 副題:親の因果が子に報い
というコラム(tips?)でした。

子の位置は子が知っているようにした方が良さそうです。
それも、位置というより移動量として考えてみましょう。
方は最初同と同じ原点に合って、それが任意の向きに回転し
そして肩口まで移動する。良さそうですね。ここまで、
子の回転 * 子の移動というシンプルな方法です。
そこに、親の回転 * 親の移動を加えてやる。これも申し分なさそうです。

この辺が「ーん」ときた部分です。
「子」というのは「自分」「親」というのは「地面」です。
しかも、「回転」などどいう高度なことはしないので、
子の位置 = 親の移動 + 子の移動
という式が導けそうですね。
とてもシンプル。ぷるぷる。



さぁて、こういうことをできるように、
「親子関係についての一人会議 in 授業」
を行いました。


結果、次のような形になりました。

・スーパークラスに「親」というメンバを加える。

・「親」がNULLの場合、「自分」の移動のみとする。

・「親」がNULLでない場合、さきほどの「子の位置 = 親の移動 + 子の移動」
  を用いて、位置を算出する。

・「ワールド座標系」を用いず、「オブジェクト座標系」を用いる。
  「親」がNULLでなくなったとき、「親との距離」を計算し、
  それを「自分の位置」とする。また、自分が移動すれば「親との距離」を再計算する。
  そして、「親の原点」に「親との距離」を加えて、それを「自分の位置」とする。



こんな感じです(^^;。
わかりにくい文章なので、あまり伝わらないと思います(^^;
が、僕の中ではかなり出来てるつもりです....。


とりあえず、これで「移動」については終わりました(え?)。
あとは、あたり判定です。
「長方形」を使うか、「線分」を使うか....。
そこが問題です。











もどる