縦スクロールシューティング18

コリジョン関連

強制スクロールでもコリジョン処理はやってるんですが、今度はプレイヤーコントロールで得た移動量を元に実際に高速ループ回してコリジョン判定をやる部分です。強制スクロールのページで紹介したコリジョン処理は「強制スクロール兼コリジョン判定」って感じだったのですが、今度は先に移動量を計算で得てから高速ループ回してるので「オブジェクトの移動兼コリジョン処理」って具合でしょうか。とりあえずイベントリストからずらっと並んだイベントとアクションを眺めてみましょう。

コリジョン処理部分をイベントリストで閲覧

コリジョン処理部分をイベントリストで閲覧

さすがに長いリストになりました。なんでこんなことになってるかというと結構重要な処理をいっぺんに行ってるってーのと、ゲーム中に登場するすべてのオブジェクトとの衝突や、衝突の結果ゲームオーバーに至る処理、アイテムとアイテムの効果発動などいろんなゲーム処理を担ってる重要なセクションだからです。ここでも高速ループを多用していますが、あくまでも使い方は比較的簡単なものなので過去に解説した高速ループ関連の話を総合して、あとは時間さえかければ必ず誰でも理解できるものだと思います。むしろ技術よりも根気がいる作業ですがこれが完成すればあとは最終関門である敵動作の追加のみ。

処理のおおまかな流れとしては、高速ループを回して衝突判定が検出されたらそれに見合った動作をするって具合です。実際にまずX位置の決定を行う高速ループ処理「moveX」を開始、画面の左右端から反対側へワープする「L_worp」および「R_worp」処理、そして横移動とコリジョン処理が終わったら次に縦移動処理を担う「moveY」を行い、これらが終わったら次にアイテムやパワーアップなどの判定を行う。

それから移動とコリジョン判定の結果、敵弾に当たっていたり敵スプライトに接触してゲームオーバーとなるような処理はオブジェクトグループ「RIP_XXXX」という各処理に格納されてます。今回オブジェクトグループの名前の頭に「RIP」って書いてあればここでなんらかのゲームオーバー的な処理を行っていると思ってくれれば良いです。そしてゲームオーバーのときにただ単に「ゲームオーバー」って画像出して終わるってのも味気ないと思ったので、今回のサンプルは敵の弾に当たったら・・・「敵の弾にやられた時のメッセージ」・・・あるいは敵に直接触れた場合「スライムにやられた」「コウモリにやられた」などあらかじめメッセージにバリエーションと誰にやられたのかという報告も行ったり少しだけ工夫してあります。

あとはMMF2ならではの仕様に少し触れておきます。今回基本的にJava Mobileでビルドするという制限の下で作ってるから各種ある便利なエクステンションをまったく使わずここまで作ってきました。これはJavaだけではなくSWFや今後発表されるだろう各エクスポーターとの動作互換性を取りたいから標準機能だけを使っていたのですが、実は各エクスポーターで動作互換を確実に確保するためには標準機能だけで作っていてもまだ足りず、フレームのプロパティ設定なんかにも気をつけないといけません。それから例えば出力するビルド形式ならではの制限事項もあらかじめ知っておく必要があります(例えば有名なところではMIDP2.0だと画像の透過率や拡縮が使えないとか)。つまりエクスポートしたい形式の仕様に付いて無知なままだとMMF2の標準機能だけ使って作っていてもエクスポートに失敗するってことです。

各エクスポーター間で互換性を確保するために気をつけたほうが良いのはフレームプロパティからランタイムオプションの設定項目あたりです。たとえば「前のフレームから表示を継続」オプションは筆者がゲームオーバー処理を作る際、手抜きをするために重宝したのですがこういうオプションは基本的にオフ・・・あるいはエクスポーターによっては機能しないと考えて作った方がトラブル無いはず。あとは「タイマーベース」も何回かこのブログ記事で個別に書いてますが、これはある日ふっと思いだしたようにタイマーベースで作ろうと考えてからオンしてもあまり意味無いです。まったく意味が無いと言わないのはアニメーションとかクリックチーム動作コントローラーから選択した動作はこのオプションをオンにすればタイマーベースで動作するからです。

フレームプロパティからランタイムオプション

フレームプロパティからランタイムオプション