再生完了時のコールバック設定
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のバージョンが違っても問題ない可能性があります(未検証)
