バックキー押下
2013-12-06


今までのサンプルでは、Androidのバックキーを押すと有無を言わせずアプリが終了します。
ゲームなんかだと前の画面に戻ったりメニューを出したりしたいので、native側でバックキーの処理を行えるようにします。


java側の処理です。
BaseActivity.java
        public final static int         KEY_BACK        = 1;            // バックキー
        protected static int            key_status;                                             // キー入力状態
        /********************
            バックキー入力
         ********************/
        @Override
        public void             onBackPressed()
        {
                key_status = KEY_BACK;
        }
                                                {
                                                        int             _key = key_status;

                                                        key_status = 0;
                                                        if ( !updateNative(touch_status, _key) ) {              // native部稼働
                                                                finish();
                                                                break;
                                                        }
                                                        else if ( phase != 1 ) {
                                                                break;
                                                        }
                                                }

onBackPressed()でバックキーの押下を検知して、updateNative()で native側に状態を送る…だけです。


native側です。
SysMain.cpp
/**********
    稼働
 **********/
JNIEXPORT jboolean JNICALL      Java_sys_BaseActivity_updateNative(JNIEnv* env, jobject, jbyteArray touch, jint key)
{
        Renderer::update();                                                     // 描画前処理
        SoundManager::update();                                         // サウンド処理
        key_status = key;                                                       // キー入力状態

java側から受け取ったバックキーの状態を sys::key_statusにセットする…だけです。やっぱり。

common.h
// キー種類
enum
{
        KEY_BACK        = 1,                    // バックキー
};

バックキー押下時の sys::key_statusの値はこちらで定義しています。


サンプルです。
AppMain.cpp
/******************************
    稼働
                戻り値     アプリ続行か
 ******************************/
Bool    update_app(void)
{
        sprite[SPR_PHOTO].draw(0.0f, 0.0f);                                     // 背景
        for (int i = 0; i < 4; i++) {                                         // ビー玉
                int             t = ((cnt + i*15) % 60) - 30;

                sprite[SPR_BALL_BLUE + i].draw(((i*180 + cnt*4) % 720) - 360, 400 - (30*30 - t*t)/2);
        }
        cnt++;

        if ( end_cnt == 0 ) {
                if ( sys::key_status == sys::KEY_BACK ) {               // バックキー
                        sys::SoundManager::play(0, "se.ogg", sys::SoundPlayer::FILE_ASSET);
                        sys::Renderer::fade_out(60);
                        end_cnt = 60;
                }
        }
        else if ( --end_cnt == 0 ) {
                return  FALSE;                                                                  // アプリ終了
        }

        return  TRUE;
}

バックキーが押されると、
・サウンド se.oggを再生
・60フレームかけてフェードアウトの後、アプリ終了
という処理になっています。


プロジェクト一式はこちらから。

[Android プログラミング]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット