定義一個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輸入框的二次修改,來滿足項目中的需求。