ホーム > デベロッパ > BREW プログラミング入門 > イベント処理って何だ? > - 2 / 2 -

イベント処理って何だ? - 2 / 2 -

アプレットのサスペンドとレジューム

BREW アプレットは、同時に一つしか動作させることができません。しかし、複数のアプレットを起動したまま、それらを切り替えることはできます。それを可能にしているのが、サスペンド・レジューム機能です。携帯電話のユーザーはアプレットを起動したあと、それを "中断" することで、アプレットはサスペンド状態になります。

APP_EVT_SUSPEND イベントは、ユーザーがアプレットを中断した場合などに受け取ります。イベントハンドラは、このイベントに対して TRUE を返すことで、「中断でございますワネ。承知しましたワ、ご主人様」と言って、アプレットは中断状態になります。

もし APP_EVT_SUSPEND イベントに対して FALSE を返しますと、「中断だぁ? うっせぇーんだよクソジジィ」といって、 BREW 実行環境に喧嘩を売ることになります。そうしますと、 BREW 実行環境は「ワシが中断しろと言っているのがわからんのかー! 勘当じゃぁ!」といって、今度は APP_EVT_STOP イベントを送りつけてきます。終了されちゃうんですねえ。

さて、 APP_EVT_SUSPEND イベントに対して TRUE を返した礼儀正しいお嬢様のほうは、ユーザーが中断したアプリを再開させますと、 BREW 実行環境が「起きる時間じゃぞ、ワシがまたかわいがってやろう。ムフフ」といって、今度は EVT_APP_RESUME イベントを受け取ります。このとき、サスペンドされたときの状態がそのまま復元されます。

APP_EVT_SUSPENDイベントに対してTRUEを返した場合
APP_EVT_SUSPENDイベントに対してTRUEを返した場合

APP_EVT_SUSPENDイベントに対してFALSEを返した場合
APP_EVT_SUSPENDイベントに対してFALSEを返した場合

以上の仕組みに関しましては、「BREW SDK ユーザーズガイド」に記述がありますので、ご参照ください。

サスペンドとレジュームのエミュレート

BREW エミュレータでサスペンドとレジュームをエミュレートすることができます。

BREW アプレットを実行した状態で、メニューから [ツール] - [設定] を選択しますと、 [設定] ダイアログが表示され、「BREW サスペンド中」というメッセージが画面に表示されます。これでサスペンド状態になります。

レジュームするには、 [設定] ダイアログで [キャンセル] ボタンを押せばいいです。

BREWエミュレータの[設定]ダイアログ

キーイベント

BREW 開発で最もよく使われるイベントはキーイベントですが、キーイベントには主に、 EVT_KEY 、 EVT_KEY_PRESSED 、 EVT_KEY_RELEASED という三種類があります。

ユーザーが携帯電話のキーを押しますと、そのタイミングで EVT_KEY_PRESS イベントが通知されます。また、キーを離しますと、そのタイミングで EVT_KEY_RELEASE が通知されます。

キーイベント

EVT_KEY イベントが通知されるタイミングは、携帯電話端末ごとに異なるようです。「BREW SDK ユーザーズガイド」には、次のような記述があります。

デバイスメーカーの選択に応じて、キーが押されたとき、または離されたとき、
もしくはその両方で送られます。

三種類のキーイベントのイベント パラメータはどれも同じ意味をもちます。 wParam にはキーのキーコードが渡され、 dwParam には修飾キーフラグが渡されます。

キーコードとは、キーを表す定数です。「BREW API リファレンス」の左側の目次の [キーコード] を選択すると、キーコードの一覧が表示されます。以下にいくつか抜き出してみました。

キーコード 説明
AVK_SELECT セレクトキー
AVK_CLR クリアキー
AVK_UP 上キー
AVK_DOWN 下キー
AVK_LEFT 左キー
AVK_RIGHT 右キー
AVK_SOFT1 ソフトキー1
AVK_SOFT2 ソフトキー2

携帯電話のキー
携帯電話のキー

修飾キーフラグは、修飾キーを表すビット定数です。修飾キーとはパソコンのキーボードの [Shift] とか [Ctrl] にあたるもののようです。「BREW API リファレンス」の [キーコード] - [修飾キーのビット] に記述がありますが、通常の携帯電話では使われることはないでしょう。

イベント処理のサンプルアプリ

今回解説した七つのイベントをすべて使用したサンプルアプリを示します。名づけてニコチャンアプリです(クリックで別ウィンドウにソースコード表示)。

このアプリを起動しますと、ニコチャンの黄色い顔が表示されます。セレクトキーを押下状態にしますと、ニコチャンの顔が怒った顔になります。セレクトキーを離しますと、元のニコニコ顔になります。

ニコチャン アプリ

セレクトキーが押下状態であるかどうかを、アプレット構造体(NicoApplet)に格納しています。描画ルーチンでは、その状態に応じて描画を行っています。

このアプリでは、アプレット構造体に IGraphics オブジェクトを保持しています。 IGraphics オブジェクトは、描画ルーチンの中で取得・解放してもよいのですが、そのぶんだけ描画速度が落ちることになります。そこで、 EVT_APP_START イベント処理の中で IGraphics を取得して、それを実行中ずっと保持しています。そして、 EVT_APP_STOP イベント処理の段階でオブジェクトを解放しています。このようなテクニックは、 BREW で高速なゲームを作るときには、必ず使うことになるでしょう。

それから、今回のアプリでは、 EVT_APP_RESUME イベントを処理して、レジューム時に再描画を行っています。 BREW アプリがサスペンド状態になると、別の画面が表示されますので、レジューム直後には元の画面表示を行う必要があります。

また、 EVT_APP_SUSPEND イベントでは、セレクトキー押下状態を解除しています。もし、セレクトキー押下状態でサスペンドされたら、どうなるでしょうか。実際にセレクトキーが押下状態ではないにも関わらず、内部的に押下状態フラグがたっているため、レジュームされたときに、怒った顔が表示されてしまいます。

このようなサスペンド・レジューム時の細かな処理は、実際のアプリ開発では必ず必要になってくることでしょう。