再生完了時のコールバック設定
auto ccbr = new ::cocosbuilder::CCBReader();
ccbr->getAnimationManager()->setAnimationCompletedCallback(target, selector);
target, selector にコールバックの関数を指定する。
(CCBReaderを扱うオブジェクトにCCBAnimationManagerDelegate
を継承させ、ccbr->getAnimationManager()->setDelegate(継承オブジェクト)
とする方法もある)
TimelineのCallbacksで設定したコールバックの設定
三行結論
- 本来のやり方では、CCBReaderを扱うオブジェクトが
CCBSelectorResolver
を継承する必要があり、望ましくない -
JS-Controlled
が設定されている場合は文字列をキーとして関数が登録できる - cocosbuilder関連のコードを改変し、
JS-Controlled
が設定されていなくても文字列をキーとして関数を登録できるようにする
(本来の)実装の仕方
CCBReaderを扱うオブジェクトがCCBSelectorResolver
を継承し、以下のコールバック用の関数
-
onResolveCCBCCCallFuncSelector
(TimelineのCallbacksに設定したコールバック)
を定義することで実装する。
ちなみに・・・。
このResolverは、MenuおよびCCControl用のコールバック
-
onResolveCCBCCMenuItemSelector
(Menuのクリックに対するコールバック) -
onResolveCCBCCControlSelector
(CCControlに対するコールバック)
も持つ。
問題の提起
コールバックのためだけにCCBSelectorResolver
を継承したくない。
単純に「文字列をキーとして関数を登録する」だけが望ましい。
問題の補足
ここで、実はCocosbuilderの設定をJS-Controlled
にした場合、以下の様に文字列をキーとしてコールバック関数を登録できる。
ccb_reader->getAnimationManager()->setCallFunc(
CallFunc::create(CC_CALLBACK_0(selector, target)),
"key"
);
コード改変
JS-Controlled
設定と同様の処理を、非設定の方でも行うようにする。
使い方の例
ヒットエフェクトのアニメーションにおいて、アニメーションの途中で敵がダメージを受ける演出を行うタイミングを指定をしたい。
- CocosbuilderでのCallbacks指定
(option + クリックで登録可能)
任意のタイミングで
キー: damage
を登録する
- コード
ccb_reader->getAnimationManager()->setCallFunc(
CallFunc::create(CC_CALLBACK_0(Battle::damageToEnemy, this)),
"damage"
);
補足
-
cocos2d-x
およびCocosbuilder
のバージョンが違っても問題ない可能性があります(未検証)