2008年5月19日月曜日

画面外にオブジェクトを設置しない




割と速度が出るようになった。
http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/program/test080519.zip
 
 変更点は、
・画面外でもレンダリングしていた壁や敵をレンダリングしないように
・敵弾グラフィックの変更
・自機の傾き
・マップ作成方法の変更
 
 Zバッファがあるからカメラに映るとか映らないとか気にしなくてもいいかと思ってたら、
そんなことも無く。
 やはり映らないところがわかっているんであれば、レンダリングしないほうが高速。
あたりまえか。行列計算しなくてすむし。
 頂点数によるらしく、板ポリゴンは除外しなくてもすいすいいく。
3Dオブジェクトの類は頂点数が多いから、優先的に除外することで高速化できた。
 
 敵弾なんかは、前作のものをしよう。
加算合成してもさくさく動く。すばらしい。
もうビット演算はいやだ。
 
 自機の傾き計算が、非常にまどろっこしかった。
方向キーの入力によって自機が左右のどちらに傾くのかを計算するわけだが、
0度と360度の境界線があるので、if文がややこしいのなんのって。
 たとえば、自機が画面下(90度)を向いているときに、
右キーを押せば自機は(自機から見て)左に傾く。
左キーを押せば自機は右に傾く。
 角度であらわせば、
0度~90度、270度~360度は左に傾き、
90度~270度であれば、右に傾く。
このように0度を超えるような条件が含まれていると、単純な条件式を作成しにくい。
 
 そこでどうしたかというと、
自機を0度の方向に強制的に修正し、
入力方向を自機の修正角度分ずらした。
それにより0度と360度の境界をまたぐことがないようにした。
 そうすると上記の例では、
自機の角度を90度→0度
入力が仮に右(0度)であれば、270度にずらす
入力が左(180度)であれば、90度にずらす
あとは、ずらした後の入力が180度を越えているか否かで、
自機を右に傾けるべきか、左に傾けるべきかを判断すればよい。


 こんなん誰でも思いつくわ! とは言う無かれ。
一晩考えたわ!


 
 マップ作成は、
迷路の自動生成を応用(?)して作った。
迷路の自動生成にもいろいろ種類があるようで、調べてみるとなかなか面白い。
 それはそれとして、作成方法を簡単に言えば、
1.穴を開ける
2.ランダムに上下左右から1方向選び、その方向に進む
 を何度か繰り返すだけ。
必ず穴が連続するので、移動不可能な穴が出てこず都合がいい。
それっぽいしね。

0 件のコメント: