前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3

4.3. アプリケーションクラスの実装

SFC アプリのアプリケーションクラスは、 SFCApplication クラスを継承します。

[Note] SFY アプリ

SFY アプリのアプリケーションクラスは、SFYApplication を継承します。 SFYApplication クラスでは、 SFY レスポンダシステムの利用に必要な設定がデフォルトで実装されています。

SFC アプリでは、 ハンドラ関数の宣言に XANDLER_DECLARE_..... マクロを使いません。

例えば、キーハンドラ(以下の OnKey 関数)の宣言は、 BREW 標準アプリの関数と同じです。

例 4.3. helloworld アプリケーションクラスの定義

////  helloworld.hpp//

#ifndef __HELLOWORLD_HPP
#define __HELLOWORLD_HPP

#include <SophiaFramework.hpp>
#include "helloworld.bid"

//
//  helloworld アプリケーションクラス
//

SFMTYPEDEFCLASS(helloworld)  //  便利な型を生成するためのマクロ

class helloworld : public SFCApplication {

    SFMSEALCOPY(helloworld)  // インスタンスのコピーを禁止するためのマクロ

public:

    static SFCInvokerPtr Factory(Void);  // ファクトリ関数

private:

    helloworld(Void);
    virtual ~helloworld(Void);

    virtual Bool HandleEvent(SFXEventConstRef event);  // イベントハンドラ
    virtual Bool HandleRender(SFXEventConstRef event); // 全画面再描画ハンドラ
    Bool OnKey(UInt16 key);                            // キーハンドラ
};

#endif // __HELLOWORLD_HPP //
[Note] HandleEvent 関数

HandleEvent 関数は、 BREW 環境から受信したイベント(BREW イベント) を引数に持つ、SFC アプリのイベントハンドラです。

アプリケーションクラスの HandleEvent 関数では、 SFCApplication::HandleEvent 仮想関数をオーバーライドしてイベント処理を実装します。

具体的には、 受信したイベントのタイプに応じて適切なハンドラを呼び出します。

helloworld::HandleEvent 関数では、 キーイベントを受信すると、 キーハンドラである OnKey 関数を呼び出します。

参照: SFCApplication::HandleEvent

[Note] HandleRender 関数

HandleRender 関数は、 アプリ開始/再開時と優先的イベントハンドラ終了時に自動的に呼び出される、 全画面を再描画するための関数です。

アプリケーションクラスの HandleRender 関数では、 SFCApplication::HandleRender 仮想関数をオーバーライドして全画面再描画を実装します。

helloworld::HandleRender 関数では、 画面を白色で塗り潰して、 文字列 "Hello World" を黒色で描画します。

参照: SFCApplication::HandleRender

[Note] イベント処理に伴う再描画

イベント処理に伴う再描画は、 後述の Draw 関数のように HandleEvent 関数内に実装します。

HandleEvent 関数の実装

HandleEvent 関数(イベントハンドラ)の雛形は、 AppWizardによって自動的に生成されます。

例 4.4. HandleEvent 関数の実装

// イベントハンドラ
Bool helloworld::HandleEvent(SFXEventConstRef event)
{
    // ここに BREW 環境から受信したイベントの分岐処理を記述する

    Bool result(false);

    switch (event.GetType()) {

        case SFEVT_KEY: // キーイベントのとき

            // キーハンドラ OnKey 関数を呼び出す
            result = OnKey(event.GetP16()); // OnKey 関数はキーイベントを処理した場合は true、しなかった場合は false を返す
    }

    return result; // イベントを処理したときは true を返し, そうでないときは false を返す
}
[Note] HandleEvent 関数の戻り値

HandleEvent 関数(イベントハンドラ)は、 イベントを処理した場合は true、処理しなかった場合は false を返します。

HandleRender 関数の実装

HandleRender 関数(全画面再描画ハンドラ)の雛形は、 AppWizardによって自動的に生成されます。

例 4.5. HandleRender 関数の実装

