今までのサンプルでは、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フレームかけてフェードアウトの後、アプリ終了
という処理になっています。
プロジェクト一式は
こちらから。
セコメントをする