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

    感谢原作者分享!

  • 相关阅读:
    WCF Server Console
    Restart IIS With Powershell
    RestartService (recursively)
    Copy Files
    Stopping and Starting Dependent Services
    多线程同步控制 ManualResetEvent AutoResetEvent MSDN
    DTD 简介
    Using Powershell to Copy Files to Remote Computers
    Starting and Stopping Services (IIS 6.0)
    java中的NAN和INFINITY
  • 原文地址:https://www.cnblogs.com/SkyflyBird/p/5373968.html
Copyright © 2011-2022 走看看