// 全画面再描画ハンドラ
Bool helloworld::HandleRender(SFXEventConstRef event)
{
    // ここにアプリ開始/再開時と優先的イベントハンドラ終了時の全画面再描画を記述する

    static SFXRGBColor::AtomRecConst            theme = {
        {{0x00, 0xFF, 0xFF, 0xFF}}
    };
    SFXGraphicsPtr graphics;
    Bool           result(false);

    // SFXGraphics インスタンスを取得する
    if ((graphics = SFXGraphics::GetInstance()) != null) {

        // デバイス画面を白色で塗りつぶす
        // ※SFXGraphics::GetDeviceRectangle() でデバイス画面の領域を取得する
        graphics->ClearRectangle(SFXGraphics::GetDeviceRectangle(), theme);

        // 文字列 "Hello World" を黒色で描画する
        graphics->DrawSingleText("Hello World", SFXGraphics::GetDeviceRectangle(), SFXRGBColor(0x00, 0x00, 0x00, 0x00));

        // 最後に SFXGraphics::Update() を呼び出してデバイス画面を更新する
        // ※この一行を記述しなければ、デバイス画面は更新されない
        graphics->Update();
        result = true;  // 再描画したので result に true を設定する
    }
    return result;  // 再描画した場合は true、そうでない場合は false を返す
}

参照: SFXGraphics | SFXGraphics::GetInstance | SFXGraphics::GetDeviceRectangle | SFXGraphics::ClearRectangle | SFXGraphics::Update | SFCApplication::HandleError

[Note] HandleRender 関数

HandleRender 関数は、 アプリ開始/再開時と優先的イベントハンドラ終了時に自動的に呼び出される、 全画面を再描画するための関数です。

上の例では、 画面を白色で塗り潰してから、 文字列 "Hello World" を黒色で描画する処理を SFCApplication::HandleRender 関数にオーバーライドして実装しています。

[Note] HandleRender 関数の戻り値

HandleRender 関数は、 再描画を行った場合は true、行わなかった場合は false を返します。

[Caution] 画面の更新

画面を更新するには、 SFXGraphics::Update 関数を呼び出します。

下記のコードを実行すると、デバイス画面は更新され再描画されます。

graphics->Update();

OnKey 関数(キーハンドラ)の実装

OnKey 関数(キーハンドラ)の雛形は、 AppWizardによって自動的に生成されます。

この関数では、 セレクトキー(AVK_SELECT)の SFEVT_KEY イベントを受信したとき、 アプリを終了させる処理を実装しています。

例 4.6. OnKey 関数の実装

// キーハンドラ
Bool helloworld::OnKey(UInt16 key)
{
    // ここに BREW 環境から受信したキーイベントの分岐処理を記述する

    // キーイベントの処理
    switch (key) {

        case AVK_SELECT: // セレクトキーのキーイベントを受信したとき

            Terminate(); // アプリを終了する

            return true; // キーイベントを処理したので true を返す
    }

    return false; // キーイベントを処理していないので false を返す
}
[Note] キーハンドラの戻り値

キーハンドラは、キーイベントを処理した場合は true、処理しなかった場合は false を返します。

[Note] アプリの終了

アプリを終了するには、 SFCApplication::Terminate 関数を呼び出します。

アプリの終了についての詳細は、 アプリの終了を参照してください。

例 4.7. コンストラクタの定義

helloworld::helloworld(Void) static_throws
{
    // return;  ← NG(×) コンストラクタでは return 文を記述してはいけない
}
[Note] イベントハンドラの登録

SFC アプリでは、HandleEvent 関数(イベントハンドラ)を独自に実装するので、 コンストラクタではハンドラ関数を登録しません。

[Caution] return 文

C++ ではコンストラクタやデストラクタでは return 文を記述しません。

GCC を使う場合、コンストラクタやデストラクタ内で return 文を記述すると、 特定の継承関係になっているときにコンパイラがフリーズするバグが確認されています。