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