cocos2d-x lua分支加载ccbi文件
来源:互联网 发布:office2016 mac 破解版 编辑:程序博客网 时间:2024/05/16 07:08
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方法 }}
头文件什么的就不提供了,想要正常运行还要实现以下registerCCBIMember 这个方法,这点就不用说了吧.
贴出lua代码(主要代码)
hello.lua
require "Utils"require "first"require "second"sceneGame = CCScene:create()function main() loader = CCBIFactory:create() node = loader:loadCCBI(sceneGame, "first.ccbi", "GameUILoader") sceneGame:addChild(node) CCDirector:sharedDirector():runWithScene(sceneGame)endxpcall(main, __G__TRACKBACK__)
second.lua
function second_change_onClicked() node:removeFromParentAndCleanup(true) local loader = CCBIFactory:create() node = loader:loadCCBI(sceneGame, "first.ccbi", "GameUILoader") sceneGame:addChild(node) return 0endfunction second_text_onClicked() second_text:setString("test") return 0endfunction set_second_text(obj) second_text = objend
- cocos2d-x lua分支加载ccbi文件
- cocos2d-x lua分支加载ccbi文件
- cocos2d-x lua 调用ccbi
- (三)cocos2d-x中通过lua脚本使用ccbi
- 不同版本cocos2d-x的CCB/CCBI加载器研究
- 加载CCBI
- cocos2d-x-lua-加载官方test项目
- cocos2dx-lua 加载和绑定ccbi 中对象
- cocos2d-x-LuaProxy学习日志(3) -- 绑定ccbi 常用控件
- cocos2d-x加载 csb 文件
- cocos2d-x的lua脚本如何加载Cocostudio制作的UI文件
- Mac下使用Cocos2d-x Lua加载Cocos Studio到处的Json文件和动画
- quick-cocos2d-x(lua) 文件拷贝操作
- quick cocos2d-x lua解析json文件
- cocos2d-x(quick-lua)读取csv文件
- cocos2d-x 3.6 lua文件加密
- 【cocos2d-x 3.x 学习与应用总结】2: 在cocos2d-x中使用ccbi
- Lua增加ccbi
- 2013年互联网十大趋势
- CSS3模拟checkbox
- Android 4.0 自定义锁屏
- 电脑开机出现 To interrupt normal post,press enter 处理办法
- 贝尔宾团队角色理论
- cocos2d-x lua分支加载ccbi文件
- 详解C中volatile关键字
- Aptana导入github.com的项目
- 【转载】软件工程知识体系全景图
- Android电源管理之三:PowerManager.WakeLock源码详读
- blob字段类型
- List of Game enging form wiki
- 嵌入式工程师经典面试题(转载...)
- linux-0.11调试教程,con_init函数和右上角的EGAc