cocos2dxで、「放置系」のゲームを作るにはどのように実装をすればいいのか、の第4回目です。
今回は、下記項目の4番目を勉強していきたいと思います。
- 同じCCScene、もしくはCCLayer上の時間の管理
- 別のCCScene、もしくはCCLayer上の時間の管理
- バックグラウンドに移動した時、またバックグラウンドから復帰した時の時間の管理
- アプリを停止した時、アプリを立ち上げた時の時間の管理
前回
【cocos2dx】放置ゲームを作る際の時間の管理-part1 | albatrus.com【cocos2dx】放置ゲームを作る際の時間の管理-part2 | albatrus.com
【cocos2dx】放置ゲームを作る際の時間の管理-part3 | albatrus.com
アプリを停止した時、アプリを立ち上げた時の時間の管理
今回のブログシリーズ最後が「アプリを落とした」ときの時間管理です。以下のパターンが考えられます。
- バックグラウンドへ移動 -> アプリ終了 -> アプリ立ち上げ
- Sceneの移動 -> バックグラウンドへ移動 -> アプリ終了 -> アプリ立ち上げ
applicationWillTerminate()
前回の「バックグラウンドへの移動」と同じように、アプリが終了した際に呼び出されるメソッドがあります。これはcocos2dxでは、[iOS]->[AppController]にあるapplicationWillTerminate()です。
1 2 3 4 5 6 7 |
- (void)applicationWillTerminate:(UIApplication *)application { /* Called when the application is about to terminate. See also applicationDidEnterBackground:. */ } |
これを使えば、アプリの終了した時がわかります。
applicationWillTerminate()への挙動
アプリ終了時に呼び出されるapplicationWillTerminate()なのですが、実はこのメソッドが呼び出される前に前回紹介した「バックグラウンドへ移動」の時に呼び出されるapplicationDidEnterBackground()を実行しています。これは、既にアプリがバックグラウンドにある状態でも同じです。
時間はバックグラウンドで管理する
上記の見ると、時間の管理は「バックグラウンド」で行うのが良いです。「バックグラウンドに移動」した時間を記録しておけば、これを再度アプリが立ち上がった際に呼び出せばいいのです。
注意点としては、「バックグラウンド」-> 「アプリ終了」時にもapplicationDidEnterBackground()が呼び出されてしまうので、この場合の値を記録させないようにすることです。
下記の例は、bool型を使って最初の一度だけ記録させる方法です。
「バックグラウンドから復帰」「アプリ起動」の時に、boolをfalseにしてあげれば管理をします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
bool isSaveTime = false; void AppDelegate::applicationDidEnterBackground(){ //バックグラウンドに移動した時間を記録 if(isSaveTime){ }else{ isSaveTime = true; int saveTime = (int)time(NULL); CCUserDefault *userDefalt = CCUserDefault::sharedUserDefault(); userDefalt->setIntegerForKey("saveTime", saveTime); userDefalt ->flush(); } CCLOG("AppDelegate バックグラウンドに移動"); CCDirector::sharedDirector()->stopAnimation(); } |
最後に
今回で「時間の管理」の実装は終了です。ただ、このようにブログを書く中でもっと良い方法がありそうな感じがします。新しい発見等があれば、再度ブログに書いていきたいと思います。
ぜひ何かの参考になればと思います。
また、他に良い方法があれば教えていただければ幸いです。
