• cocos2d-x 3.8 lua 关于setAnimationCompletedCallback的修改


    在cocos-lua使用ccb动画播放攻击完成以后,加点绚丽的特效,需要使用C++中setAnimationCompletedCallback方法,很无奈没有发现C++与lua的相互调用,只能补充添加了。

    /*
    出处: cocosbuilder/CCBAnimationManager.h文件
    作用: 动画完成回调
    */
    void setAnimationCompletedCallback(cocos2d::Ref *target, cocos2d::SEL_CallFunc callbackFunc);

     首先我们要做的是找到关于CCBAnimationManager中的lua与C++的注册接口,即:

    // 在lua_cocos2dx_cocosbuilder_auto.cpp中,该接口用于添加C++与lua交互的所有CCBAnimationManager相关的实现方法
    int
    lua_register_cocos2dx_cocosbuilder_CCBAnimationManager(lua_State* tolua_S)

    在该接口内,我们添加新的静态方法调用:

    // 在lua_cocos2dx_cocosbuilder_auto.cpp中
    //
    C++与lua的交互,通过tolua相关,添加该代码后,lua就可以使用setAnimationCompletedCallback接口进行处理了 tolua_function(tolua_S,"setAnimationCompletedCallback",lua_cocos2dx_cocosbuilder_CCBAnimationManager_setAnimationCompletedCallback);

    然后,我们依然在lua_cocos2dx_cocosbuilder_auto.cpp中,编写关于lua_cocos2dx_cocosbuilder_CCBAnimationManager_setAnimationCompletedCallback方法相关,如下:

    static int lua_cocos2dx_cocosbuilder_CCBAnimationManager_setAnimationCompletedCallback(lua_State* tolua_S)
    {
      // 判定参数是否为空
    if (nullptr == tolua_S) return 0; int argc = 0; cocosbuilder::CCBAnimationManager* self = nullptr; // 判定类型是否为指定类型 #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; if (!tolua_isusertype(tolua_S, 1, "cc.CCBAnimationManager", 0, &tolua_err)) goto tolua_lerror; #endif // 判定对象是否有效 self = static_cast<cocosbuilder::CCBAnimationManager *>(tolua_tousertype(tolua_S,1,0)); #if COCOS2D_DEBUG >= 1 if (nullptr == self) { tolua_error(tolua_S,"invalid 'self' in function 'lua_cocos2dx_cocosbuilder_CCBAnimationManager_setAnimationCompletedCallback' ", NULL); return 0; } #endif // 判定参数是否正确 argc = lua_gettop(tolua_S) - 1; if (argc == 1) { #if COCOS2D_DEBUG >= 1 if(!toluafix_isfunction(tolua_S,2,"LUA_FUNCTION",0,&tolua_err)) goto tolua_lerror; #endif LUA_FUNCTION handler = toluafix_ref_function(tolua_S,2,0); LuaCCBAnimationWrapper* tmpCallback = new LuaCCBAnimationWrapper(); tmpCallback->setCallback(handler); self->setAnimationCompletedCallback(tmpCallback, CC_CALLFUNC_SELECTOR(LuaCCBAnimationWrapper::animationCompletedCallback)); return 0; } luaL_error(tolua_S, "'setAnimationCompletedCallback'function has wrong number of arguments: %d ", argc); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_cocosbuilder_CCBAnimationManager_setAnimationCompletedCallback'.",&tolua_err); return 0; #endif }

    2. 接着开始创建LuaCCBAnimationWrapper.h和LuaCCBAnimationWrapper.cpp的文件,其目录大家自定义,能够调用到,方便维护就行了哈。

    (1) LuaCCBAnimationWrapper.h

    #ifndef __LuaCCBanimationWrapper_H_
    #define __LuaCCBanimationWrapper_H_
    
    #include "cocos2d.h"
    
    USING_NS_CC;
    using namespace std;
    
    class LuaCCBAnimationWrapper : public Ref
    {
    public:
        LuaCCBAnimationWrapper();
        ~LuaCCBAnimationWrapper();
        
        void animationCompletedCallback();
        void setCallback(unsigned nFuncID);
        
    private:
        CallFunc *pCCCallFunc;
        unsigned int m_nFuncID;
    };
    
    #endif

    (2) LuaCCBAnimationWrapper.cpp

    #include "LuaCCBAnimationWrapper.h"
    #include "CCLuaEngine.h"
    
    LuaCCBAnimationWrapper::LuaCCBAnimationWrapper()
    :pCCCallFunc(NULL),
    m_nFuncID(0)
    {
        //
    }
    
    LuaCCBAnimationWrapper::~LuaCCBAnimationWrapper()
    {
        //
    }
    
    void LuaCCBAnimationWrapper::setCallback(unsigned int nFuncID)
    {
        CCLOG("LuaCCBAnimationWrapper::setCallback(nFuncID = %i)", nFuncID);
        m_nFuncID = nFuncID;
    }
    
    void LuaCCBAnimationWrapper::animationCompletedCallback()
    {
        /*
         2.x
        if (0 != m_nFuncID)
        {
            CallFunc *CallFuncTmp = CallFunc::create();
            CallFuncTmp->execute();
            m_nFuncID = 0; //TODO 当动画循环播放时会报错,记得修改
        }
        */
        
        //3.x
        if (0 != m_nFuncID)
        {
            LuaStack* stack = LuaEngine::getInstance()->getLuaStack();
            stack->executeFunctionByHandler(m_nFuncID, 1);
            m_nFuncID = 0; 
        }
    }

    参考:http://blog.csdn.net/playddt/article/details/43230045

    感谢原作者分享!

  • 相关阅读:
    Ubuntu 安装和使用 Supervisor(进程管理)
    Ubuntu查看端口占用及关闭
    Ubuntu 上安装 SQL Server 并创建数据库
    Kafka常用命令
    sql bug
    TiDB之PCTP(数据库专家)
    04 MySQL之函数
    05 MySQL之查询、插入、更新与删除
    03 MySQL之数据类型和运算符
    06 MySQL之索引
  • 原文地址:https://www.cnblogs.com/SkyflyBird/p/5373968.html
Copyright © 2020-2023  润新知