定义一个XXLoader的类,专门用来加载ccb资源。
---
class XXLoader
{
public:
/** load resource form ccbi */
static CCNode* loadFromCCBReader(const char* _CCBFileName,
CCObject* _owner,
CCBMemberVariableAssigner *_memberVariableAssigner = NULL,
CCBSelectorResolver *_selectorResolver = NULL,
CCNodeLoaderListener *_nodeLoaderListener = NULL);
};
CCNode* XXLoader::loadFromCCBReader(const char* _CCBFileName,
CCObject* _owner,
CCBMemberVariableAssigner *_memberVariableAssigner,
CCBSelectorResolver *_selectorResolver,
CCNodeLoaderListener *_nodeLoaderListener)
{
CCNodeLoaderLibrary* libary = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();
CCBReader* reader = new CCBReader(libary, _memberVariableAssigner, _selectorResolver, _nodeLoaderListener);
reader->setCCBRootPath("publish/");
libary->registerCCNodeLoader("XXTableView", XJTableViewLoader::loader());
libary->registerCCNodeLoader("XXEditBox", XJEditBoxLoader::loader());
CCNode* node = reader->readNodeGraphFromFile(_CCBFileName, _owner);
reader->autorelease();
return node;
}
---
其中可以注册一些自定义类,这些自定义类名字要在cocosbuilder当中设定到custom class字段中。比如
接下来说明如何映射在cocosbuilder中设定的变量名称:
如上图所示,nameInput这个控件需要设定为Owner var的属性,在我们读取ccb的自定义cclayer类中,继承了接口类CCBMemberVariableAssigner,类定义如下示例:
class LoginScene : public XJView
,public CCBMemberVariableAssigner
,public CCNodeLoaderListener
,public CCEditBoxDelegate
{
public:
virtual ~LoginScene();
CREATE_FUNC(LoginScene);
virtual bool init();
virtual void onEnter();
virtual void onExit();
virtual bool onAssignCCBMemberVariable(CCObject* pTarget, const char* pMemberVariableName, CCNode* pNode);
virtual void onNodeLoaded(CCNode * pNode, CCNodeLoader * pNodeLoader);
--------
其中实现
virtual bool onAssignCCBMemberVariable(CCObject* pTarget, const char* pMemberVariableName, CCNode* pNode);
virtual void onNodeLoaded(CCNode * pNode, CCNodeLoader * pNodeLoader);
来进行成员变量的绑定。举例绑定nameInput这个成员变量,具体实现如下:bool LoginScene::onAssignCCBMemberVariable(CCObject* pTarget, const char* pMemberVariableName, CCNode* pNode)
{
//实现绑定对应名字的变量
CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "nameInput", XJEditBox*, m_pNumberInput);
return false;
}
void LoginScene::onNodeLoaded(CCNode * pNode, CCNodeLoader * pNodeLoader)
{
//初始化获取自ccb得变量
if(pNode == m_pNumberInput)
{
//设置只能输入数字
m_pNumberInput->setInputMode(kEditBoxInputModeDecimal);
//设置输入最大长度
m_pNumberInput->setMaxLength(11);
//设置Delegate
m_pNumberInput->setDelegate(this);
m_pNumberInput->setPlaceHolder(StringManager::GetString(STR_XX_PLACEHOLDER)->getCString());
}
}
总之,通过可视化的资源编辑工具cocosbuilder,读取ccbi资源,节省ui布局的工作,同时辅助定义一些ui对象的实现;但是cocosbuilder工具控件类型比较少,有些需要的效果控件需要二次开发,或者自定义逻辑,之后会说明一个editbox输入框的二次修改,来满足项目中的需求。