cocos2d-x+lua+cocosbuilder+luaproxy开发中遇到的读取子node以及事件绑定问题

转自:http://blog.csdn.net/zhuangyou123/article/details/8954758

1,在用luaproxy开发时,会操作node里的menuItem,controlbutton,并实现在lua里实现其对应的selector。遇到的问题如下

一,通过node名字读取子node的问题
建立一个cocos2d-x工程,把luaproxy源码加进去,在lua里加载ccbi文件,
原作者给的例子是
local tempProxy = CCBProxy:create()
local startLayer = tempProxy:readCCBFromFile("StartLayer.ccbi")
startlayer可以使用,没问题,但是在用过tempProxy加载startLayer里的控件,label等子node时
local testnode = tolua.cast(tempProxy:getNode"testlabel","CCLabelTTF")
这时候会发现testnode为nil,而且在cocosbuilder里的编辑都是正确的
后来通过调试发现ccbproxy构造了两次,第一个实例用来加载ccbi文件,在加载ccbi中产生的另一个实例才是我们需要的那个,就是代码中的startlayer

解决的方案如下

local tempProxy = CCBProxy:create()
local proxy = tempProxy:readCCBFromFile("StartLayer.ccbi")
local startLayer = tolua.cast(proxy,"CCBProxy")
修改后 通过startlayer来读取子node就对了
2,在lua里实现按钮回调的bug
startLayer:handleButtonEvent(btn,
        function( s,e )
         end
     ,0)


在脚本里实现回调有时候会出现崩溃的问题,但不是必现的,调试了大半天,发现在LuaEventHandler.cpp里,有一段代码

LuaEventHandler * LuaEventHandler::create(lua_State *l){
	LuaEventHandler *h = new LuaEventHandler();
	h->_lua = l == NULL? luaStateForEngine() : l;
	h->autorelease();
	return h;
}

发现有时候传进来的lua_state是null,作者也做了处理,但是这个处理导致了有时候会崩溃的bug
解决如下

LuaEventHandler * LuaEventHandler::create(lua_State *l){
	LuaEventHandler *h = new LuaEventHandler();
	h->_lua = luaStateForEngine();//l == NULL? luaStateForEngine() : l;
	h->autorelease();
	return h;
}

这样就不会崩溃了

===============

题外,原代码CCBProxy在新的cocos2dx里有些不兼容,会出现nodeLoader 注册问题

assert(ccNodeLoadersIterator != this->mCCNodeLoaders.end());

 修改头文件如下
在头文件最后加载如下代码

class CCBProxyLoader: public CCLayerLoader {
    
    
public:
    virtual bool init(){return true;}
    CCB_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(CCBProxyLoader, loader);
    CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(CCBProxy);
};
在CCBProxy.cpp里
CCScene * CCBProxy::sceneReadCCBFromFile(const char *f, float resolutionScale)
{
    //assert(f && strlen(f) > 0, "File name must not be null or empty string.");
	CCNodeLoaderLibrary * lib = CCNodeLoaderLibrary::sharedCCNodeLoaderLibrary();
	//lib->registerCCNodeLoader("CCParticleSystemQuad", ProxyPSQLoader::loader());
	CCBReader * reader = new CCBReader(lib);
	reader->autorelease();
#if COCOS2D_VERSION < 0x00020100
	reader->hasScriptingOwner = true;
#endif
    lib->registerCCNodeLoader("CCBProxy", CCBProxyLoader::loader());
	CCScene *node = reader->createSceneWithNodeGraphFromFile(f);
	CCBAnimationManager *m = reader->getAnimationManager();
	node->setUserObject(m);
	return node;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值