devlog [naru design]

プログラミングやテクニカルな内容の覚え書き。

cocos2dのテンプレートから作成したプロジェクトのAppDelegate.mには、あらかじめpauseとresumeの処理が含まれています。アプリが動作中にホームボタンがタップされてアプリが非アクティブになっても、再びアクティブになった時にアプリが再開するようになっています。

ただし、このままだと自分で意図的にpauseした状態で非アクティブから復帰すると問題が発生するかもしれません。

例えば、アプリ内に意図的にポーズするためのポーズボタンが設けられているとき、

1. アプリ内のポーズボタンがタップされた。
2. CCDirectorのpauseメソッドで一時停止
3. ポーズ画面を表示する
4. ポーズ画面のCLOSEボタンがタップされた。
5. ポーズ画面を非表示にする
6. CCDirectorのresumeメソッドで再開

上記リストの3.と4.の間に端末のホームボタンがタップされると、AppDelegate.mのapplicationWillResignActive:メソッドが呼ばれて、アプリは非アクティブになります。
そして、端末のホームボタンをダブルタップしてアプリを再びアクティブにした時、applicationDidBecomeActive:メソッドが呼ぼれて、意図的にpauseしていたにも関わらずresumeが実行されてしまいます。

これを防ぐには、アプリのステータスを保存しているシングルトンクラスなどに、自分が意図してPAUSEしたことを保存(flagPause=YES)しておき、resumeするときに参照するようにしておけば良いかと思います。

1. アプリ内のポーズボタンがタップされた。
2. CCDirectorのpauseメソッドで一時停止、flagPause=YES
3. ポーズ画面を表示する
4. ポーズ画面のCLOSEボタンがタップされた。
5. ポーズ画面を非表示にする
6. CCDirectorのresumeメソッドで再開、flagPause=NO

参考:

Objective-C:1つだけのインスタンス(Singleton)

Pocket

“cocos2d:アプリのpauseとresumeの注意点” への2件のフィードバック

  1. naru design より:

    ポーズ画面に配置したボタンのレスポンスが若干落ちていることに気がついた。
    apiリファレンスでpauseメソッドを見たら

    Pauses the running scene. The running scene will be drawed but all scheduled timers will be paused While paused, the draw rate will be 4 FPS to reduce CPU consuption

    と書かれてた。
    消費電力を抑えるためにフレームレートが4FPSになっているため、ボタンのレスポンスが落ちているのか。

    ということで、pause後に自分でフレームレートを変えてみた。

    [[CCDirector sharedDirector] setAnimationInterval:1.0/60];

    省エネ効果は無くなるが、60FPSにすることでレスポンスは元に戻る。

  2. […] を借りにGoogleで検索したところ こちらのサイト様見つかりました。 cocos2d:アプリのpauseとresumeの注意点 […]

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Trackback URL: