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

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;
}




你可能感兴趣的:(IOS开发,cocos2d-x)