用过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的更多相关文章

  1. cocos2d-x 2.0下怎样让BOX2D DEBUG DRAW的方法笔记

    原文链接: 这两天玩 cocos2d-x 和 box2d,发现 cocos2d-x 2.0 版本号要使用老方法 debug 渲染会出错.于是找到了新方法来 debug draw: 首先在你的头文件中添 ...

  2. 9、Cocos2dx 3.0游戏开发三查找值小工厂方法模式和对象

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个 ...

  3. 9、Cocos2dx 3.0游戏开发找小三之工厂方法模式与对象传值

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个 ...

  4. 7、Cocos2dx 3.0游戏开发找小三之3.0版本号的代码风格

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已 ...

  5. cocos2d-x 3.0 在C++中调用lua函数

    代码用的是<cocos2d-x 3.0 在lua中调用自定义类>中的代码. 在上篇的基础上进行扩充. 写lua函数 local function process_packet(user_d ...

  6. cocos2d-x 3.0 在lua中调用自定义类

    环境 windows8, cocos2d-x 3.0, 现在开始安装需要的一些其它包 1. 按README.mdown文档上面要求的, 下载在windows下要安装的东东, 主要就是python2.7 ...

  7. cocos2d-x 3.0 在C++中调用lua函数(2)

    个人觉得3.0里面, 在C++下面调用lua函数很不方便, 所以就扩展了一个类, 继承自LuaStack, 代码和使用方式如下: #ifndef __CC_LUA_STACKEX_H_ #define ...

  8. Coco2dx-3.0中怎样调用LUA

    一个用3.0的工具导出类到lua,自己主动生成代码的方法. 曾经要导出c++类到lua.就得手动维护pkg文件,那简直就是噩梦.3.0以后就会感觉生活非常轻松了. 以下我就在说下详细做法. 1.安装必 ...

  9. Cocos2d-x 3.0 beta 中加入附加项目,解决无法打开包括文件:“extensions/ExtensionMacros.h”: No such file or directory”

    Cocos2d-x 3.0 Alpha 1开始 对目录结构进行了整合.结果有些附加项目也被在项目中被精简出去. 比如说如果你需要使用CocoStdio导出的JSON.或使用Extensions扩展库, ...

随机推荐

  1. 2019-2020 ICPC, Asia Jakarta Regional Contest C. Even Path(思维)

    Pathfinding is a task of finding a route between two points. It often appears in many problems. For ...

  2. HDU 1233 最小生成树模板题,练练模板

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. 在Jetson TX2上捕获、显示摄像头视频

    参考文章:How to Capture and Display Camera Video with Python on Jetson TX2 与参考文章大部分都是相似的,如果不习惯看英文,可以看看我下 ...

  4. java程序猿面试系列之jvm专题

    前言 因为疫情的影响,现在都变成金五银六了.为了方便大家,在此开一个程序猿面试系列.总结各大公司所问的问题,希望能够帮助到大家,适合初中级java程序猿阅读. 1. Java类实例化时,JVM执行顺序 ...

  5. Java——Java集合那些事

    集合概述: 集合和数组都可以保存多个对象,但是数组的长度不可变,集合可以保存数量变化的数据.java中的集合类主要由两个接口派生出,Collection和Map Collection接口和Iterat ...

  6. dp D. Caesar's Legions

    https://codeforces.com/problemset/problem/118/D 这个题目有点思路,转移方程写错了. 这个题目看到数据范围之后发现很好dp, dp[i][j][k1][k ...

  7. Java创建对象的六种方法-权当记录一下

    1 简介 Java是面向对象的编程语言,只要使用它,就需要创建对象.Java创建对象有六种方法,实际常用的不会这么多,这里权当是记录一下. 2 六种方法 (1)使用new关键字 Pumpkin p1 ...

  8. 万盛酒店餐饮管理系统(SpringBoot,SSM,MySQL )

    项目源码获取地址: 链接:https://pan.baidu.com/s/1ip0keQruE2crA8vm1n8ZXQ 提取码:kivb 复制这段内容后打开百度网盘手机App,操作更方便哦 [功能包 ...

  9. JUC之ReentrantLock源码分析

    ReentrantLock:实现了Lock接口,是一个可重入锁,并且支持线程公平竞争和非公平竞争两种模式,默认情况下是非公平模式.ReentrantLock算是synchronized的补充和替代方案 ...

  10. (1)从通信中的MCS含义开始讲起

    通信中的MCS:Modulation and Coding Scheme,意思为调制编码方案/调制编码策略,其内涵可分为两个部分:Modulation  和  Coding. 在基带的信号处理流程中, ...