由于c++没有反射,CocosBuilder配合cocos2d-x比cocos2d繁琐。
- 设置node的Custom Class,要为该类写loader,该loader继承自
cocos2d::extension::CCXXXLoader
- memberVar和menuItem的target可以是
doc root
或owner
- 设置memberVar,会在load过称中调用target的
onAssignCCBMemberVariable
,即target要实现cocos2d::extension::CCBSelectorResolver
- 设置menuItem的callback,会在load过称中调用target的
onResolveCCBCCMenuItemSelector
,即target要实现cocos2d::extension::CCBSelectorResolver
Case 1:ccb中的CCLayer关联代码中的GameLayer
ccb中CCLayer设置Custom class为GameLayer
代码中为GameLayer添加loader类
class GameLayerLoader : public cocos2d::extension::CCLayerLoader
,为该loader实现createCCNode()
方法。 若在ccb中给该CCLayer设置了custom property,还得在loader类中实现相应的onHandlePropTypeXXX()
方法。在提供给CCBReader的CCNodeLoaderLibrary中注册loader对象
auto loaderLibrary = cocos2d::extension::CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary(); loaderLibrary->registerCCNodeLoader(“GameLayer”, nodeLoader);
代码中可选实现
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
ccb中CMenu设置Code connections:选Doc root var填memberVar
代码中
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
ccb中的CCMenuItem设置:selector为buttonCallback,Target为Document root
代码中
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);