W e S D
0 1

[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

 这就是菊子曰啦!
posted @ 2015-09-29 19:05  SD.Team  阅读(391)  评论(0编辑  收藏  举报