在cocos2d-x Lua开发过程中,有时候会遇到自己的类需要调用Lua的方法,也就是说在c++类文件中,执行Lua的方法,可是直接在c++类里,设置LUA_FUNCTION回调方法,会导致genbindings.py出现error,这主要是由于需要引用lua.h文件,象下面这样(基于上篇的lua调用c++编译):
添加新的自定义类文件
新建CESprite.h,CESprite.cpp文件,新建内容如下:
// 添加头文件 class CESprite :public cocos2d::Sprite { public: static CESprite* createWithData(const std::string& file); virtual void onEnter(); };CESprite.cpp:
// 添加头文件 "CESprite.h" // 添加头文件"scripting/lua-bindings/manual/CCLuaEngine.h" using namespace cocos2d; CESprite* CESprite::createWithData(const std::string& file) { CESprite* sp = new CESprite(); sp->initWithFile(file); sp->autorelease(); return sp; } void CESprite::onEnter() { Sprite::onEnter(); // 执行回调 }
添加Lua回调方法
修改代码如下:
class CESprite :public cocos2d::Sprite { public: static CESprite* createWithData(const std::string& file); virtual void onEnter(); void setLuaHandler(LUA_FUNCTION handler); private: LUA_FUNCTION handler; };运行genbindings.py,报错,出现lua.h找不到,可能有的朋友们,尝试将LUA_FUNCTION改成int,genbindings.py此时也能成功,但是运行后会出现nil value错误,Lua下面这样的调用:
local function cpp_call(msg) print("cpp_call") print(msg) end local sp = CESprite:createWithData("res/diamond3.png") sp:setLuaHandler(cpp_call)
运行报错,怎么办?修改生成的lua_coolexp_auto.cpp里的setLuaHandler方法把arg0的获取修改成这样:
LUA_FUNCTION arg0 = toluafix_ref_function(tolua_S, 2, 0);运行,成功,并获取预期结果,可是还有问题,每个都会自动生成,每次都要去个性,太麻烦了,有没有更好的解决方法呢?答案是有,我们编写自己的manual,这里面我们可以参考cocos2d_manual.cpp.
添加动态的Lua方法,新建自己的lua_coolexp_manual.hpp文件
- 去掉设置setLuaHandler的回调方法
class CESprite :public cocos2d::Sprite { public: static CESprite* createWithData(const std::string& file); virtual void onEnter(); };
添加执行回调Lua方法:
CESprite.cpp:
// 添加头文件 "CESprite.h" // 添加头文件"scripting/lua-bindings/manual/CCLuaEngine.h" using namespace cocos2d; CESprite* CESprite::createWithData(const std::string& file) { CESprite* sp = new CESprite(); sp->initWithFile(file); sp->autorelease(); return sp; } void CESprite::onEnter() { Sprite::onEnter(); // 执行回调 LUA_FUNCTION handler = ScriptHandlerMgr::getInstance()->getObjectHandler((void*)this, ScriptHandlerMgr::HandlerType::EVENT_CUSTIOM); if (handler != 0) { // 第一种调用方法 cocos2d::CommonScriptData data(handler, "Hello Lua"); cocos2d::ScriptEvent scriptEvent(cocos2d::kCommonEvent, &data); cocos2d::LuaEngine::getInstance()->sendEvent(&scriptEvent); // 第二种调用方法 cocos2d::LuaEngine::getInstance()->getLuaStack()->clean(); cocos2d::LuaEngine::getInstance()->getLuaStack()->pushString("From CPP call lua"); cocos2d::LuaEngine::getInstance()->getLuaStack()->executeFunctionByHandler(handler, 1); cocos2d::LuaEngine::getInstance()->getLuaStack()->clean(); } }Lua的文件,就是上面的不变,可以添加在MainScene.lua里 * 在scripting目录下添加lua_coolexp_manual.hpp,lua_coolexp_manual.cpp文件,文件参考下载[@下载参考文件](data/lua_coolexp_manual.zip),具体的内容就不说明了。应该都能看得懂 * 最后在AppDelegate.cpp添加如下代码,注意顺序不要错了
//register custom function //LuaStack* stack = engine->getLuaStack(); register_all_coolexp(stack->getLuaState()); // 第一步 register_all_coolexp_manual(stack->getLuaState());// 第二步
- 项目结构如下: