[COCOS2DX-LUA]0-002.在C++中如何接收Lua方法,然后tolua
用过COCOS2DX-LUA的同学们,大家都知道回调函数这个东西,在Lua中,我们可以把一个方法当成是一个参数传递给另一个方法,然后在方法中进行调用。但是我们经常要写C++代码,然后再转成Lua,那么C++中如何接收Lua方法并且进行调用呢。下面看看最近写的下载监听器的实现。
1.UpdateListener.h
#ifndef __UpdateListener__
#define __UpdateListener__ #include "cocos2d.h"
#include "CCLuaEngine.h"
#include "ExtensionMacros.h"
#include "AssetsManagerEx.h" #if (CC_TARGET_PLATFORM != CC_PLATFORM_WINRT) && (CC_TARGET_PLATFORM != CC_PLATFORM_WP8)
#include NS_CC_EXT_BEGIN /*
* updateListener
* @autor SD.Mount
* @date 2015.09.29
*/
class UpdateListener : public AssetsManagerExDelegateProtocol
{
protected:
// 声明Lua函数,后面注册后C++调用
LUA_FUNCTION _errorscript;
// 声明Lua函数,后面注册后C++调用
LUA_FUNCTION _progressscript;
// 声明Lua函数,后面注册后C++调用
LUA_FUNCTION _successscript;
public:
UpdateListener();
~UpdateListener(); // 错误回调
virtual void onError(AssetsManagerEx::ErrorCode errorCode);
// 进程回调
virtual void onProgress(int percent);
// 成功回调
virtual void onSuccess(); // 注册函数 /**
* 注册错误事件
* @return
*/
void registerScriptHandlerError(LUA_FUNCTION funcID); /**
* 注册进度事件
* @return
*/
void registerScriptHandlerProgress(LUA_FUNCTION funcID); /**
* 注册成功事件
* @return
*/
void registerScriptHandlerSuccess(LUA_FUNCTION funcID); //解注册函数 /**
* 解注册错误事件
* @return
*/
void unregisterScriptHandlerError(void); /**
*解 注册进度事件
* @return
*/
void unregisterScriptHandlerProgress(void); /**
* 解注册成功事件
* @return
*/
void unregisterScriptHandlerSuccess(void); /**
* 调用Lua函数
* param:ErrorCode 错误代码,错误回调用
* @return
*/
void callScriptHandler(AssetsManagerEx::ErrorCode errorCode); /**
* 调用Lua函数
* param:percent 百分比, 过程回调
* @return
*/
void callScriptHandler(int percent); /**
* 调用Lua函数
* @return
*/
void callScriptHandler();
}; NS_CC_EXT_END;
#endif // CC_TARGET_PLATFORM != CC_PLATFORM_WINRT
#endif /* defined(__UpdateListener__) */
2.UpdateListener.cpp
#include "UpdateListener.h"
#include "cocos2d.h" using namespace std; NS_CC_EXT_BEGIN; UpdateListener::UpdateListener(void)
{ } UpdateListener::~UpdateListener()
{ } // 错误回调
void UpdateListener::onError(AssetsManagerEx::ErrorCode errorCode)
{
this->callScriptHandler(errorCode);
} // 进程回调
void UpdateListener::onProgress(int percent)
{
this->callScriptHandler(percent);
} // 成功回调
void UpdateListener::onSuccess()
{
this->callScriptHandler();
} // 注册函数 /**
* 注册错误事件
* @return
*/
void UpdateListener::registerScriptHandlerError(LUA_FUNCTION funcID)
{
this->_errorscript = funcID;
} /**
* 注册进度事件
* @return
*/
void UpdateListener::registerScriptHandlerProgress(LUA_FUNCTION funcID)
{
this->_progressscript = funcID;
} /**
* 注册成功事件
* @return
*/
void UpdateListener::registerScriptHandlerSuccess(LUA_FUNCTION funcID)
{
this->_successscript = funcID;
} /**
* 解注册错误事件
* @return
*/
void UpdateListener::unregisterScriptHandlerError(void)
{
if (this->_errorscript)
{
this->_errorscript = NULL;
}
} /**
*解 注册进度事件
* @return
*/
void UpdateListener::unregisterScriptHandlerProgress(void)
{
if (this->_progressscript)
{
this->_progressscript = NULL;
}
} /**
* 解注册成功事件
* @return
*/
void UpdateListener::unregisterScriptHandlerSuccess(void)
{
if (this->_successscript)
{
this->_successscript = NULL;
}
} /**
* 调用Lua函数
* param:ErrorCode 错误代码,错误回调用
* param:percent 百分比, 过程回调
* @return
*/
void UpdateListener::callScriptHandler(AssetsManagerEx::ErrorCode errorCode)
{
if (this->_errorscript && errorCode)
{
CCLuaStack *stack = CCLuaEngine::defaultEngine()->getLuaStack();
lua_State* state = stack->getLuaState();
// 压参数进去吧
stack->clean();
lua_pushnumber(state, (int)errorCode);
stack->executeFunctionByHandler(this->_errorscript, 1);
// 清空堆栈信息
stack->clean();
}
} /**
* 调用Lua函数
* param:percent 百分比, 过程回调
* @return
*/
void UpdateListener::callScriptHandler(int percent)
{
if (this->_progressscript && percent)
{
CCLuaStack *stack = CCLuaEngine::defaultEngine()->getLuaStack();
lua_State* state = stack->getLuaState();
// 压参数进去吧
stack->clean();
lua_pushnumber(state, (int)percent);
stack->executeFunctionByHandler(this->_progressscript, 1);
// 清空堆栈信息
stack->clean();
}
} /**
* 调用Lua函数
* @return
*/
void UpdateListener::callScriptHandler()
{
if (this->_successscript)
{
CCLuaStack *stack = CCLuaEngine::defaultEngine()->getLuaStack();
lua_State* state = stack->getLuaState();
// 压参数进去吧
stack->clean();
stack->executeFunctionByHandler(this->_successscript, 0);
// 清空堆栈信息
stack->clean();
}
} NS_CC_EXT_END;
3.注意to_lua事项
LUA_FUNCTION funcID = (LUA_FUNCTION) toluafix_ref_function(tolua_S,2,0); 不能写成 LUA_FUNCTION funcID = *((LUA_FUNCTION)*) toluafix_ref_function(tolua_S,2,0); 因为我用脚本生成是这样,就报错了。

