【cocos2dx】放置ゲームを作る際の時間の管理-part2

cocos2dxで、いわゆる「放置系」のゲームを作るにはどのように実装をすればいいのか、の第2回目です。 今回は、下記項目の2番目を勉強していきたいと思います。

  1. 同じCCScene、もしくはCCLayer上の時間の管理
  2. 別のCCScene、もしくはCCLayer上の時間の管理
  3. バックグラウンドに移動した時、またバックグラウンドから復帰した時の時間の管理
  4. アプリを停止した時、アプリを立ち上げた時の時間の管理

前回

【cocos2dx】放置ゲームを作る際の時間の管理-part1 | albatrus.com

別のCCScene、もしくはCCLayer上の時間の管理

前回は、同一のCCScene上での時間の管理を想定していましたが、今回はSceneやlayerを移動した場合にどうすればいいのかを考えます。

パターン1 - CCLayerの移動

CCLayerを移動させて画面を変える場合には、時間を管理するルート(Update)をCCSceneもしくは、移動しないCCLayerクラスで管理をします。

2014 3 10 2212

このように実装をすれば特別なことをしなくても大丈夫です。

パターン2 - CCSceneの移動

次は、CCSceneそのものを移動させる場合です。

2014 3 10 2d212

この場合は、ルート(Update)自体も無くなってしまうので、少し実装を変えてあげる必要があります。

実装

やりたいことは以下のようになります。

  1. シーンを移動する時に、時間を管理する値をアプリに記録する
  2. 新しいシーンで、記録した値を呼び出して、そこからルート(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]

こうすれば、シーンは違いますが時間の経過に関しては計算ができます。