用过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. JAVA大数几算--HDU 2054 A == B ?

    Problem Description Give you two numbers A and B, if A is equal to B, you should print "YES&quo ...

  2. 图论--Dijkstra算法总结

    Key word: ①BFS转换Dijkstra ②其他关系转化为最短路 ③反向建边及反向Dijkstra ④稠密图.稀疏图 ⑤链式前向星 ⑥Vector建图 ⑦超级源点&汇点 详解: 1.B ...

  3. unittest(执行用例)

    from selenium import webdriver from time import sleep import unittest#导入unittest库 import HTMLTestRun ...

  4. CRT 连接AWS-EC2

    crt使用.pem登录AWS服务器 网上看到方案如下,看到大部分人都成功了,一头雾水,我的crt不需要pub文件.... chmod xxx.pem ssh-keygen -p -f xxx.pem ...

  5. vue跳转的两种方法

    1 标签跳转 <router-link to='two'><button>点我到第二个页面</button></router-link> 2 点击事件跳 ...

  6. 跟哥一起学python(3)- 理解“变量”

    我们把前面的程序稍微改一下,来了解python中的变量. # file: ./4/4_1.py # 定义变量 hello_str = "hello, world!" # 字符串打印 ...

  7. 【BIM】BIMFACE中创建雾化效果

    背景 在BIM运维场景初始化的时候,一般都是首先将整个运维对象呈现在用户面前,例如一座大厦.一座桥梁.一个园区等等,以便于用户进行总览,总体把握运维对象,如果这个宏大的场景边界过于清晰,与背景融合也不 ...

  8. nginx脚本自动安装

    nginx脚本自动安装 脚本功能: 自动安装nginx 自动判别系统是否安装nginx 自定义安装nginx路径 自定义安装nginx版本. #!/bin/bash #2019年10月30日16:00 ...

  9. yum安装mysql 之后问题

    日志报错: 190412 15:56:50 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create ...

  10. Django :Content-Type组件

    Content_Type 组件 用法: model.py: from django.db import models # Create your models here. class Food(mod ...