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

敵の配置:作った敵をどう配置するか

敵の追加、敵の動作と来て敵の配置(出現タイミング)を考えます。シューティングは敵の動作についてはアルゴリズムが簡単なので動作は容易に付けることができます。あとは敵が出現するタイミングを制御することが課題となるのですが、いくつか方法があるのでそれら方法を列挙してMMF2で実現するにはどうするかを考えていきます。

ちなみに今回作った縦シューティング用サンプルでは、シューティングの基本動作部分に「敵動作をモジュール的にあとから付け加える」という感じで設計して作ってあるので、敵の追加や削除などは比較的簡単にできるようになってます。出現タイミングの制御は通しでプレイするための時間がかかるので期間制限内には結局完成させることができませんでした。結果中途半端なサンプルになってしまい申し訳ないのですが、自力で追加して色々試してみてください。

トライ&プレイで挑む(初心者向き)

マップが広い場合MMF2のフレームエディターをフル活用して敵(オブジェクト)をあらかじめ配置しておくのが一番楽です。MMF2のオプション設定には「スプライト出現時にロード」という便利オプションもあるので、大量のスプライトを事前に配置してもゲーム起動時の負担を減らすための工夫が用意されています。これを利用して先にワールドマップなど環境を作り、次にどんどん敵を事前配置して、最後に個別の敵動作には動作コントローラや通し番号などを活用して個別に指定します。

ここから実際に起動してプレイしてみて、必要なタイミングで敵が出現するようにフレームエディタから位置を修正、プレイして確認、このトライ&プレイ方式で全体の完成度を目指す方法。

問題点としては力技なので毎回通しでプレイするための時間がかかる。敵に複雑なAIを付ける場合このやり方だと難しくなるかもしれない。
★MMF2アップローダにも良いサンプルがアップされていたのでリンクを貼っておきます。

タイムライン(フレーム)で管理する(中級)

一定時間経過とともにイベントで敵を作成し敵を出現させます。この場合、フレームベースで作っているなら「カウンター」や「変数への代入」で数字を管理して、特定の数に達したら敵出現って具合に作っていきます。MMF2は基本的に時間をあまり正確に測ることができません。なぜならば前フレームと現在フレームの時差(デルタタイム)を測ると分かるのですが、デルタタイムの間隔は一定ではなくかなり誤差を生じています。設定で60FPSとすれば確かに60FPSで動いてはいるのですが、デルタタイムの誤差が大きいからこのタイミングで時間を計測されても一秒以下の時間計測は絶対に正確にはならないのです。・・・というわけで変数に数値を代入してストップウォッチ代わりに使うのですが、この方法だと必要なフレームレートが確保できない環境で色々問題が起こります。

それ以外は別に問題が無く、有効な管理法だけど使えるエクステンションが少ない上に、発生させる予定の敵種類が多いと管理が非常に面倒になってしまいます。使えるエクステンションが少ない特定のビルドタイプ(今回はJavaMobileで作るという縛りの中で作っていることを一応思い出してください)の場合、MMF2の標準機能だけで凝った物を作るのは結構大変です。あるいはWeb用途だと外部設定ファイルを参照するだけでもサンドボックスの制限がかかるから、あらかじめ作っておいた設定ファイルを内包して参照したいんだけどそれができない。例えばMMF2の「配列(array)オブジェクト」はどのビルドタイプでもほぼ標準で使える機能なんだけど、肝心の配列にプリセットで値を保持させる機能が無いのでこれが困るわけです。PC用なら何も困らないんだけど携帯やWebなどセキュリティが厳しいもので動くように作るためには工夫が必要です。実際に今回はすでにアイテムの配置で苦労したのでMMF2の文字列操作(文字列抽出)と文字列変数を使って設定ファイル代わりに利用しました。こういう方法を拡張してゲーム起動時に文字列変数から文字列の抽出を行って、それを配列に格納するという方法でプリセットな値を用意することもできます。もちろん小規模なゲームの場合のみに使える技です。

現在PC用ビルドでHWAを使って縦スクロールシューティングを個人的に自作しているのですが、こちらではXLuaを使って作っています。Lua使えば処理が関数化できるので例えば「作成する敵=コウモリ、出現タイミング(フレームカウント)、行動パターン1、数2、X位置、Y位置、活動限界時間...」と言った具合にスクリプトを使って敵を出現させることができるように作っています。