Cocos2dxのタイマー「schedule」

ChainZ(クリエイター)
いろいろやってます。

ゲームの処理を行う時に、一定時間間隔で繰り返しや遅延などを実現するには、タイマーが必要です。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で済ませます。複雑なゲーム処理などはメインループを使うのがおすすめです。