cocos2d-x 3.8 lua 关于setAnimationCompletedCallback的修改

最近想实现使用ccb动画播放攻击的时候,加点绚丽的特效,在其CCBAnimationManager类中,也找到了相对应的接口:

/**
     * when this function bound to js ,the second param are callfunc_selector
     * @lua NA
     */
    void setAnimationCompletedCallback(cocos2d::Ref *target, cocos2d::SEL_CallFunc callbackFunc)

不过可惜的是,未发现lua与c++的交互调用,唯一的方法就是补充添加了哦!

1. 打开cocos2d_lua_bindings.xcodeproj/auto/lua_cocos2dx_cocosbuilder_auto.cpp找到:

int lua_register_cocos2dx_cocosbuilder_CCBAnimationManager(lua_State* tolua_S)

该方法不用多说,大家一看其代码就会明白了,我们在其中添加其代码:

tolua_function(tolua_S,"setAnimationCompletedCallback",  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

        // 注意此处的LuaCCBAnimationWrapper
        LUA_FUNCTION handler = toluafix_ref_function(tolua_S,2,0);
        //ScriptHandlerMgr::getInstance()->addObjectHandler((void*)self, handler, ScriptHandlerMgr::HandlerType::NODE);

        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
}

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

时间: 2024-10-13 21:31:51

cocos2d-x 3.8 lua 关于setAnimationCompletedCallback的修改的相关文章

cocos2d的-X- luaproject的LUA脚本加密

2014/1/26 更新 近期又发现了一个非常easy的方法,事实上coco2dx已经给我们提供设置loader的方法. 注意:有个局限性,在非android平台下调用pEngine->executeScriptFile是不调用loader的,仅仅有require这样的才会调用loader.也就是说你直接executeScriptFile("main.lua")这个脚本不能加密,main.lua里面require的才干加密 过程例如以下: 1.实现自己的loader(參考int

cocos2d-x 图片资源加密,Lua文件加密 (转)

游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePacker工具来加密的,不过针对性还是不够强. 分析一下原理为: 1,转格式:将需要加密的文件转为流的方式: 2,加密:根据自己需要使用加密手段,MD5,AES,甚至可以直接改变位移,加一些自己的特殊字符也可以使文件简单加密,加密完后基本保证 图片类型基本用特殊软件预览不了也打不开,Lua文件加密后一片乱

Cocos2dx-Lua与C++混合使用

本文转载于http://www.cnblogs.com/zisou/p/cocos2dx-lua1.html 上面一个问题我觉得在我们使用Lua之前需要深入思考的,Lua有何优点?缺点又是什么?先找准自己的项目定位 在什么时候使用是很必要的: 经过自己一番摸索之后有如下结论: 优点: 1,嵌入式脚本开发可以跳过平台市场进行独立的游戏资源更新: 2,在使用Lua开发能降低在使用C++中得指针引用报错,nil类型问题: 3,可以使用Lua表结构来完成面向对象: 还有一个项目定位的问题,那就是开发游戏

cocos2d-x lua中实现异步加载纹理

原文地址:  http://www.cnblogs.com/linchaolong/p/4033118.html 前言   问题:最近项目中需要做一个loading个界面,界面中间有一个角色人物走动的动画,在显示这个loading界面的时候加载资源,项目是用cocos2d-x lua实现的,界面做出来后发现在加载资源的时候界面会卡住. 原因: 因为使用的不是异步加载,而且cocos2d-x没有绑定异步加载资源的api到lua中,其实在lua中实现不了异步. 想通过在lua中启动一个线程去加载资源

【Cocos2d-x Lua】http工具类封装

实现 该工具类对Cocos2d-x中的HttpClient进行了封装,使可以在Lua中实现http异步请求. LuaHttpClient.h #ifndef __LUAHTTPCLIENT_H__ #define __LUAHTTPCLIENT_H__ #include "cocos2d.h" USING_NS_CC; #include "cocos-ext.h" USING_NS_CC_EXT; // 参数封装类 class LuaParams{ public:

cocos2d-x 2.2.0 怎样在lua中注冊回调函数给C++

cocos2d-x内部使用tolua进行lua绑定.可是引擎并没有提供一个通用的接口让我们能够把一个lua函数注冊给C++层面的回调事件. 翻看引擎的lua绑定代码,我们能够仿照引擎中的方法来做. 值得吐槽的是.这套流程在开发中差点儿是不可避免的,而cocos2d-x居然不把它作为一个公用接口暴露给开发人员,而须要我自己动手,真是无奈. 以下以一个简单的消息分发类为样例,演示怎样完毕这一工作. MessageDispatcher.h class MessageDispather { public

【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】

游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePacker工具来加密的,不过针对性还是不够强. 分析一下原理为: 1,转格式:将需要加密的文件转为流的方式: 2,加密:根据自己需要使用加密手段,MD5,AES,甚至可以直接改变位移,加一些自己的特殊字符也可以使文件简单加密,加密完后基本保证 图片类型基本用特殊软件预览不了也打不开,Lua文件加密后一片乱

关于在Cocos2dx引擎中手动绑定C++到Lua

虽然大多数写的代码是Lua脚本,但是仍然会遇到单纯的使用Lua语言解决不了的问题,而只好要先用C++写好想要的功能,然后留好接口给Lua调用, 那么问题来了,怎么将C++写好的函数绑定到Lua中呢... 当然Cocos2dx3.x版本的应该集成了绑定这一功能,但是下面我要说的是绑定固定的函数到Lua中. 先在C++中实现自己的静态函数(此处只贴出声明.h): 1 // 2 // TestBind.h 3 // testMoveTo 4 // 5 #include <stdio.h> 6 #in

Lua脚本在C++下的舞步(入门指引)(转)

http://www.cnblogs.com/hmxp8/archive/2011/11/23/2259777.html 转帖来自:http://www.acejoy.com/bbs/viewthread.php?tid=1931&extra=page%3D1 现在,越来越多的C++服务器和客户端融入了脚本的支持,尤其在网游领域,脚本语言已经渗透到了方方面面,比如你可以在你的客户端增加一个脚本,这个脚本将会帮你在界面上显示新的数据,亦或帮你完成某些任务,亦或帮你查看别的玩家或者NPC的状态...