【Cocos2d-x 3.2】 Sequence の中に RepeatForever を入れて使いたい場合のとりあえず楽な解決方法

こんにちは、サークル tenclaps でプログラミングを書いている横波ホイヘンスです。

問題

例えば

「A点からB点までキャラを cocos2d::MoveTo させた後に、その位置で飛び跳ねるアニメーションを無限に繰り返したい」

ような場合、 cocos2d::Sequence の中に、cocos2d::RepeatForever を入れる方法を思いつきますが、 以下のコードでは繰り返しアニメーションが一度も再生されません。

auto moveto = MoveTo::create(1.0f, Point::ZERO);
auto animate = Animate::create(spriteFrameAnimation);

auto repeatForever  = RepeatForever::create(animate);

//★repeatForeverAction が再生されない
sprite->runAction(Sequence::create(moveTo, repeatForever));

cocos2d::Sequence に入れられるアクションは cocos2d::FiniteAction でなければならないという制約があるためです。

(無限に繰り返すアクションに引き続いて何らかのアクションを動かそうとするような(無意味な)行為を防ぐため?)

一応実行してみると、コンソールに以下のようなメッセージが出力されます。

cocos2d: [Action update]. override me

対策

cocos2d::RepeatForever ではなく、 cocos2d::Repeat を使用します。

cocos2d::Repeat は FiniteAction なので Sequence に入れられますが、 繰り返し引数に -1 を指定することで無限回の再生が可能のようです。

auto moveto = MoveTo::create(1.0f, Point::ZERO);
auto animate = Animate::create(spriteFrameAnimation);

auto repeat  = Repeat::create(animate, -1);

//★moveTo 後に animate が無限回再生される
sprite->runAction(cocos2d::Sequence::create(moveTo, repeat));

補足

ただ、 cocos2d::Repeat の API リファレンスには 「繰り返し数 times は 1 から 2の30乗の範囲で指定する」 と書かれているので、公式の仕様ではなさそうです。

→ Cocos2d-x 3.2 では動作していますが、今後のバージョンでは動作しなくなる可能性有り

繰り返し数に pow(2,30) を入れれば事実上無限回の繰り返しになるので、 pow(2, 30) を使用した方が怪しさがなくて安心かと思います・・・。

Times is an unsigned integer between 1 and pow(2,30)

参考サイト

cocos2d-js: cc.delayTime() and cc.repeatForever() don't work together in cc.sequence() - Stack Overflow