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'\n", 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\n", 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
}
  1. 接着开始创建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

感谢原作者分享!

原文链接: https://www.cnblogs.com/SkyflyBird/p/5373968.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/231697

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午3:09
下一篇 2023年2月13日 下午3:09

相关推荐