• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

cocos2d-x3.0在C++中调用lua函数

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

代码用的是<cocos2d-x 3.0 在lua中调用自定义类>中的代码. 

在上篇的基础上进行扩充.

写lua函数

local function process_packet(user_data)
    if user_data then
        user_data = tolua.cast(user_data, "user_data");
        print (user_data:uid());
        print (user_data:uname());
    end
end

local ghall = hall:get_singleton_ptr();
ScriptHandlerMgr:getInstance():registerScriptHandler(tolua.cast(ghall, "cc.Ref"), process_packet, cc.Handler.CALLFUNC);
View Code

在C++添加对此函数的调用

void hall::process_packet()
{
    auto engine = cocos2d::LuaEngine::getInstance();

    user_data    ud("kukudi", 10001);
    cocos2d::BasicScriptData    scriptdata(this, &ud);
    cocos2d::ScriptEvent    eve(cocos2d::ScriptEventType::kCallFuncEvent, &scriptdata);
    engine->sendEvent(&eve);
}
View Code

执行结果, 输出1001 kukudi

我遇到一些问题在此记录一下
1. user_data, 这个要传到lua函数中的数据对象必须继续自cocos2d::Ref类, (当然了, 继续自Ref的子类也可以的), 否则程序会崩溃, 因为在int LuaEngine::handleCallFuncActionEvent(void* data)里面有这样一句话:Ref* target = static_cast<Ref*>(basicScriptData->value);可以看出来, 它的父类必须是Ref类.
2. user_data, 想要直接使用成员对象是不行的, 我之前将成员对象设置成public, 想在脚本中直接对成员对象直接操作, 后来发现lua_hall_auto.cpp文件中根本没有对这些成员对象进行转换, 所以得把它封装起来, 用成员函数对其成员对象进行操作.
3. 如果要调用多个脚本函数怎么办呢? 我发现cc.Handler.CALLFUNC只能指定一个脚本函数, 再指定其它的脚本函数必须得用另一个handletype值, 还有就是这个cc.Handler.CALLFUNC这个对象的脚本函数只能使用一个参数或者不使用参数, 关于这方面的应用我还没有研究很深, 就目前看来, 只能调用一个函数, 并且函数只能有一个参数, 这就够用了, 在此lua函数中做分支来分派给其它的脚本函数来处理数据, 至于传入到lua函数中的数据只要继承自Ref这个类, 多写几个不同的对象也是可以的, 这个没有什么大的问题;
4. 有一个比较困惑, int ScriptHandlerMgr::getObjectHandler(void* object,ScriptHandlerMgr::HandlerType handlerType)在这个函数, 每个lua_function对应一个唯一的handletype, 那为什么这个里面还要使用for循环来遍历呢? 为什么不将handletype & lua_function作map映射呢?

5. 在lua中调用tolua.cast(obj, "hall"); 转换成自定义的类型时会出现Cast name user_data doesn't include modular name which it belongs to,please add the modular name这样的信息, 不用理它; 如果你跟踪源代码会发现像Ref这样的类是这样对应的Ref:cc.Ref, 我自己定义的类没有这些模块, 所以不用理它, 它也就是一个提示信息, 而已


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
c#读取ACCESS数据库发布时间:2022-07-14
下一篇:
C++算术表达式求解发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap