1、安装必要的工具包和库,以及配置相关环境变量,按照../cocos2d-x 3.x/tools/tolua/README.mdown所说的安装,注意, 不同操作系统有不同的安装内容。
2、写C++测试类(可以用../cocos2d-x-3x/tests/cpp-empty-test/Classes/HelloWorldScene.cpp作为测试类),在头文件中加入
voidregisterChangeScriptFunc(intonChangeCallback);
在后面手动绑定Lua函数用到
3、写Python脚本
output_dir = '%s/cocos/scripting/lua-bindings/auto' % project_root
然后把
cmd_args = {'cocos2dx.ini' : ('cocos2d-x','lua_cocos2dx_auto'),\
'cocos2dx_extension.ini' : ('cocos2dx_extension','lua_cocos2dx_extension_auto'),\
'cocos2dx_ui.ini' : ('cocos2dx_ui','lua_cocos2dx_ui_auto'),\
'cocos2dx_spine.ini' : ('cocos2dx_spine','lua_cocos2dx_spine_auto'),\
'cocos2dx_physics.ini' : ('cocos2dx_physics','lua_cocos2dx_physics_auto'),\
}
改成
cmd_args = {'hello.ini' : ('hello','lua_hello_auto') }
“hello.ini” 是接下来要写的文件
4、写ini文件
跟写python脚本一样,复制一份cocos2dx.ini,重命名为hello.ini
然后按照下面改动文件
[hello]
prefix = hello
target_namespace =
headers = %(cocosdir)s/tests/cpp-empty-test/Classes/HelloWorldScene.h
classes = HelloWorld
skip =
abstract_classes =
至于里面的其它参数自己可以去研究,这里就不多说了
5、执行py文件
cd到tolua文件夹下,输入命令
python genbindings_hello.py
然后加上
autoengine =LuaEngine::getInstance();
register_all_hello(engine->getLuaStack()->getLuaState());
进行注册
7、编译运行,这样我们就把HelloWorld类导入到Lua了。
在我们的Lua文件main.lua中加入
local hello = HelloWorld:create()
local sceneGame = cc.Scene:create()
sceneGame:addChild(hello)
…
再次运行出现HelloWorld就表示导出成功
---------------------------------------------------
接下来是手动绑定Lua函数的操作。
private
:
inthandleID;
inthandleID;
HelloWorldScene.cpp
voidHelloWorld::registerChangeScriptFunc(int
onChangeCallback)
{
this->handleID = onChangeCallback;
}
{
this->handleID = onChangeCallback;
}
autoengine =LuaEngine::getInstance()->getLuaStack();
engine->executeFunctionByHandler(handlerId,2); //通过Id调用Lua函数
hello:registerChangeScriptFunc(function ()
print("hello")
end
)
打开lua_hello_auto.cpp文件,找到
ok &= luaval_to_int32(tolua_S,2,(int*)&arg0);
if(!ok)
return0;
改为
arg0 = toluafix_ref_function(tolua_S,0);
而在Cocos-2dx 3.0中,Lua回调使用了ScriptHandlerMgr新的机制,通过创建C++对象,HandlerType和lua函数(handlerID)一一对应的映射关系,应用ScriptHandlerMgr进行统一管理。
接下来我们看看如何使用ScriptHandlerMgr:
我们已经使用tolua导出自定义类了,voidregisterChangeScriptFunc(intonChangeCallback)对应lua_hello_auto.cpp中的intlua_hello_HelloWorld_registerChangeScriptFunc(lua_State* tolua_S)函数
然后把
ok &= luaval_to_int32(tolua_S,2,(int
*)&arg0);
if (!ok)
return 0;
if (!ok)
return 0;
改成
if(!toluafix_isfunction(tolua_S,"LUA_FUNCTION",0
,&tolua_err)) {
goto tolua_lerror;
}
LUA_FUNCTIONhandler = (toluafix_ref_function(tolua_S,216); font-family:Menlo">0 ));
ScriptHandlerMgr::HandlerTypehandlerType = (HandlerType)(int)HandlerType::EVENT_CUSTIOM ;
ScriptHandlerMgr::getInstance()->addObjectHandler((void*) cobj,handler,handlerType);
goto tolua_lerror;
}
LUA_FUNCTIONhandler = (toluafix_ref_function(tolua_S,216); font-family:Menlo">0 ));
ScriptHandlerMgr::HandlerTypehandlerType = (HandlerType)(int)HandlerType::EVENT_CUSTIOM ;
ScriptHandlerMgr::getInstance()->addObjectHandler((void*) cobj,handler,handlerType);
其中,Lua_Function是在CCLuaValue.h定义(typedefintLUA_FUNCTION);其实就是int类型。
接下来就是定义回调函数的类型,我们这里设置的是EVENT_CUSTIOM类型。
autoengine =LuaEngine::getInstance
();
EventCustomvalue("HelloCallback" );
BasicScriptDatadata(this,162)">void *)& value);
engine->handleEvent(EVENT_CUSTIOM,162)">void*)&data);
EventCustomvalue("HelloCallback" );
BasicScriptDatadata(this,162)">void *)& value);
engine->handleEvent(EVENT_CUSTIOM,162)">void*)&data);
其中,EventCustom实例化对象用来传入Userdata,BasicScriptData第一个参数是事件所绑定的对象,第二个是传入的UserData,最后一句是来通过LuaEngine发送Event事件,执行lua函数。
至此,手动绑定Lua函数就大功告成了。