[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扩展库, ...
随机推荐
- 网络流--最大流--EK模板
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- RF(读写 excel)
1.安装 ExcelLibrary 库:pip install robotframework-ExcelLibrary 但是 Python3.0 通过上面的命令安装 ExcelLibrary 时,会发 ...
- 10)drf 过滤器(条件查询 排序 ) 分页器
一.群查接口各种筛选组件 数据准备 models.py class Car(models.Model): name = models.CharField(max_length=16, unique=T ...
- centos7 源码安装goaccess
1. 使用yum安装在不同服务器上可能失败, 推荐使用源码安装goaccess # 安装依赖 yum install -y ncurses-devel GeoIP-devel.x86_64 tokyo ...
- 面试被问为什么使用Spring Boot?答案好像没那么简单
面试官:项目中有使用Spring Boot吗? 小小白:用过. 面试官:说一下为什么要使用Spring Boot? 小小白:在使用Spring框架进行开发的过程中,需要配置很多Spring框架包的依赖 ...
- Java——Java自动装箱和拆箱
一.什么是自动装箱和拆箱: 我们知道java为8种基本类型分别提供了对应的包装类型,在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行: Integer i=new I ...
- Northwestern European Regional Contest 2014 Gym - 101482
Gym 101482C Cent Savings 简单的dp #include<bits/stdc++.h> #define inf 0x3f3f3f3f #define inf64 0x ...
- [csu/coj 1079]树上路径查询 LCA
题意:询问树上从u到v的路径是否经过k 思路:把树dfs转化为有根树后,对于u,v的路径而言,设p为u,v的最近公共祖先,u到v的路径必定是可以看成两条路径的组合,u->p,v->p,这样 ...
- 微信小程序中,如何阻止多次点击单击事件
在微信小程序中,有自制对话框用于提交数据,但是会出现用户连续点击,多次提交数据的情况. //.wxml <view class="acertain" bindtap=&quo ...
- Django ORM性能优化之count和len方法的选择(非常详细推荐干货)
接下来我将从源码层面分情况和应用分析我们在计算queryset数据集时是用orm的count函数计算长度还是用len函数计算数据集长度. 首先,我们知道ORM查询queryset数据集是惰性查询的,只 ...