標準のポーズ(アプリケーションメニューやCtrl+P)ではダイアログが表示されてかっこ悪い。イベントでポーズをかけても解除はキーボードからしかできない、ポーズ中にCPU使用率が上昇するなど不満ががあったと思います。
今回は、サブアプリケーションを使用してパッドからもポーズを解除できるようにする方法と、同じくサブアプリケーションを使用してポーズ中にメニューを表示する方法を解説します。
サブアプリケーションとは
サブアプリケーションは、フレームの中で別のフレームを実行させることができるオブジェクトです。
実行できるフレームは同一アプリのフレームだけでなく、インターネットアプリケーションとしてビルドしたccnファイルを指定することもできます。
パッドからポーズを解除できるようにする
サンプルプログラム
パッドからポーズを解除できるようにする内容のサンプルプログラムです。
ポーズを掛けるイベントをキーボード入力で行う場合のサンプルです(下記解説を参照のこと)。
解説
サブアプリケーションにはメインのアプリケーションとは別に、サブアプリケーションで実行しているフレームを一時停止する/解除する機能があります(解除のアクションがあるのが肝です)。
よって、メインのフレームをサブアプリケーション内で実行すれば、パッドのボタンを押した時にポーズを解除することができます。
また、サブアプリケーションが一時停止しても、実行している親アプリケーション自体は一時停止していないのでCPU使用率は上昇しません。
サブアプリケーションで実行しているフレームと親アプリとのデータのやりとりはグローバル変数/文字列で行います。サブアプリケーションのプロパティの「親アプリケーションと共有」の「グローバル変数&グローバル文字列」に、また入力設定も別になっているので「プレイヤーコントロール」にもチェックを入れてください。
その他詳しいイベント内容はサンプルを参照してください。
ポーズをプレイヤーのボタン入力で行わず、キーボード入力で行う場合の注意
キーボード入力でポーズキーを設定すると、ポーズを掛ける動作と解除する動作が連続で実行されてしまい、ポーズ機能が動作しません。
これはプレイヤーのボタン入力とキーボード入力の条件の性質の違いによります。
プレイヤーのボタン入力は「即時条件(Immediate conditions)(赤色の条件)」キーボード入力は「通常条件(Normal conditions)」です。
簡単に言うと、プレイヤーのボタン入力は押してイベントが実行されたときだけ真になり、すぐに押したという情報は捨てられます。
しかし、キーボード入力の場合は、MMF2がイベントを上からずらっと実行していくサイクルの間中押したという情報が生きるため(キー入力情報が残ると言いましょうか、MMF2の条件判定のタイミングの仕様と言いましょうか。)、
ポーズを掛けるイベントの条件のあと続けざまにポーズを解除するイベントの条件を満たしてしまい、連続してイベントが実行されてしまっているのです。
キーボード入力でそのままでは連続して条件を満たしてしまうイベントを組んでいる場合は、変数やフラグなどでワンクッション置く必要があります(今回のサンプルでは、異なるフレーム間でのやりとりなのでグローバル変数を使用しています。)。
この仕様はキーボード入力に限らず、Joystick 2等のエクステンションによる入力を行う場合も同じです。
- 関連:テクニック集/キーコンフィグの作り方 エクステンションを使ったキーコンフィグ
↑上記ページのサンプルでフラグを2個使うと解説されていますが、同じ理由によるものです。
ポーズメニューを表示する
サンプルプログラム
ポーズメニューを表示する内容のサンプルプログラムです。
解説
2つのサブアプリケーションを使用します。1つにはメインのゲーム画面のフレームを、もう1つにはポーズメニューのフレームを表示させます。
要するに、メインのサブアプリケーションが一時停止している間、ポーズメニューのサブアプリケーションを表示するというわけです。
実行した時にサブアプリケーションがチラチラする場合(ポーズメニューではなく会話ウインドウとして表示して、メインのサブアプリを一時停止しない場合など)は、プロパティの「兄弟ウインドウをクリップ」にチェックを入れてみてください。なお、これにチェックした場合は、フレームエディタ上での表示順位と実行した時の表示順位が逆になるので注意してください。
ポーズ解除時にサブアプリを破壊すると、瞬間的にFPSの落ち込みが発生するので、ポーズメニューを破壊せずに、メニューの一時停止&非表示で対応してください。
その他詳しいイベント内容はサンプルを参照してください。
注意点
サブアプリケーションで実行する場合、フレームのプロパティにある「タイマーベース動作」の設定に注意してください。
アプリのフレームレートとここの値が異なっている場合、一時停止を解除すると動作するオブジェクトの位置がワープしてしまいます(イメージとしては一時停止しているのにオブジェクトの動作が続いていて解除した時にパッとその位置に切り替わる感じ)。
フレームレートとタイマーべースの値を同じにするか、タイマーベース動作を無効にしてください(個人的には無効にすることをオススメします)。
サブアプリケーションの見た目を少しでも凝る
- 半透明はできない
サブアプリケーション自体は半透明することができないので、メニュー画面の背景を透けさせて下のゲーム画面を見せるということはできません。
まあフレーム全体が半透明化すると項目まで薄くなるので見難くなるだけだとは思いますが。
メニューの背景を透けさせたい場合は、同じフレームにメニューを表示させて自前でポーズを組む必要がありそうです。
- フレームの枠の形を変える
サブアプリケーションで表示するフレームは通常は矩形なので面白みに欠けますが、「ウインドウシェイプ」を使えばフレームの形をある程度変えることができます。
サブアプリケーションに表示するフレーム内にウインドウシェイプオブジェクトを配置し、プロパティから種類を設定します。
フレームの形状が設定した形状または画像になります。
設定した画像に透過部分があれば、その部分は透明になります。透明の部分にはオブジェクトを配置しても表示されないので注意してください。
アクティブオブジェクトに設定すればアニメーションさせることもできます。
コメント
- 更新:サンプルプログラム「パッドからポーズ解除(キーボード入力版).mfa」と解説「ポーズをプレイヤーのボタン入力で行わず、キーボード入力で行う場合の注意」を追加 -- 2012-01-27 (金) 03:46:06
- 更新:「ポーズメニュー表示(メニュー非破壊版)」と解説を追加 -- 2012-02-04 (土) 02:35:09
- 更新:「ポーズメニュー表示(メニュー非破壊版).mfa」をTime X不使用に -- 2013-03-23 (土) 03:47:28
- 更新:他のサンプルもTime X不使用に -- 2013-03-23 (土) 05:49:18