[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 <string>

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

时间: 2024-10-03 21:54:37

[COCOS2DX-LUA]0-002.在C++中如何接收Lua方法,然后tolua的相关文章

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

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个经典的设计模式,指的是基类中只定义创建对象的接口,将实际的实现推迟到子类中. 在这里,我们将它稍加推广,泛指一切生成并返回一个对象的静态函数. 一个经典的工厂方法如同这样: Sprite* factoryMethod() { Sprite* ret = new Sprite(); //在这里对 ret

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

原文链接: 这两天玩 cocos2d-x 和 box2d,发现 cocos2d-x 2.0 版本号要使用老方法 debug 渲染会出错.于是找到了新方法来 debug draw: 首先在你的头文件中添加这么一条: public: //..... virtual void      draw(); //..... 然后在你的 cpp 里实现它: void HelloWorld::draw() { CCLayerColor::draw(); ccGLEnableVertexAttribs( kCCV

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

重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个经典的设计模式.指的是基类中仅仅定义创建对象的接口,将实际的实现推迟到子类中. 在这里.我们将它稍加推广,泛指一切生成并返回一个对象的静态函数. 一个经典的工厂方法如同这样: Sprite* factoryMethod() { Sprite* ret = new Sprite(); //在这里对 r

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

重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已经多次提到 Cocos2d-x 源自于 Cocos2d-iPhone.Cocos2d-iPhone 是一个十分出色的游戏引擎,很多优秀的 iOS平面游戏都基于 Cocos2d-iPhone 开发,而它的实现语言是 Objective-C.因此,Cocos2d-x 也就沿袭了 Objective-C

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

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已经多次提到 Cocos2d-x 源自于 Cocos2d-iPhone.Cocos2d-iPhone 是一个十分出色的游戏引擎,许多优秀的 iOS平面游戏都基于 Cocos2d-iPhone 开发,而它的实现语言是 Objective-C.因此,Cocos2d-x 也就沿袭了 Objective-C 的

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(5): 返回指定表格中的所有键(key):table.keys

这里的函数主要用来做:返回指定表格中所有的键.参考资料为quick_cocos. 星月倾心贡献~~~ --[[ -- 返回指定表格中的所有键(key) -- example: local t = ( a = 1, b = 2, c = 3 ) local keys = table.keys( t ) -- keys = { "a", "b", "c" } -- @param t 要检查的表格(t表示是table) -- @param table

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

环境 windows8, cocos2d-x 3.0, 现在开始安装需要的一些其它包 1. 按README.mdown文档上面要求的, 下载在windows下要安装的东东, 主要就是python2.7.3, PyYAML-3.10.win32-py2.7, pyCheetah 这些东东在README.mdown上面都给好了连接, 直接下载就行了, 安装好python后, 在系统环境变量的PATH中设置python所在的目录2. 安装android-ndk-r9b, 下载地址:http://dl.

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

代码用的是<cocos2d-x 3.0 在lua中调用自定义类>中的代码. 在上篇的基础上进行扩充. 写lua函数 local function process_packet(user_data) if user_data then user_data = tolua.cast(user_data, "user_data"); print (user_data:uid()); print (user_data:uname()); end end local ghall =

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) { exe