その他:弾発射に関わる変数等まとめ
前回からの続き
ここでイベントリストからズラーっと並んだイベントとアクションの一覧を見てみましょう。さてサンプルで見ると「Shot_type=0」and「Shot_power=0」が標準状態で、ここからパワーアップや武器選択アイテムを取ることで色々条件が分岐する様子が分かるでしょうか。武器の種類が二種類しか無いのにすでにイベントリストがそこそこ長いのは、パワーアップも含めると2×3=実は6種類の武器と考えることもできるので長くなるようです。MMF2の標準機能だと関数化処理ができないのでほとんど似たような処理でもイベントやアクションの使いまわしをすることができません。
内部フラグとかはプレイヤー操作デテクタのアクティブオブジェクトから可変変数域を使っています。これは弾に付属する各変数とは異なり、弾の特徴を決定するためのものではなく弾の発射を制御するためのものです。具体的にはボタン押した時に弾が発射されるのですが、この「発射される弾は1秒間に何発まで発射できるのか」を定義してるのが内部フラグの役割とかです。特にボタン押しっ放しで弾が発射されるオート連射機能とかをつける場合、この工夫を怠るとボタン押すと一秒間に可能な限りの弾が発射されますので「一回弾が発射されたら何フレーム(何秒)間は次の弾が出ないように~」という条件を付けてあげるわけです。この変数の使われ方については変数を使わずにタイマーを使うという方法もあります。
弾と弾の発射と弾の性質を定義してる変数の使い方、使われ方はだいたいこんな感じ。前回からの解説とまとめると・・・
- グローバル変数
- 弾そのものの可変変数
- プレイヤー操作デテクタの可変変数とフラグ
弾の発射とタイミング制御のためにこれだけ要します。関連した変数が複数に分断されてしまっているのは不満ですが致し方なし。基本的に弾の性質は弾の一つ一つに付属する可変変数で新規作成する度に定義し、グローバル変数には他フレームに移動しても引き継いで使いたい値を選んで利用します。そしてフラグとか発射タイミング調整用といったフレーム内限定・揮発性の記憶で済ませたいものはデテクタ(あるいは特定の変数管理用アクティブオブジェクト)から可変変数域を借りて一時保管してます。MMF2の変数管理はこの辺が面倒なところで、フレーム内で使う一時保管的な変数域を用意するためにはアクティブオブジェクトという「スプライト」をまず追加しなければいけません。アプリケーションにグローバル変数という概念があるなら、各フレームにもローカル変数的な概念の可変変数域を用意してくれてあるとありがたかったのですが標準機能にはこれがありません。
アクティブオブジェクトにはプロパティオプションから選べば「グローバル化」というオプションもあるので、これを利用してアクティブオブジェクトの可変変数もアプリケーション内で「グローバル」に共有して扱える値と定義することも可能です。しかし1つのアクティブオブジェクトが持てる変数には数に限りがあります。一方で本物のグローバル変数は保持できる変数の数に関してはほぼ制限がありませんけど実際に膨大な数の変数を定義しても管理ができないか大変な困難を伴って破綻すると思います。
MMF2の変数管理がしんどい理由