您好,登录后才能下订单哦!
cocos2d-x lua的分支竟然没有提供扩展包里面的类,苦大了我们啊,经过各种尝试摸索,终于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++中一个ccbi是对应着一个类存在的,里面包含了所有控件回调的注册,实例是在解析ccbi文件的时候创建的,如果要用C++ lua 的情况下肯定不能为每个ccbi都创建一个类,所以就需要一个通用格式的类定义,需要解决的问题有一下几点
1、要把所有可点击控件的点击事件转到lua的函数中,在回调里目前无法获取到被点击对象的标识,换句话说,根本不知道哪个控件点击的,C++中是根据不同的回调函数来区分的,但是要在头文件中把相应方法定义好,既然要通用,肯定不能确定该有多少个控件,这步就卡这了。我们的解决方案是把所有的控件全部在onAssignCCBMemberVariabl
2、成员变量绑定的控件要导出到lua中,这点也挺恶心,因为不知道有多少个,不能直接在头文件定义,而且还获取不到控件类型。解决方法喝上一步差不多,我们是在所有这种控件的名字后面加上 -类型 比如:second_text-CCLabelTTF ,然后程序也是在onAssignCCBMemberVariabl
 
废话不多说了,上代码:
- #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); // 这个函数是我们改动cocos2d源码增加的,很简单就是调用lua的函数并且传过去一个CCObject的对象作为参数
 - }
 - objectNameMapping.insert(map<int, string>::value_type(button->m_uID, name)); // 注册m_uid和控件名的绑定
 - return false;
 - }
 - void GameUILayer::onClicked(CCObject * pSender, cocos2d::extension::CCControlEventpCCControlEvent) {
 - // 所有控件统一注册这一个回调函数
 - 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()); // 根据控件名调用相应的lua方法
 - }
 - }
 
头文件什么的就不提供了,想要正常运行还要实现以下CCLuaEngine:: 
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。