読者です 読者をやめる 読者になる 読者になる

夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【偽スペースハリアー】迫力を出すため3Dの計算にインチキを投入

cocos2d スペースハリアー TravelShooting JP

前回地上物を表示させた偽スペハリですが、本家スペハリのような迫力がありませんでした。

どうやら普通に3Dの計算をするとダメなようなので少し計算にインチキを加えてやりました。
ついでに背の高い木と空中を浮遊する岩を追加しています。
岩の下の地面には半透明の影も表示しました。

動画でお楽しみください。

前回の動画と比べると迫力が違うと思います。

3D計算に加えたインチキは非常に単純で、距離が遠くなるほどZ方向の移動速度を速くしているだけです。

- (float)scrollZ:(float)z
{
    float farAccel = -14 * z/HORIZON_DISTANCE;
    return (z + self.zSpeed + farAccel); 
}

この14という値は適当に試行錯誤して決めました。キャラクターはHORIZON_DISTANCEというz位置に生成されるので生成時は本来の速度+14/frameの速度で手前に移動し、画面手前に来てzが小さくなるにしたがって追加される速度が少なくなって行くようにしています。

地上の縞模様もキャラクターの動きに合うように若干修正しています。
キャラクターとは計算のアルゴリズムが若干違うので動きがピッタリシンクロしていませんが見た感じ違和感はないので良しとしましょう。

今回の変更により、全力で横スクロールしたときに地上オブジェクトがカーブしながら迫ってくるスペハリ独特の動きも再現できました。
昨日の段階では全力で横スクロールするとオブジェクトがかなり遠くの位置で画面横方向に消えて行く動きをしていました。

オブジェクトの生成ルーチンはとりあえず仮の物をいれてあり、0.03秒に1個のペースでランダムな位置にランダムなオブジェクトを生成するようになっています。
オブジェクトを抹消するのはZ位置が0になったときだけで、画面左右に消えて行ったときに消す処理はしていませんが、今のところ処理速度的にはまだ余裕があります。(iPhone4Sの場合)
スプライトバッチノードもまだ使っていません。
f:id:takujidev:20131116124715j:plain

本家の方の地上物は毎回出現パターンが一緒なのでランダムではなく、狙って生成していると思います。
また、横スクロールの方向に合わせて生成の位置を調整しているようにも見えます。

さて、画面も賑やかになってきましたのでそろそろ縦横無尽に走って飛び回る男を表示したくなってきました。次回は主人公を表示したいと思います。