cocos2d-x 3.0 在C++中调用lua函数(2)
个人觉得3.0里面, 在C++下面调用lua函数很不方便, 所以就扩展了一个类, 继承自LuaStack, 代码和使用方式如下:
#ifndef __CC_LUA_STACKEX_H_
#define __CC_LUA_STACKEX_H_ #include "CCLuaStack.h" NS_CC_BEGIN class LuaStackEx : public LuaStack
{
public: void call_script_fun(const char* fun)
{
executeGlobalFunction(fun);
} template<typename... Args>
void call_script_fun(const char* fun, Args... args)
{
lua_getglobal(_state, fun); /* query function by name, stack: function */
if (!lua_isfunction(_state, -))
{
CCLOG("[LUA ERROR] name '%s' does not represent a Lua function", fun);
lua_pop(_state, );
return;
} int args_amount = ;
split_args(args_amount, args...);
executeFunction(args_amount);
} protected:
template<typename T>
void split_args(int &args_amount, T data)
{
push_data(data);
args_amount++;
} template<typename T, typename... Args>
void split_args(int &args_amount, T data, Args... args)
{
push_data(data);
args_amount++;
split_args(args_amount, args...);
} protected:
template<typename T>
void push_data(T data)
{
CCLOG("存在未定义类型的数据, 无法传参到lua脚本.");
} template<> void push_data(int data) { pushInt(data); }
template<> void push_data(long data) { pushLong(data); }
template<> void push_data(float data) { pushFloat(data); }
template<> void push_data(std::string str) { pushString(str.c_str()); }
template<> void push_data(const std::string& str) { pushString(str.c_str()); }
template<> void push_data(const char* str) { pushString(str); }
template<> void push_data(bool data) { pushBoolean(data); }
// 用户数据, 传指针
template<> void push_data(void* udata) { lua_pushlightuserdata(_state, udata); }
}; NS_CC_END #endif // __CC_LUA_STACKEX_H_
#include "CCLuaStackEx.h"
下面是使用方式:
cocos2d::LuaStackEx* luaStack = static_cast<cocos2d::LuaStackEx*>(cocos2d::LuaEngine::getInstance()->getLuaStack());
luaStack->call_script_fun("common_progrss_message", "kukudi", , std::string("man"));
其实就是把cocos2d::LuaEngine::getInstance()->getLuaStack()获取到的LuaStack指针强行改成它的子类LuaStackEx的指针, 然后用这个指针来调用我写的一些方法, 但是它的内部创建的还是LuaStack对象, 而且我也没有改成创建LuaStackEx对象, 因为LuaStackEx这个自定义类中没有定义自己的数据成员, 用到的数据成员都是基类的! 嘿嘿.
当然了, 这个仅限于自己使用, 有一些缺点, 比如不能获取lua函数的返回值, 我也没这个需求.
还有就是要注意一点, 传入自己定义的数据对象时要取它的地址! 转换成void*, 然后在lua中再改成相关对象使用. 如果是同步对象直接取地址调用没问题, 如果是异步调用的话, 那就要new出对象, 把地址传进去, 这些东东已经不属于使用这个扩展类要注意的事项啦!
好啦, 这回真正的方便使用了, 呵呵
对了, 要把这两个文件放到工程liblua下面, 把liblua重新生成一下.像这样.


cocos2d-x 3.0 在C++中调用lua函数(2)的更多相关文章
- cocos2d-x 3.0 在C++中调用lua函数
代码用的是<cocos2d-x 3.0 在lua中调用自定义类>中的代码. 在上篇的基础上进行扩充. 写lua函数 local function process_packet(user_d ...
- 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++程序设计
在构造函数和析构函数中调用虚函数不是多态,因为编译时即可确定调用的是哪个函数.如果本类有该函数,调用的就是本类的函数:如果本类没有,调用的就是直接基类的函数:如果基类没有,调用的就是间接基类的函数,以 ...
随机推荐
- Eclipse配置方法注释模板
Java-->Code Style-->Code Templates-->Comments
- Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)
概要 学完了Map的全部内容,我们再回头开开Map的框架图. 本章内容包括:第1部分 Map概括第2部分 HashMap和Hashtable异同第3部分 HashMap和WeakHashMap异同 转 ...
- kindle书摘-围城-相爱勿相伤
https://github.com/starrtc/android-demo 围城(爱熄灭了灯,心围一座城.出版七十周年纪念版) (钱钟书) - 您在位置 #49-49的标注 | 添加于 2018年 ...
- [hadoop读书笔记] 第一章 初识 Hadoop
P3-P4: 目前遇见的问题很简单:硬盘容量不断提升,1TB的已成为主流,然而数据传输速度从1990年的4.4MB/s仅上升到当前约100MB/s 读取一个1TB的硬盘数据需要耗时至少2.5个小时.写 ...
- latin-1 codec cant encode characters in position 42-48: ordinal not in range256 下载文件时候报错
python后端写下载文件, 这个时候出现了这个错误 latin-1 codec cant encode characters in position 42-48: ordinal not in ra ...
- Simsimi 小黄鸡机器人最新无限制接口api simsimi机器人接口api 微信公众号
一.什么是Simsimi? simsimi公司是提供智能服务,其中一个服务是simsimi聊天机器人服务,每天有超过百万的用户聊天,国内最大的搜索引擎——百度的产品siri使用的就是simsimi提供 ...
- 【Python】Centos + gunicorn+flask 报错ImportError: No module named request
今天用Python去下载图片,用到了 urllib.request,这个是python3的方法.python2 使用的是urllib2 遇到了这么个问题后台报错,ImportError: No mod ...
- Failed to import package with error: Couldn't decompress package的解决方案
问题的出现 在Unity中导入一个Package文件,出现以下出错信息 解决方案 遇到这样的报错信息,一般就是要将该文件包的存储路径设置为英文,因为Unity不识别中文路径:其次对文件包的命名中间应没 ...
- 用OpenGL实现跳跃的立体小球
一.目的 掌握OpenGL中显示列表对象的使用方法. 二.示例代码 Github地址 #include "stdafx.h" #include <GL/glut.h> ...
- 第三百八十二节,Django+Xadmin打造上线标准的在线教育平台—xadmin管理员详情页面布局,导航图标设置
第三百八十二节,Django+Xadmin打造上线标准的在线教育平台—xadmin进阶 1.后台管理员详情页面布局 后台管理员详情页面,区块是可以拖动的,而且分为了很多个区块 这个页面的布局在xadm ...