您好,登錄后才能下訂單哦!
cocos2d-x lua的分支竟然沒(méi)有提供擴(kuò)展包里面的類,苦大了我們啊,經(jīng)過(guò)各種嘗試摸索,終于OK
- CCNode* CCBIFactory::loadCCBI(CCScene *pScene, char* ccbiPath, char* loaderName){
- CCNodeLoaderLibrary * ccNodeLoaderLibrary = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();
- CCNodeLoader*nodeLoader = GameUILoader::loader();
- ccNodeLoaderLibrary->registerCCNodeLoader(loaderName, nodeLoader);
- CCBReader * ccbReader = new CCBReader(ccNodeLoaderLibrary);
- CCNode * node = ccbReader->readNodeGraphFromFile(ccbiPath, this);
- ccbReader->autorelease();
- return node;
- }
在下面就是CCBI所映射的類了,在C++中一個(gè)ccbi是對(duì)應(yīng)著一個(gè)類存在的,里面包含了所有控件回調(diào)的注冊(cè),實(shí)例是在解析ccbi文件的時(shí)候創(chuàng)建的,如果要用C++ lua 的情況下肯定不能為每個(gè)ccbi都創(chuàng)建一個(gè)類,所以就需要一個(gè)通用格式的類定義,需要解決的問(wèn)題有一下幾點(diǎn)
1、要把所有可點(diǎn)擊控件的點(diǎn)擊事件轉(zhuǎn)到lua的函數(shù)中,在回調(diào)里目前無(wú)法獲取到被點(diǎn)擊對(duì)象的標(biāo)識(shí),換句話說(shuō),根本不知道哪個(gè)控件點(diǎn)擊的,C++中是根據(jù)不同的回調(diào)函數(shù)來(lái)區(qū)分的,但是要在頭文件中把相應(yīng)方法定義好,既然要通用,肯定不能確定該有多少個(gè)控件,這步就卡這了。我們的解決方案是把所有的控件全部在onAssignCCBMemberVariabl
2、成員變量綁定的控件要導(dǎo)出到lua中,這點(diǎn)也挺惡心,因?yàn)椴恢烙卸嗌賯€(gè),不能直接在頭文件定義,而且還獲取不到控件類型。解決方法喝上一步差不多,我們是在所有這種控件的名字后面加上 -類型 比如:second_text-CCLabelTTF ,然后程序也是在onAssignCCBMemberVariabl
廢話不多說(shuō)了,上代碼:
- #include "GameUILayer.h"
- #include "CCLuaEngine.h"
- USING_NS_CC;
- USING_NS_CC_EXT;
- using namespace std;
- void GameUILayer::onNodeLoaded(cocos2d::CCNode * pNode, cocos2d::extension::CCNodeLoader * pNodeLoader) {
- }
- SEL_MenuHandler GameUILayer::onResolveCCBCCMenuItemSelector(CCObject * pTarget, CCString * pSelectorName) {
- return NULL;
- }
- SEL_CCControlHandler GameUILayer::onResolveCCBCCControlSelector(CCObject * pTarget, CCString * pSelectorName) {
- string name = pSelectorName->getCString(); // 控件名字
- CCB_SELECTORRESOLVER_CCCONTROL_GLUE(this, name.c_str(), GameUILayer::onClicked);
- return NULL;
- }
- bool GameUILayer::onAssignCCBMemberVariable(CCObject * pTarget, CCString * pMemberVariableName, CCNode * pNode) {
- CCNode *button = NULL;
- string name = pMemberVariableName->getCString();
- XIAOLEI_CCB_MEMBERVARIABLEASSIGNER_GLUE(this, name.c_str(), CCNode *, button);
- int index = name.find_first_of('-', 0);
- if (index != string::npos)
- {
- char* funcName = (char*) (("set_" + name.substr(0,index)).c_str());
- char* typeName = (char*) name.substr(index+1).c_str();
- CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();
- pEngine->registerCCBIMember(funcName, button, typeName); // 這個(gè)函數(shù)是我們改動(dòng)cocos2d源碼增加的,很簡(jiǎn)單就是調(diào)用lua的函數(shù)并且傳過(guò)去一個(gè)CCObject的對(duì)象作為參數(shù)
- }
- objectNameMapping.insert(map<int, string>::value_type(button->m_uID, name)); // 注冊(cè)m_uid和控件名的綁定
- return false;
- }
- void GameUILayer::onClicked(CCObject * pSender, cocos2d::extension::CCControlEventpCCControlEvent) {
- // 所有控件統(tǒng)一注冊(cè)這一個(gè)回調(diào)函數(shù)
- map<int, string>::iterator iter = objectNameMapping.find(pSender->m_uID);
- if(iter != objectNameMapping.end())
- {
- CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();
- pEngine->executeGlobalFunction((iter->second+"_onClicked").c_str()); // 根據(jù)控件名調(diào)用相應(yīng)的lua方法
- }
- }
頭文件什么的就不提供了,想要正常運(yùn)行還要實(shí)現(xiàn)以下CCLuaEngine::
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。