cocos2dのテンプレートから作成したプロジェクトのAppDelegate.mには、あらかじめpauseとresumeの処理が含まれています。アプリが動作中にホームボタンがタップされてアプリが非アクティブになっても、再びアクティブになった時にアプリが再開するようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// getting a call, pause the game -(void) applicationWillResignActive:(UIApplication *)application { if( [navController_ visibleViewController] == director_ ) [director_ pause]; } // call got rejected -(void) applicationDidBecomeActive:(UIApplication *)application { if( [navController_ visibleViewController] == director_ ) [director_ resume]; } |
ただし、このままだと自分で意図的にpauseした状態で非アクティブから復帰すると問題が発生するかもしれません。
例えば、アプリ内に意図的にポーズするためのポーズボタンが設けられているとき、
1. アプリ内のポーズボタンがタップされた。
2. CCDirectorのpauseメソッドで一時停止
3. ポーズ画面を表示する
4. ポーズ画面のCLOSEボタンがタップされた。
5. ポーズ画面を非表示にする
6. CCDirectorのresumeメソッドで再開
上記リストの3.と4.の間に端末のホームボタンがタップされると、AppDelegate.mのapplicationWillResignActive:メソッドが呼ばれて、アプリは非アクティブになります。
そして、端末のホームボタンをダブルタップしてアプリを再びアクティブにした時、applicationDidBecomeActive:メソッドが呼ぼれて、意図的にpauseしていたにも関わらずresumeが実行されてしまいます。
1 2 3 4 5 6 7 |
-(void) applicationDidBecomeActive:(UIApplication *)application { if( [navController_ visibleViewController] == director_ ) { if (![[AppStatus singleton] flagPause]) [director_ resume]; } } |
これを防ぐには、アプリのステータスを保存しているシングルトンクラスなどに、自分が意図してPAUSEしたことを保存(flagPause=YES)しておき、resumeするときに参照するようにしておけば良いかと思います。
1. アプリ内のポーズボタンがタップされた。
2. CCDirectorのpauseメソッドで一時停止、flagPause=YES
3. ポーズ画面を表示する
4. ポーズ画面のCLOSEボタンがタップされた。
5. ポーズ画面を非表示にする
6. CCDirectorのresumeメソッドで再開、flagPause=NO
参考:
Objective-C:1つだけのインスタンス(Singleton)
ポーズ画面に配置したボタンのレスポンスが若干落ちていることに気がついた。
apiリファレンスでpauseメソッドを見たら
と書かれてた。
消費電力を抑えるためにフレームレートが4FPSになっているため、ボタンのレスポンスが落ちているのか。
ということで、pause後に自分でフレームレートを変えてみた。
[[CCDirector sharedDirector] setAnimationInterval:1.0/60];
省エネ効果は無くなるが、60FPSにすることでレスポンスは元に戻る。
[…] を借りにGoogleで検索したところ こちらのサイト様見つかりました。 cocos2d:アプリのpauseとresumeの注意点 […]