码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-09-29 20:26:59      阅读:315      评论:0      收藏:0      [点我收藏+]

标签:

用过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

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

标签:

原文地址:http://www.cnblogs.com/superdo/p/4847063.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!