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

その他:弾発射に関わる変数等まとめ

前回からの続き

ショットはグローバル変数域も使って構成されています。グローバル変数には「Shot_power」と「Shot_type」というふたつの値を用います。これはもちろん変数の値をMMFアプリケーション全体で使いまわししたいからグローバルとして扱っています。つまりフレームが切り替わっても値を保持したいからグローバルを使っているということです。「Shot_power」というのはゲーム仕様的な概念で、例えば「弓矢」という武器がパワーアップアイテムを取ることでだんだん強化されていくのですが、そのパワーアップレベルを示すのが「Shot_power」というグローバル変数の値が持つ意味。そしてもう一つの「Shot_type」は現在プレイヤーが選択している武器の種類を示します。二種類しかないので現状だと「標準弾か貫通弾か」の選択肢しかありませんが、武器を増やせれば選択肢が増えるのでこの変数に保持される値も大きくなります。

ここでイベントリストからズラーっと並んだイベントとアクションの一覧を見てみましょう。さてサンプルで見ると「Shot_type=0」and「Shot_power=0」が標準状態で、ここからパワーアップや武器選択アイテムを取ることで色々条件が分岐する様子が分かるでしょうか。武器の種類が二種類しか無いのにすでにイベントリストがそこそこ長いのは、パワーアップも含めると2×3=実は6種類の武器と考えることもできるので長くなるようです。MMF2の標準機能だと関数化処理ができないのでほとんど似たような処理でもイベントやアクションの使いまわしをすることができません。

イベントリスト

イベントリスト

内部フラグとかはプレイヤー操作デテクタのアクティブオブジェクトから可変変数域を使っています。これは弾に付属する各変数とは異なり、弾の特徴を決定するためのものではなく弾の発射を制御するためのものです。具体的にはボタン押した時に弾が発射されるのですが、この「発射される弾は1秒間に何発まで発射できるのか」を定義してるのが内部フラグの役割とかです。特にボタン押しっ放しで弾が発射されるオート連射機能とかをつける場合、この工夫を怠るとボタン押すと一秒間に可能な限りの弾が発射されますので「一回弾が発射されたら何フレーム(何秒)間は次の弾が出ないように~」という条件を付けてあげるわけです。この変数の使われ方については変数を使わずにタイマーを使うという方法もあります。

弾と弾の発射と弾の性質を定義してる変数の使い方、使われ方はだいたいこんな感じ。前回からの解説とまとめると・・・

  1. グローバル変数
  2. 弾そのものの可変変数
  3. プレイヤー操作デテクタの可変変数とフラグ

弾の発射とタイミング制御のためにこれだけ要します。関連した変数が複数に分断されてしまっているのは不満ですが致し方なし。基本的に弾の性質は弾の一つ一つに付属する可変変数で新規作成する度に定義し、グローバル変数には他フレームに移動しても引き継いで使いたい値を選んで利用します。そしてフラグとか発射タイミング調整用といったフレーム内限定・揮発性の記憶で済ませたいものはデテクタ(あるいは特定の変数管理用アクティブオブジェクト)から可変変数域を借りて一時保管してます。MMF2の変数管理はこの辺が面倒なところで、フレーム内で使う一時保管的な変数域を用意するためにはアクティブオブジェクトという「スプライト」をまず追加しなければいけません。アプリケーションにグローバル変数という概念があるなら、各フレームにもローカル変数的な概念の可変変数域を用意してくれてあるとありがたかったのですが標準機能にはこれがありません。

アクティブオブジェクトにはプロパティオプションから選べば「グローバル化」というオプションもあるので、これを利用してアクティブオブジェクトの可変変数もアプリケーション内で「グローバル」に共有して扱える値と定義することも可能です。しかし1つのアクティブオブジェクトが持てる変数には数に限りがあります。一方で本物のグローバル変数は保持できる変数の数に関してはほぼ制限がありませんけど実際に膨大な数の変数を定義しても管理ができないか大変な困難を伴って破綻すると思います。

MMF2の変数管理がしんどい理由

変数名でイベント行やアクションを検索できないというのが一番大きい弱点だと思います。MMF2にはそもそも「変数名で検索」という機能がありません。だから膨大な数の変数を根性出して定義しても、その後、変数名で検索ができないからどこに何がどんな風に使われていたかについてブラックボックス化してしまいます。この欠点というか仕様があるから、膨大な変数を扱うRPGのようなゲームはMMF2の標準機能では作り難いです。(その辺を解決できるのがスクリプトとかXLuaです。)