2013年7月21日日曜日

【cocos2d-x】CCSeqenseがリリースビルドで動かなかったお話。

cocos2d-x2.1.3でのお話です。
例えば0.5秒後にメソッドを呼びたいとき。
CCSequence *seq = CCSequence::create(CCDelayTime::create(0.5),
                                                                CCCallFunc::create(this, callfunc_selector(HogeScene::hoge)));
runAction(seq);
とか書いたりします。
これ、本来なら動きません。クラッシュします。
CCSeqenseには最後にNULLを入れなければいけないからです。
CCSequence *seq = CCSequence::create(CCDelayTime::create(0.5),
                                                                CCCallFunc::create(this, callfunc_selector(HogeScene::hoge)),
                                                                NULL);
runAction(seq);

正しくはこっちですね。
CCSequence *seq = CCSequence::createWithTwoActions(CCDelayTime::create(0.1),
                                                                                         CCCallFunc::create(this, callfunc_selector(MainScene::pressBtn)));
runAction(seq);
もしくはこう。
しかし、一番上のコード、動いちゃいます。
debugビルドのみ。
シミュレーターでも実機でもふつうに動きます。
ただ、リリースビルドでクラッシュします。かなりの罠です。
なので、CCSeqenseで2つのActionしか使わないときは
CCSequence::createWithTwoActions() を使いましょう。
もしくは単に遅延させてメソッド呼びたいならscheduleOnce使ってもいいです。というかそっちのがいいかも。