cocos2dxのタイマー「schedule」
ゲームの処理を行う時に、一定時間間隔で繰り返しや遅延などを実現するには、タイマーが必要です。cocos2dxにはschedule
という便利なタイマー機能があります。
フレームごとに繰り返しscheduleUpdate
このメソードを使うと、クラス内のupdate()
メソードがフレームごとに実行されます。このupdate()
メソードは所謂「メインループ」のことです。scheduleUpdate
を使うには、まずヘッダーファイルにupdate()
メソードの定義をします。
void update( float frame ) // updateじゃないとだめです!
そして、ソースコードでメソードの宣言をします。(HelloWorldというクラス内を想定します。下記同様)
void HelloWorld::update( float frame )
{
CCLOG("だるい");
}
最後に、このupdate()
メソードを実行したいところに、this->scheduleUpdate()
を書くと。「だるい」が大量発生します。
一定時間間隔で繰り返しschedule
もし、繰り返しの時間間隔を指定したい場合は、schedule
を使います。フレームごとの繰り返しと違って、schedule
は実行されるメソードも指定することができます。例として、ヘッダーファイルにHello()
というメソードを定義しましょう。
void Hello(float frame); // float型のパラメータが必要です。
もちろん、宣言をします。
void HelloWorld::Hello(float frame)
{
CCLOG("こんにちは");
}
3秒に一回「こんにちは」を繰り返すとしましょう。
schedule(schedule_selector(HelloWorld::Hello), 3.0f); これで、プログラムを実行すると、cocos2dxが3秒ごとに挨拶してくれる。 ## 実行の遅延 `scheduleOnce`を使うと、メソードが一回だけ実行されるので、これを利用してメソードの実行を送らせることができます。前の「こんにちは」の例を使いましょう。上記の
schedule(schedule_selector(HelloWorld::Hello), 3.0f);
を
scheduleOnce(schedule_selector(HelloWorld::Hello), 3.0f);
に入れ替えれば、「こんにちは」の挨拶は3秒遅らせて実行されることになります。
タイマーを止める
「だるい」大量発生がよろしくないので、止めたい場合は:
this->unScheduleUpdate();
を実行すればいいです。メソードが指定されたタイマーを止める時は:
this->unschedule(schedule_selector(<メーソド>));
を使います。「こんにちは」の例だと:
this->unschedule(schedule_selector(HelloWorld::Hello));
になります。 もし、すべてのタイマーを止めたいなら、
this->unscheduleAllSelectors();
を使えば良いのです。
感想
ゲームアプリはほぼイベント駆動型なので、ループをうまく使いこなせるかどうかが重要だと思います。cocos2dxのrunAction
が非常に便利だが、実際に大量なアニメーション同時進行だとコントロールしにくいので、結局最後runAction
が実行してるかどうかをチェックするには、update
のループでgetRunningActionNumber
が0になってるどうかで判断になってしまいます。自分の結論ですが、基本のUI系アニメーションはrunAction
で済ませます。複雑なゲーム処理などはメインループを使うのがおすすめです。