cocos2dxで、いわゆる「放置系」のゲームを作るにはどのように実装をすればいいのか、の第2回目です。 今回は、下記項目の2番目を勉強していきたいと思います。
- 同じCCScene、もしくはCCLayer上の時間の管理
- 別のCCScene、もしくはCCLayer上の時間の管理
- バックグラウンドに移動した時、またバックグラウンドから復帰した時の時間の管理
- アプリを停止した時、アプリを立ち上げた時の時間の管理
前回
【cocos2dx】放置ゲームを作る際の時間の管理-part1 | albatrus.com
別のCCScene、もしくはCCLayer上の時間の管理
前回は、同一のCCScene上での時間の管理を想定していましたが、今回はSceneやlayerを移動した場合にどうすればいいのかを考えます。
パターン1 - CCLayerの移動
CCLayerを移動させて画面を変える場合には、時間を管理するルート(Update)をCCSceneもしくは、移動しないCCLayerクラスで管理をします。
このように実装をすれば特別なことをしなくても大丈夫です。
パターン2 - CCSceneの移動
次は、CCSceneそのものを移動させる場合です。
この場合は、ルート(Update)自体も無くなってしまうので、少し実装を変えてあげる必要があります。
実装
やりたいことは以下のようになります。
- シーンを移動する時に、時間を管理する値をアプリに記録する
- 新しいシーンで、記録した値を呼び出して、そこからルート(update)を利用する
ここで利用するのがonExit()メソッドとNSUserDefaultsです。
onExit()
onExit()は、CCScene・CCLayerが無くなる時に呼び出されるメソッドです。 シーンが移動するときにonExit()で値をNSUserDefaultsに記録させます。 [c]
float time;
void MyLayer::onExit(){
CCLOG("onExit()");
CCUserDefault *userDefalt = CCUserDefault::sharedUserDefault();
userDefalt->setIntegerForKey("time", time);
userDefalt ->flush();
}
[/c]
後は、記録させた値を新しいシーンで呼び出してあげます。 [c]
CCUserDefault *userDefalt = CCUserDefault::sharedUserDefault();
int addTime = userDefalt->getIntegerForKey("time");
time = time + addTime;
[/c]
こうすれば、シーンは違いますが時間の経過に関しては計算ができます。