SophiaFramework UNIVERSE 5.3 |
SFC アプリの起動は、 SFY アプリと同様にブートローダ (SFCApplet::Boot 関数)によって行います。
注意 | |
---|---|
SFCApplet::Boot 関数はアプリで最初に実行される関数です。 |
ブートローダーにより、 ファクトリ関数(helloworld::Factory 関数)が実行され、 アプリケーションクラスのインスタンスが作成されます。
これ以降、SFCApplication::Terminate 関数の呼び出し、 または電源キー(AVK_POWER)/クリアキー(AVK_CLR)の押下などによりアプリが終了するまで、 アプリは実行中であり、必要に応じて BREW イベントを処理します。
ブートローダ(SFCApplet::Boot 関数)とファクトリ関数(helloworld::Factory 関数)は、 以下のように実装します。
ブートローダ(SFCApplet::Boot 関数)には、ライセンスコードを設定し、 引数 id が AEECLSID_HELLOWORLD であるときに helloworld アプリケーションクラスのインスタンスファクトリ関数 (helloworld::Factory 関数)を返す処理を記述します。
ファクトリ関数(helloworld::Factory 関数)には、 helloworld アプリケーションクラスのインスタンスを生成する処理を記述します。
Tip | |
---|---|
アプリケーションクラスのインスタンスは、 1 アプリにつき 1 つだけ生成します。 |
ClassID とライセンスコード | |
---|---|
BREW 実機(BREW 移動機)では、 アプリの ClassID に対応した正規ライセンスコードを設定しなければアプリは起動しません。 開発時は Example / Tutorial フォルダ内にあるサンプルアプリの ClassID とライセンスコードをテスト用に使用してください BREW シミュレータでは、ライセンスコードを設定しなくてもアプリは起動します。 参照: ライセンスコード |
例 4.1. ブートローダとファクトリ関数
//// helloworld.cpp // #include "helloworld.hpp" // ブートローダ SFCApplet::FactorySPP SFCApplet::Boot(AEECLSID id, SFXAnsiStringPtr license) { // 実行ライセンスコードを設定する(実機の場合は必須。シミュレーターでは省略可) *license = "heap://" "TIXDRQXNU5WHU8Y3Z9WOHWQR6Z3VPSDHDV5CR1S4XASPWLUHWAS7Z5Z2TGS3XMSAT3UPUQTLTARCYPSF" "UEJZ6ROSJWGUQSEYKR6V2U4VESMTQLHKZ6X7Y2VKXHWIX3XBU0Z7VHWHXIZBSGT5SPU3XLX0Z1Y4R3TC" "U6WGT9WHWIVNYHYCUCR9T3SMTEWPRNVAX1Y4VPW2YCY9YQV5R7Z9UIVHT6SDUPU2SIW6VCRCWBR2S4WQ" "UPYFWCYGT4VIT1WHXGYPTQSFYPWNV3ULRNWFW7RBRFVKUKS2YQSQYHW1TPUPXBZ6UEY2WOYKR7S3TAU4" "TQS6UHVFVEVLU3R5SDSKW7RPTNTPVQU2T4R8Z4VLUGEW3U98TLDR8/"; return (id == AEECLSID_HELLOWORLD) ? (&helloworld::Factory) : (null); } // ファクトリ関数 SFCInvokerPtr helloworld::Factory(Void) { return ::new helloworld; // helloworld アプリケーションクラスのインスタンスを生成する }
SFC アプリでは、 アプリ起動後(アプリケーションクラスのインスタンス生成後)、 BREW 環境からイベント(BREW イベント)を受信すると、 SFCApplication::Invoke 関数が呼び出されて以下の処理を行います (参照: SFCApplication::Invoke 関数の内部実装)。
優先的イベントハンドラについて | |
---|---|
SFCApplication::RegisterBypass にある解説を参照してください。 |
例 4.2. SFCApplication::Invoke 関数の内部実装
/*private */Bool SFCApplication::Invoke(SFXEventConstRef event) { Bool overload(false); // イベントを重複して処理するかどうかを表すフラグ Bool render(false); // 全画面を再描画するかどうかを表すフラグ Bool result(false); // 処理がなされた場合、"true" が設定される switch (event.GetType()) { case SFEVT_APP_START: case SFEVT_APP_RESUME: // SFEVT_APP_START / SFEVT_APP_RESUME の場合 render = true; // 全画面を再描画する case SFEVT_APP_STOP: case SFEVT_APP_SUSPEND: // SFEVT_APP_START / SFEVT_APP_RESUME / SFEVT_APP_STOP / SFEVT_APP_SUSPEND の場合 overload = true; // イベントを重複して処理する result = true; // BREW の仕様では、これらのイベントには true を返す必要がある break; default: break; } if (_bypass != null) { // 優先的イベントハンドラの処理 // 優先的イベントハンドラを呼び出す result = (*_bypass)(event, _reference); } if (render) { // アプリ開始/再開時と優先的イベントハンドラ終了時の全画面再描画 if (IsRenderable()) { // 優先的イベントハンドラが登録されていない場合 // 全画面を再描画する HandleRender(event); } } if (!result || overload) { // 優先的イベントハンドラで処理されなかったイベント、あるいは // SFEVT_APP_START / SFEVT_APP_RESUME / SFEVT_APP_STOP / SFEVT_APP_SUSPEND イベントの処理 // イベントを処理する result = HandleEvent(event) || overload; } return result; }// SFCApplication::Invoke //
注意 | |
---|---|
SFEVT_APP_START / SFEVT_APP_RESUME / SFEVT_APP_STOP / SFEVT_APP_SUSPEND イベントを受信したとき、 必ず true を返す処理をしていることに注意してください。 |
SFCApplication::HandleEvent / SFCApplication::HandleRender / SFCApplication::HandleError 仮想関数のデフォルトの実装は、 各関数の内部実装を参照してください。
これらの仮想関数は、 アプリの処理内容に応じてユーザー定義アプリケーションクラスにて上書きします。
以下に述べる helloworld アプリの例では、 helloworld アプリケーションクラス内で SFCApplication::HandleEvent 関数と SFCApplication::HandleRender 関数を上書きしています。
アプリを終了するには、 SFCApplication::Terminate 関数を呼び出します。
SFCApplication::Terminate 関数を呼び出すと、 内部的に BREW API ISHELL_CloseApplet 関数が呼び出されます。 そのとき、アプリは SFEVT_APP_STOP イベントを受信し、 アプリケーションクラスのデストラクタを実行した後アプリケーションクラスのインスタンスは解放され、 アプリは終了します。
SFCApplication::~SFCApplication デストラクタは、 アプリが BREW イベントを処理しない設定にします。
利用者が電源キー(AVK_POWER)を押下した場合、 もしくはクリアキー(AVK_CLR)を押下時にアプリが AEE に false を返した場合、 SFCApplication::Terminate 関数呼び出しと同等の処理が自動的に行われてアプリは終了します。
注意 | |
---|---|
クリアキー(AVK_CLR)の SFEVT_KEY イベントはアプリ側で処理できますが、 電源キー(AVK_POWER)はアプリ側では処理できません。 |
Copyright(c) 2002 - 2024 Sophia Cradle Incorporated All Rights Reserved. |