Zaurus GA 3D Engine マニュアル【galib 3D以外の解説】 Copyright 1999-2000 小笠原博之 galib を使うにあたって必要となる、3D 部分以外のライブラリ仕様に関する説明を 行います。 ●システムイベント ZaurusOS から送られてくるシステムイベントは、ユーザー関数 AppMove() で処理を 行うことができます。 AppMove() のスケルトンサンプル ----------------------------------------------------------------------------- void AppMove() { //イベント取得はこのルーチンで行うことができる //イベントの詳細は SZAB のマニュアル参照のこと //この処理はメインループとは非同期なので、ここでは情報の取得だけ行い、 //実際の処理はメインループで行ったほうがよい switch( _GlobalMessage->CommonMsg.MessageID ){ //ペン入力が必要ならここで座標を取得できる case PenDownID: //ペンタッチした瞬間 //_GlobalMessage->PenDown.PositionX; //_GlobalMessage->PenDown.PositionY; //この座標は QP 値なので、ドット数の4倍の値が返ってくる break; case PenStillDownID: //ペンタッチしている間 //_GlobalMessage->PenStillDown.PositionX; //_GlobalMessage->PenStillDown.PositionY; break; case PenUpID: //ペンを上げたとき break; case OnBreakID: //中断キーが押された場合 //中断キーで終了しないようにする方法 //_GlobalMessage->CommonMsg.MessageID= NullMessageID; break; case AppliOutID: break; case KeyDownID: //キータッチ switch( _GlobalMessage->KeyDown.KeyCode ){ case KC_BACK: //戻る (igetiでは取得できません) //戻るキーで終了する場合 //_GlobalMessage->CommonMsg.MessageID= OnBreakID; //break; case KC_DECIDE: //決定 case KC_PREV: //逆送り case KC_NEXT: //順送り case KC_CARD: //カード case KC_MENU: //メニュー case KC_SEND: //送信 case KC_RECEIVE://受信 case KC_CURSOR_LEFT: //スクロールボタン左 case KC_CURSOR_RIGHT: //スクロールボタン右 case KC_CURSOR_UP: //スクロールボタン上 case KC_CURSOR_DOWN: //スクロールボタン下 break; } break; } // _GlobalMessage は、GaExecMainLoop() の前に代入しておく //メインループのデフォルトのメッセージ処理を抑制するなら、 //_GlobalMessage->CommonMsg.MessageID を書き換えてから return する。 } ----------------------------------------------------------------------------- イベントは、GaExecMainLoop() に渡した MESSAGE 構造体を使って処理されます。 そのため、GaExecMainLoop() に渡すポインタを予め保存しておけば、AppMove() で さまざまなイベント処理を行うことができます。 上記のサンプルでは extern MESSAGE *_GlobalMessage; に GaExecMainLoop() に渡した MESSAGE のポインタが格納されているものとして書 かれています。 システムイベントについては、SZAB マニュアルの「プログラミングガイド」の最後の 方にに書かれていますので、あらかじめ参照しておいてください。 より細かい制御を行いたい方のために、GaExecMainLoop() のコードを以下にあげてお きます。なお、これは galib v0.90 時のものです。バージョンアップによって内容は 変更される可能性があります。 GaExecMainLoop() の中身 (v0.90) ----------------------------------------------------------------------------- void GaExecMainLoop( MESSAGE *Message ) { if( Message->CommonMsg.MessageID != SystemTickID ) return; EnableFastTick( 3 ); _SystemWork->_AppExecInit(); for(;;){ GetMessage( Message ); _SystemWork->_AppExecMove(); switch( Message->CommonMsg.MessageID ){ case OnBreakID: case AppliOutID: goto _LoopExit; case UserEventID: switch( Message->UserEvent.EventID ){ case GA_EVENT_EXIT: goto _LoopExit; case GA_EVENT_BREAK: DisableFastTick(); return; } break; case FastTickID: _SystemWork->_AppExecDraw(); break; } } _LoopExit: Message->CommonMsg.MessageID= AppliProcEndReqID; Message->AppliProcEndReq.AplFilter= AF_THIS_APPLI; _SystemWork->_AppExecQuit(); DisableFastTick(); } ----------------------------------------------------------------------------- 2000/01/23 作成 小笠原博之 oga@art.udn.ne.jp http://www.vector.co.jp/authors/VA004474/