本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士)
转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4847063.html
[COCOS2DX-LUA]0-002.在C++中如何接收Lua方法,然后tolua的更多相关文章
- cocos2d-x 2.0下怎样让BOX2D DEBUG DRAW的方法笔记
原文链接: 这两天玩 cocos2d-x 和 box2d,发现 cocos2d-x 2.0 版本号要使用老方法 debug 渲染会出错.于是找到了新方法来 debug draw: 首先在你的头文件中添 ...
- 9、Cocos2dx 3.0游戏开发三查找值小工厂方法模式和对象
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个 ...
- 9、Cocos2dx 3.0游戏开发找小三之工厂方法模式与对象传值
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个 ...
- 7、Cocos2dx 3.0游戏开发找小三之3.0版本号的代码风格
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已 ...
- cocos2d-x 3.0 在C++中调用lua函数
代码用的是<cocos2d-x 3.0 在lua中调用自定义类>中的代码. 在上篇的基础上进行扩充. 写lua函数 local function process_packet(user_d ...
- cocos2d-x 3.0 在lua中调用自定义类
环境 windows8, cocos2d-x 3.0, 现在开始安装需要的一些其它包 1. 按README.mdown文档上面要求的, 下载在windows下要安装的东东, 主要就是python2.7 ...
- cocos2d-x 3.0 在C++中调用lua函数(2)
个人觉得3.0里面, 在C++下面调用lua函数很不方便, 所以就扩展了一个类, 继承自LuaStack, 代码和使用方式如下: #ifndef __CC_LUA_STACKEX_H_ #define ...
- Coco2dx-3.0中怎样调用LUA
一个用3.0的工具导出类到lua,自己主动生成代码的方法. 曾经要导出c++类到lua.就得手动维护pkg文件,那简直就是噩梦.3.0以后就会感觉生活非常轻松了. 以下我就在说下详细做法. 1.安装必 ...
- Cocos2d-x 3.0 beta 中加入附加项目,解决无法打开包括文件:“extensions/ExtensionMacros.h”: No such file or directory”
Cocos2d-x 3.0 Alpha 1开始 对目录结构进行了整合.结果有些附加项目也被在项目中被精简出去. 比如说如果你需要使用CocoStdio导出的JSON.或使用Extensions扩展库, ...
随机推荐
- 洛谷 2016 战略游戏(树形DP)
题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得这些士兵能 ...
- cookie、session 和 token 区别
1.什么是 cookie cookie 是保存在本地终端的数据.cookie 由服务器生成,发送给浏览器,浏览器把 cookie 以 kv 形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该 ...
- python(For 循环语句)
一.For循环 Python for 循环可以遍历任何序列的项目,如一个列表或者一个字符串或者字典等. 语法模式:for var in sequence: (1)从某个集合(列表等)里顺次取值 #遍历 ...
- Naigos install pnp4nagios 绘图插件
原文地址:http://www.cnblogs.com/caoguo/p/5022230.html vim /etc/httpd/conf/httpd.conf <Directory " ...
- Maxim实时时钟芯片设计指南5413-二进制编码十进制(BCD)格式实时时钟中的状态机逻辑
网上DS12C887的文章涉及到时间的存储格式使用的都是二进制代码,究竟使用BCD码该如何操作?正好美信官网上有一篇文章.美信官网不稳定,先贴到这里,有时间再翻译. 原文链接 State Machin ...
- 【Hadoop离线基础总结】流量日志分析网站整体架构模块开发
目录 数据仓库设计 维度建模概述 维度建模的三种模式 本项目中数据仓库的设计 ETL开发 创建ODS层数据表 导入ODS层数据 生成ODS层明细宽表 统计分析开发 流量分析 受访分析 访客visit分 ...
- Day_09【常用API】扩展案例2_测试小字符串在大字符串中出现的次数
分析以下需求,并用代码实现 1.键盘录入一个大字符串,再录入一个小字符串 2.统计小字符串在大字符串中出现的次数 3.代码运行打印格式: 请输入大字符串: woaiheima,heimabutongy ...
- 标准IDOC同步采购订单
目录 1功能说明 4 2功能实现 4 2.1创建逻辑系统并分配集团(SALE) 4 2.2维护RFC目标(SM59) 5 2.3在发送端创建模型视图(BD64) 5 2. ...
- matlab读取csv文件并显示
传统的方式可以通过读取文件,然后处理字符串的方式对csv文件进行解析,在matlab中可以通过csvread函数读取csv文件,然后通过plot对数据进行显示,也可以对里面的函数进行分析: csv文件 ...
- [hdu5373 The shortest problem]模拟
http://acm.hdu.edu.cn/showproblem.php?pid=5373 思路:按题意来即可. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...