CocosBuilder配合Cocos2D-X

由于c++没有反射,CocosBuilder配合cocos2d-x比cocos2d繁琐。

  • 设置node的Custom Class,要为该类写loader,该loader继承自cocos2d::extension::CCXXXLoader
  • memberVar和menuItem的target可以是doc rootowner
  • 设置memberVar,会在load过称中调用target的onAssignCCBMemberVariable,即target要实现cocos2d::extension::CCBSelectorResolver
  • 设置menuItem的callback,会在load过称中调用target的onResolveCCBCCMenuItemSelector,即target要实现cocos2d::extension::CCBSelectorResolver

Case 1:ccb中的CCLayer关联代码中的GameLayer

  1. ccb中CCLayer设置Custom classGameLayer

  2. 代码中为GameLayer添加loader类class GameLayerLoader : public cocos2d::extension::CCLayerLoader,为该loader实现createCCNode()方法。 若在ccb中给该CCLayer设置了custom property,还得在loader类中实现相应的onHandlePropTypeXXX()方法。

  3. 在提供给CCBReader的CCNodeLoaderLibrary中注册loader对象

     auto loaderLibrary = cocos2d::extension::CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();
     loaderLibrary->registerCCNodeLoader(“GameLayer”, nodeLoader);            
  4. 代码中可选实现class GameLayer: public cocos2d::extension::CCNodeLoaderListener

  • 该过称繁杂,可写util函数,然后:

      auto layer = ccb::layer<GameLayer>(/*init params*/);

    如GameLayer含Custom Class子类CustomMenuItemImage,可用:

      auto loaderLibrary = ccb::defaultCCNodeLoaderLibrary<GameLayer, CCLayerLoader>();
      ccb::registerCCNodeLoader<CustomMenuItemImage, CCMenuItemImageLoader>(loaderLibrary);
      auto layer = ccb::layer<GameLayer>(loaderLibrary/*, other init params*/);

Case 2. ccb中的CCMenu关联代码GameLayer的buttonMenu

  1. ccb中CMenu设置Code connections:选Doc root varmemberVar

  2. 代码中class GameLayer : public cocos2d::extension::CCBMemberVariableAssigner,并实现:

     bool onAssignCCBMemberVariable(cocos2d::CCObject * pTarget, cocos2d::CCString * pMemberVariableName, cocos2d::CCNode * pNode) {
         CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "_buttonMenu", CCMenu *, _buttonMenu);
         return false;
     }

  • 可定义简化宏:

      #define CCB_MEMBER_VAR(__TYPE__, __VAR__) CCB_MEMBERVARIABLEASSIGNER_GLUE(this, #__VAR__, __TYPE__, __VAR__) 

    然后onAssignCCBMemberVariable()中可写

      CCB_MEMBER_VAR(CCMenu *, _buttonMenu);

Case 3:ccb中CCMenuItem调用代码GameLayer的buttonCallback

  1. ccb中的CCMenuItem设置:selectorbuttonCallbackTargetDocument root

  2. 代码中class GameLayer : public cocos2d::extension::CCBSelectorResolver,并实现:

     cocos2d::SEL_MenuHandler onResolveCCBCCMenuItemSelector(cocos2d::CCObject * pTarget, cocos2d::CCString * pSelectorName) {
         CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "buttonCallback", GameLayer::backButtonCallback);
         return NULL;
     }
     cocos2d::extension::SEL_CCControlHandler onResolveCCBCCControlSelector(cocos2d::CCObject * pTarget, cocos2d::CCString * pSelectorName) {
         return NULL;
     };

  • 可定义简化宏:

      #define CCB_CCMENUITEM_SELECTOR(__CLASS__, __FUNC__) CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, #__FUNC__, __CLASS__::__FUNC__)
      #define CCB_CCCONTROL_SELECTOR(__CLASS__, __FUNC__) CCB_SELECTORRESOLVER_CCCONTROL_GLUE(this, #__FUNC__, __CLASS__::__FUNC__)  

    然后onResolveCCBCCMenuItemSelector()中可写

      CCB_CCMENUITEM_SELECTOR(GameLayer, backButtonCallback);

参考