バックキー押下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フレームかけてフェードアウトの後、アプリ終了
という処理になっています。


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