cocos2d-x 3.0 在C++中调用lua函数
代码用的是<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);
在C++添加对此函数的调用
void hall::process_packet()
{
auto engine = cocos2d::LuaEngine::getInstance(); user_data ud("kukudi", );
cocos2d::BasicScriptData scriptdata(this, &ud);
cocos2d::ScriptEvent eve(cocos2d::ScriptEventType::kCallFuncEvent, &scriptdata);
engine->sendEvent(&eve);
}
执行结果, 输出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, 我自己定义的类没有这些模块, 所以不用理它, 它也就是一个提示信息, 而已
cocos2d-x 3.0 在C++中调用lua函数的更多相关文章
- cocos2d-x 3.0 在C++中调用lua函数(2)
个人觉得3.0里面, 在C++下面调用lua函数很不方便, 所以就扩展了一个类, 继承自LuaStack, 代码和使用方式如下: #ifndef __CC_LUA_STACKEX_H_ #define ...
- C中调用Lua函数
我们先来看一个简单的例子: lua_State* L = NULL; // 内部调用lua函数 double f(double x, double y) { double z; lua_getglob ...
- vs如何在C++中调用Lua
最近Cocos2dx的学习卡壳了,一般的照抄代码我不想写上来,但想示例也想得我头晕...为了放松大脑调整状态于是开始学习Lua.Lua的语法学习还是比较简单的,学过javascript或者vbscri ...
- 关于在C#中构造函数中调用虚函数的问题
在C#中如果存在类的继承关系,应避免在构造函数中调用虚函数.这是由于C#的运行机制造成的,原因如下: 新建一个类实例时,C#会先初始化该类(对类变量赋值,并将函数记在函数表中),然后再初始化父类.构造 ...
- vs2013如何在C++中调用Lua(二)
Lua学习笔记 vs2013如何在C++中调用Lua (此为转载教程) 本人试过完全可行 一.准备工作 1.下载Lua源码,地址:http://www.lua.org/download.html(我用 ...
- C++ 构造函数中调用虚函数
我们知道:C++中的多态使得可以根据对象的真实类型(动态类型)调用不同的虚函数.这种调用都是对象已经构建完成的情况.那如果在构造函数中调用虚函数,会怎么样呢? 有这么一段代码: class A { p ...
- C++箴言:避免构造或析构函数中调用虚函数
如果你已经从另外一种语言如C#或者Java转向了C++,你会觉得,避免在类的构造函数或者析构函数中调用虚函数这一原则有点违背直觉.但是在C++中,违反这个原则会给你带来难以预料的后果和无尽的烦恼. 正 ...
- 如何给ioloop.run_sync()中调用的函数传入参数
问题 如何给tornado.ioloop.IOLoop中的run_sync方法中调用的函数添加参数 解决方案 使用functools.partial 解决示例 from tornado import ...
- 在构造函数和析构函数中调用虚函数------新标准c++程序设计
在构造函数和析构函数中调用虚函数不是多态,因为编译时即可确定调用的是哪个函数.如果本类有该函数,调用的就是本类的函数:如果本类没有,调用的就是直接基类的函数:如果基类没有,调用的就是间接基类的函数,以 ...
随机推荐
- js 实现遮罩某一部分
借用一下喜马拉雅的效果图,比较一下下面的遮罩层的高度: 我们可以看到它的遮罩层一直都是只遮住的下面.开始想着怎么用CSS实现,几经测试也没弄出来,如果正在看这篇文章的你,知道如何用CSS达 ...
- css布局你该了解的
记录一下: static :默认值:默认布局. fixed :固定定位:类似于absolute,但不随着滚动条的移动而改变位置. float: 给元素的float属性赋值后,就是脱离文档流,进行左右浮 ...
- MinGW下编译openssl, json-c
目的:在windows环境下,编译开源库openssl 环境:windows 10 ,Mingw及自带msys工具,openssl-1.0.2j 工具主要使用MinGW(含msys1.0), IDE选 ...
- dd&win32diskimager&软碟通Ultraiso 简单分析区别和长处
在linux操作系统之中的话我们希望烧录镜像到U盘或者是其他的可移动存储设备的话,那么我们就是应当使用dd,但是我估量 在我们的论坛之中根本 之上只有很少的人使用这种工具,很多的使用linux的用户都 ...
- visual studio code 写c++代码
首先安装c++插件: 安装 LLVM clang 下载地址:http://releases.llvm.org/ 解决方法:点击黄色灯泡 进入 c_cpp_properties.json文件, 在 pa ...
- SpringMVC系列(三):REST风格
一.什么叫REST REST:即 Representational State Transfer.(资源)表现层状态转化.是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所 ...
- Maven项目模板
maven 使用 Archetype 概念为用户提供不同类型的项目模板,它是一个非常大的列表(614个数字). maven 使用下面的命令来帮助用户快速开始构建一个新的 Java 项目. mvn ar ...
- Tomcat的Admin和Manager工具初探
版本说明 apache-tomcat-5.5.28.zip(解压缩版) Manager工具是自带的,Admin工具apache-tomcat-5.5.28-admin.zip需要单独安装 下载地址:h ...
- 聊一聊PV和并发、以及计算web服务器的数量的方法
聊一聊PV和并发.以及计算web服务器的数量的方法 http://www.chinaz.com/web/2016/0817/567752.shtml 最近和几个朋友,聊到并发和服务器的压力问题.很多朋 ...
- 一款CSS3仿Google Play的垂直菜单
之前分享过一款非常酷的CSS3垂直下拉动画菜单,是多级菜单.今天我们来看一款也是用CSS3制作的垂直菜单,是仿Google Play的菜单,菜单项都带有可爱的小图标,可以先来看看效果图: 当然你可以在 ...