用过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
这就是菊子曰啦!