cocos3.x导出自定义类到Lua以及手动绑定要回调的函数

cocos3.x导出自定义类到Lua以及手动绑定要回调的函数,第1张

概述 1、安装必要的工具包和库,以及配置相关环境变量,按照../cocos2d-x 3.x/tools/tolua/README.mdown所说的安装,注意,              不同 *** 作系统有不同的安装内容。 2、写C++测试类(可以用../cocos2d-x-3x/tests/cpp-empty-test/Classes/HelloWorldScene.cpp作为测试类),在头文件中加入  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脚本 a、在../cocos2d-x 3.x/tools/tolua中找到genbindings.py文件复制一份,重命名为genbindings_hello.py b、修改脚本里面的生成路径以及命令参数 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_studio.ini' : ('cocos2dx_studio','lua_cocos2dx_studio_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 如果没什么问题的话会在生成目录里找到lua_hello_auto.cpp和lua_hello_auto.hpp文件,然后拖拽到我们的项目文件夹中。
6、编辑AppDelegate.cpp,添加lua_hello_auto.hpp头文件 然后加上 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函数的 *** 作。 由于引擎没有提供接口让我们可以把一个Lua函数注册给C++调用,所以我们要手动绑定。
HelloWorldScene.h(声明Lua函数所调用的ID)
private :
inthandleID;

HelloWorldScene.cpp
voIDHelloWorld::registerChangeScriptFunc(int onChangeCallback)
{
this->handleID
= onChangeCallback;
}

在menuCloseCallback()函数中添加:
autoengine =LuaEngine::getInstance()->getLuaStack(); engine->executeFunctionByHandler(handlerID,2); //通过Id调用Lua函数
在main.lua注册被调用的函数
hello:registerChangeScriptFunc(function () print("hello") end ) 现在还不能执行,这是因为Lua绑定时候没有把我们要回调的函数进行相应类型的转换,需要把Lua函数转换为整形ID值才能够提供给C++调用。
打开lua_hello_auto.cpp文件,找到
ok &= luaval_to_int32(tolua_S,2,(int*)&arg0); if(!ok) return0;
改为
arg0 = toluafix_ref_function(tolua_S,0);
找到此时Lua函数就被转换为int值能够提供给C++调用了。点击关闭按钮,就会看到”hello”输出了。


而在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(!toluafix_isfunction(tolua_S,"LUA_FUNCTION",0 ,&tolua_err)) {
goto
tolua_lerror;
}

LUA_FUNCTION
handler = (toluafix_ref_function(tolua_S,216); Font-family:Menlo">0
));
ScriptHandlerMgr::HandlerType
handlerType = (HandlerType)(int)HandlerType::EVENT_CUSTIOM
;
ScriptHandlerMgr::getInstance()->addobjectHandler((voID*) cobj,handler,handlerType);

其中,Lua_Function是在ccluaValue.h定义(typedefintLUA_FUNCTION);其实就是int类型。 接下来就是定义回调函数的类型,我们这里设置的是EVENT_CUSTIOM类型。 然后就把它添加到管理器中,第一个参数是调用对象,第二个是函数句柄ID,第三个是定义的类型。
然后Lua注册函数跟上述一样,我们看看C++要怎么调用 同样menuCloseCallback()函数中添加:
autoengine =LuaEngine::getInstance ();
EventCustom
value("HelloCallback"
);
BasicScriptData
data(this,162)">voID
*)& value);
engine->handleEvent(EVENT_CUSTIOM,162)">voID
*)&data);


其中,EventCustom实例化对象用来传入Userdata,BasicScriptData第一个参数是事件所绑定的对象,第二个是传入的UserData,最后一句是来通过LuaEngine发送Event事件,执行lua函数。
至此,手动绑定Lua函数就大功告成了。 总结

以上是内存溢出为你收集整理的cocos3.x导出自定义类到Lua以及手动绑定要回调的函数全部内容,希望文章能够帮你解决cocos3.x导出自定义类到Lua以及手动绑定要回调的函数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1068496.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存