zoukankan      html  css  js  c++  java
  • [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

     这就是菊子曰啦!
  • 相关阅读:
    要读的书
    装好卫生间的三大要素
    效率由心生,快速提高工作效率秘诀
    玄关装饰设计5大形式
    客厅吊顶装修设计技巧
    如何去除木质家具的污垢
    讲一下SqlDataReader的关闭问题,出现"阅读器关闭时尝试调用 FieldCount 无效"
    SQL SERVER 中如何使用行锁
    汤唯:《在街头卖艺的那些日子》
    【转】取模(mod)与取余(rem)的区别——Matlab学习笔记
  • 原文地址:https://www.cnblogs.com/superdo/p/4847063.html
Copyright © 2011-2022 走看看