cocos2dx lua 3.10以上版本的回调函数绑定

来源:  点击打开链接

1、安装必要的工具包和库,以及配置相关环境变量,按照../cocos2d-x 3.x/tools/tolua/README.mdown所说的安装,注意,              不同操作系统有不同的安装内容。

2、写C++测试类(可以用../cocos2d-x-3x/tests/cpp-empty-test/Classes/HelloWorldScene.cpp作为测试类),在头文件中加入
     void registerChangeScriptFunc(int onChangeCallback);
   在后面手动绑定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头文件
      然后加上
      auto engine = 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 :
   
 int handleID;

HelloWorldScene.cpp

void HelloWorld::registerChangeScriptFunc(int  onChangeCallback)
{
   
 this->handleID 
= onChangeCallback;
}

在menuCloseCallback()函数中添加:

auto engine = 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)
                                                 return 0;

改为

arg0 = toluafix_ref_function(tolua_S,2,0);

找到此时Lua函数就被转换为int值能够提供给C++调用了。点击关闭按钮,就会看到”hello”输出了。



而在Cocos-2dx 3.0中,Lua回调使用了ScriptHandlerMgr新的机制,通过创建C++对象,HandlerType和lua函数(handlerID)一一对应的映射关系,应用ScriptHandlerMgr进行统一管理。
接下来我们看看如何使用ScriptHandlerMgr:

我们已经使用tolua导出自定义类了, void registerChangeScriptFunc(int onChangeCallback)对应lua_hello_auto.cpp中的int lua_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, 2, "LUA_FUNCTION", 0 , &tolua_err)) {
           
 goto 
tolua_lerror;
        }
       
LUA_FUNCTION
 handler = (toluafix_ref_function(tolua_S, 2, 0
));
ScriptHandlerMgr::HandlerType
 handlerType = (ScriptHandlerMgr::HandlerType)(int)ScriptHandlerMgr::HandlerType::EVENT_CUSTIOM
;
ScriptHandlerMgr::getInstance()->addObjectHandler((void*) cobj, handler, handlerType);

其中,Lua_Function是在CCLuaValue.h定义(typedef int LUA_FUNCTION);其实就是int类型。
接下来就是定义回调函数的类型,我们这里设置的是EVENT_CUSTIOM类型。
然后就把它添加到管理器中,第一个参数是调用对象,第二个是函数句柄ID,第三个是定义的类型。

然后Lua注册函数跟上述一样,我们看看C++要怎么调用
同样menuCloseCallback()函数中添加:

auto engine = LuaEngine::getInstance ();
EventCustom
 value("HelloCallback"
);
BasicScriptData
 data(this, (void
*)& value);
engine->handleEvent(ScriptHandlerMgr::HandlerType::EVENT_CUSTIOM, (void*)&data);


其中,EventCustom实例化对象用来传入Userdata,BasicScriptData第一个参数是事件所绑定的对象,第二个是传入的UserData,最后一句是来通过LuaEngine发送Event事件,执行lua函数。

至此,手动绑定Lua函数就大功告成了。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值