Home » 程序开发 » cocos2dx » 如何做dragonbones的lua绑定(VisualStudio)

如何做dragonbones的lua绑定(VisualStudio)

发表评论 阅读评论

最近好多同学在QQ群里问怎么在lua项目中使用DB(DrgonBones,龙骨),为了帮助更多的人,同时也好让更多的人跟容易使用DB,这里详细记录coco2dx-3.2版本对应DB的lua绑定。
首先要说明下,本文章对应的cocos2dx-3.2版本,其他cocos2dx-3.x版本跟3.2版本类似。 这里假设自己使用cocos命令行创建的lua项目,而且没有修改过目录结构,如果修改了请自行查找具体文件所在目录。

第一个假设,假设你已经知道如何配置cocos2dx-3.x的lua绑定,如果不知道的请移步bindings-generator查看README文件。 第二个假设,假设你已经使用cocos2dx-3.2创建了lua项目,名字为MyLuaGame,并且没有修改过里面的路径。

GitHub上下载DragonBonesCPP项目,将dragonbones文件夹移动到MyLuaGame/frameworks/cocos2d-x/cocos/editor-support下。目录结构类似于这样: dragonbones-in-cocos2dx

添加db库

在vs(Visual Studio)中打开MyLuaGame项目。 右击解决方案 => 添加 => 现有项目... ,选择MyLuaGame/frameworks/cocos2d-x/cocos/editor-support/dragonbones/renderer/cocos2d-x-3.x/proj.win32/libDragonbones.vcxproj。

添加预处理宏

libDragonbonesliblua库添加预处理宏DRAGON_BONES_ENABLE_LUA=1。 右击 libDragonbones => 属性 => 配置属性 => C/C++ => 预处理器 => 预处理定义 ,点击值后右边会有个下拉框,选择编辑,添加DRAGON_BONES_ENABLE_LUA=1并确认。 这里是libDragonbones的预处理宏,liblua的也类似。 dragonbes-preprocessor-macros

还有一种简便的方式,不需要去项目配置预定义宏,修改MyLuaGame/frameworks/cocos2d-x/cocos/editor-support/dragonbones/renderer/cocos2d-x-3.x/dbccMacro.h文件, 将#define DRAGON_BONES_ENABLE_LUA 0中的0修改为1。 不过不建议直接修改db的源文件,因为将来升级db的时候还需要再次修改这里。

liblua库中添加两条搜索路径

右击 liblua => 属性 => 配置属性 => 常规 => 附加包含目录,点击值后右边会有个下拉框,选择编辑,添加下面的搜索路径并确认。

$(EngineRoot)cocoseditor-supportdragonbones
$(EngineRoot)cocoseditor-supportdragonbonesrenderercocos2d-x-3.x

为MyLuaGame添加依赖项

右键MyLuaGame => 生成依赖项 => 项目依赖项...,勾选libDragonbones
右键MyLuaGame => 属性 => 通用属性 => 添加新引用 => 勾选 libDragonbones

修改conversions.yaml

文件路径:MyLuaGame/frameworks/cocos2d-x/tools/bindings-generator/targets/lua/conversions.yaml

ns_map: 下添加 "dragonBones::": "db."

to_native: 下添加:

LUA_FUNCTION : "${out_value} =  toluafix_ref_function(tolua_S,${arg_idx},0);ok &= ${out_value} != 0;"

完整文件下载(cocos2dx3.2, cocos2dx3.3, cocos2dx3.4),其他版本的请自行修改。

添加dragonbones.ini

文件路径:MyLuaGame/frameworks/cocos2d-x/tools/tolua/dragonbones.ini

复制cocos2dx.ini并命名为dragonbones.ini。 参照cocos2dx-3.2的dragonbones.ini修改。

  1. 修改第一行 [cocos2d-x] => [dragonbones]
  2. 修改 prefix = cocos2dx => prefix = dragonbones
  3. 修改 target_namespace = cc => target_namespace = db
  4. 将下列路径追加到cocos_headers,空格分隔,不能换行。
    -I%(cocosdir)s/cocos/editor-support/dragonbones
    -I%(cocosdir)s/cocos/editor-support/dragonbones/renderer/cocos2d-x-3.x
    -I%(cocosdir)s/external/lua/luajit/include
    -I%(cocosdir)s/cocos/scripting/lua-bindings/manual
    -I%(cocosdir)s/external/lua/tolua
  5. 将下列头文件设置到headers,直接覆盖原有的就好,依然空格分隔,不能换行。
    %(cocosdir)s/cocos/editor-support/dragonbones/renderer/cocos2d-x-3.x/DBCCRenderHeaders.h
    %(cocosdir)s/cocos/editor-support/dragonbones/DragonBonesHeaders.h
  6. 将下列类添加到classess,自己覆盖原有的就好,依然空格分隔,不能换行。可以添加更多你自己需要的类。
    DBCCArmature DBCCArmatureNode Armature Animation AnimationState DBCCFactory BaseFactory Slot DBCCSlot WorldClock IAnimatable
  7. 设置skip为下面的,注意格式,可以自行修改。
    skip = Bone::[getSlots getChildArmature], 
       Armature::[getSlots getBones getBoundingBox],
       Animation::[getAnimationDataList setAnimationDataList getAnimationData addLayer setActive],
       Slot::[setDisplayList getDisplayList getBoundingBox],
       BaseFactory::[getTextureAtlasMap getDragonBonesDataMap],
       WorldClock::[add remove contains]
  8. 设置 abstract_classes 为下面的,直接覆盖就好。
    abstract_classes = BaseFactory Slot Armature IAnimatable BaseFactory Slot Armature IAnimatable

完整文件下载(cocos2dx3.2, cocos2dx3.3, cocos2dx3.4),其他版本的请自行修改。

修改genbindings.py

文件路径:MyLuaGame/frameworks/cocos2d-x/tools/tolua/genbindings.py

搜索'cocos2dx.ini' : ('cocos2d-x', 'lua_cocos2dx_auto'), 在这一段中添加'dragonbones.ini' : ('dragonbones', 'lua_dragonbones_auto'),. 完整代码段为:

cmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'lua_cocos2dx_auto'), 
                    'cocos2dx_extension.ini' : ('cocos2dx_extension', 'lua_cocos2dx_extension_auto'), 
                    'cocos2dx_ui.ini' : ('cocos2dx_ui', 'lua_cocos2dx_ui_auto'), 
                    'cocos2dx_studio.ini' : ('cocos2dx_studio', 'lua_cocos2dx_studio_auto'), 
                    'cocos2dx_spine.ini' : ('cocos2dx_spine', 'lua_cocos2dx_spine_auto'), 
                    'cocos2dx_physics.ini' : ('cocos2dx_physics', 'lua_cocos2dx_physics_auto'), 
                    'cocos2dx_experimental_video.ini' : ('cocos2dx_experimental_video', 'lua_cocos2dx_experimental_video_auto'), 
                    'cocos2dx_experimental.ini' : ('cocos2dx_experimental', 'lua_cocos2dx_experimental_auto'), 
                    'cocos2dx_controller.ini' : ('cocos2dx_controller', 'lua_cocos2dx_controller_auto'), 
                    'dragonbones.ini' : ('dragonbones', 'lua_dragonbones_auto'), 
                    }
        target = 'lua'

完整文件下载(cocos2dx3.2, cocos2dx3.3, cocos2dx3.4),其他版本的请自行修改。

生成lua绑定

由于cocos2dx-3.2版本的lua绑定缺少dos2unix.exe文件,所以需要从这里下载,并放到 MyLuaGame/frameworks/cocos2d-x/tools/bindings-generator/tools/win32 目录下。
在命令行中运行MyLuaGame/frameworks/cocos2d-x/tools/tolua/genbindings.py,不出意外就一次生成成功了。

如果你没有配置好或者没有成功生成绑定文件,可以自己下载完整的绑定文件,其他版本的请自行修改。 lua_dragonbones_auto.hpp(cocos2dx3.2, cocos2dx3.3, cocos2dx3.4) lua_dragonbones_auto.cpp(cocos2dx3.2, cocos2dx3.3, cocos2dx3.4)

注册libDragonbones到liblua

右键libLua/auto => 添加 => 现有项.. ,选择 MyLuaGame/frameworks/cocos2d-x/cocos/scripting/lua-bindings/auto/ 目录下的lua_dragonbones_auto.cpplua_dragonbones_auto.hpp文件。

CCLuaStack.cpp中添加#include "lua_dragonbones_auto.hpp"头。 向bool LuaStack::init(void)函数中添加register_all_dragonbones(_state);

完整文件下载(cocos2dx3.2, cocos2dx3.3, cocos2dx3.4),其他版本的请自行修改。

最后

到这里就全部结束了,项目应该能编译通过并运行,之后就用lua写代码吧。

如果MyLuaGame的C++部分也使用了dragonbones,那么也需要在为MyLuaGame项目添加搜索路径及预定义宏。

接下来可以看看: 如何做dragonbones的lua绑定(Android)
如何在lua项目中使用dragonbones

更新记录: [2015/02/07] 增加了CCLuaStack.cpp及cocos2dx-3.3/3.4的链接 [2015/02/05] 增加了添加搜索路径的方法 [2015/01/15] 修改dragonbones/renderer下为cocos2d-x-3.x [2014/12/05] 增加了cocos2dx-3.2绑定好的hpp cpp文件 [2014/11/24] 增加了cocos2dx-3.x的lua绑定链接 [2014/11/24] 增加了dragonbones.ini的添加方法

  1. |

    - - 能不能直接给我个auto文件.......我机器没配好环境。。 感谢 : )

  2. | |

    @B-y
    OK,已经上传到github了。

  3. |

    @lite3 为什么build android runtime 一直提示 'LUA_FUNCTION' is not a member of 'cocos2d',然后'class dragonBones::DBCCArmatureNode' has no member named 'registerMovementEventHandler'

  4. | |

    @dafu
    那是因为没有添加DDRAGON_BONES_ENABLE_LUA的预定义宏。
    你向dragonbones里的Android.mk的LOCAL_CFLAGS中添加
    LOCAL_CFLAGS += -DDRAGON_BONES_ENABLE_LUA=1

  5. |

    @lite3 谢谢啊 ,那怎么使用帧 事件呢 我使用里面registerFrameEventHandler那个方法 没有起作用

  6. | |

    @dafu
    帧时间就是用的registerFrameEventHandler这个方法注册的

  7. |

    大神 请我下 为什么 我重新编译了 RUNTIME 之后 ,在WINDOWS 和MAC环境正常,在安卓和IOS 一运行游戏就报“
    LUA ERROR STRING "require src/main.lua ] loop or previous error loading module 'src/main.lua'

  8. | |

    @dafu
    这是你循环加载了main.lua

  9. |

    3.3按你的配置走完,win下没问题,编译android的时候,报frameworks\runtime-src\proj.android\../../cocos2d-x/cocos//scripting/lua-bindings/proj.android/../manual/CCLuaStack.cpp:217: error: undefined reference to 'register_all_dragonbones(lua_State*)',请教下。

  10. |

    @lite3
    LOCAL_CFLAGS += -DDRAGON_BONES_ENABLE_LUA=1
    改为
    LOCAL_CFLAGS += -DRAGON_BONES_ENABLE_LUA=1

    偷懒直接复制了。。。

  11. | |

    @xihen
    Android.mk 中是
    LOCAL_CFLAGS += -DDRAGON_BONES_ENABLE_LUA=1
    而不是
    LOCAL_CFLAGS += -DRAGON_BONES_ENABLE_LUA=1
    注意cflags需要-D开头

  12. |

    @lite3
    恩。正确的是LOCAL_CFLAGS += -DDRAGON_BONES_ENABLE_LUA=1

  13. |

    db的代码提示这么搞呢?

  14. | |

    @hcfc
    你是说COCOSIDE里吗,我没弄过。 我用的SublimeText,没有用代码提示。

  15. |

    求教博主
    我用的是C++版本的cocos2dx3.3final IDE环境是vs2013
    照博主的方式做了设置(除lua相关)
    项目用 USING_NS_DB; 正确,但DBCCArmatureNode还是报错,说未定义的标识符

  16. | |

    @Tshine
    没有引用DBCCArmatureNode的头文件。

  17. |

    @lite3
    看了下附带的demo,现在成功了,谢谢!

    还需要将
    $(EngineRoot)cocos\editor-support\dragonbones
    $(EngineRoot)cocos\editor-support\dragonbones\renderer\cocos2d-x-3.x
    这两个路径加到附加包含目录。否则只要包含了dragonbones的头文件libdragonbones就编译出错(主要是头文件)

    不知道这样做对不对...

  18. |

    android编译时遇到了如下错误,能否请教下可能是什么问题
    DBCCArmatureNode.h:11:24: fatal error: CCLuaValue.h: No such file or directory

  19. | |

    @az
    是什么版本的cocos2dx,因为没有添加lua的搜索路径

  20. |

    @lite3
    3.3的,后来在Android.mk里吧LOCAL_STATIC_LIBRARIES := cocos2d_static 改成了LOCAL_STATIC_LIBRARIES := cocos2d_lua_static
    后dragonbones可以编译过了。
    不过在链接的地方又出了问题。。。,报了一些很奇怪的错
    D:/ndk/android-ndk-r9d/sources/cxx-stl/gnu-libstdc++/4.8/include/iostream:74: error: undefined reference to 'std::ios_base::Init::Init()'
    ...

  21. |

    @lite3
    弄好了,最后还是换回了
    LOCAL_STATIC_LIBRARIES := cocos2d_static
    另外在LOCAL_C_INCLUDES中添加了lua-bindings的目录进去
    多谢帮助~

  22. |

    请教一个DragonBonesCPP的问题...

    ...

    即DragonBones里面,一个角色(armature)的不同动画,是否需要完全相同的bone?可以使用不同的bone吗?比如idle动画用bone1和bone2,而move动画用bone2和bone3,而不必idle包含角色(armature)的所有bone(bone1、bone2、bone3),move也包含角色(armature)的所有bone(bone1、bone2、bone3)。

  23. | |

    @zym
    在fla中添加了几个骨骼,那么每个动作就有几个骨骼,只是有些动作的某些骨骼在运行时隐藏掉了。

  24. |

    @lite3
    当build一个骨架出来后,不播放任何动画,会将所有骨骼显示出来...

  25. | |

    @zym
    通常都会播放一个动画的,默认是第一个动画,你是DBCPP的类库吗?

  26. |

    请问安装好了,有什么使用教程么?

  27. | |
  28. |

    @xihen
    请问,你的这个问题解决了么?我也遇到这个报错了

  29. |

    @lite3
    大神,求指教。
    在windows下没有问题,打包Android时报错
    E:\cokutau-dev\game\ProjectOne\frameworks\runtime-src\proj.android\../../cocos2d-x/cocos//scripting/lua-bindings/proj.android/../manual/CCLuaStack.cpp:209: error: undefined reference to 'register_all_dragonbones(lua_State*)'
    我在dragonbones的Android.mk里面增加LOCAL_CFLAGS += -DDRAGON_BONES_ENABLE_LUA=1没有用哦。
    另外mk里面好像已经有LOCAL_CFLAGS += -Wno-psabi了。我替换了不行

  30. | |

    @熊
    这个需要在liblua的Android.mk里也添加 LOCAL_CFLAGS += -DDRAGON_BONES_ENABLE_LUA=1

  31. |

    @az
    我也同你遇到同样的问题。能否说详细一点呢?

  32. |

    @lite3
    DBCCArmatureNode.h:11:24: fatal error: CCLuaValue.h: No such file or directory

    请问这个错误怎么解决。在LOCAL_C_INCLUDES已经加来了路径了。但是还是报找不到。具体是路径是:$(LOCAL_PATH)/../../../../../scripting/lua-bindings/manual

  33. |

    @dafu
    'class dragonBones::DBCCArmatureNode' has no member named 那是因为你没有加LOCAL_CFLAGS += -DDRAGON_BONES_ENABLE_LUA=1。或者你打开这个文件dbccMacro.h把#define DRAGON_BONES_ENABLE_LUA 0改为#define DRAGON_BONES_ENABLE_LUA 1

  34. |

    还是不行,我在加了这行 LOCAL_SRC_FILES += ../auto/lua_dragonbones_auto.cpp \
    但报如下错误了。
    [armeabi] Compile++ thumb: cocos2d_lua_static <= lua_dragonbones_auto.cpp
    E:\cokutau-dev\game\ProjectOne\frameworks\runtime-src\proj.android\../../cocos2d-x/cocos//scripting/lua-bindings/proj.android/../auto/lua_dragonbones_auto.cpp:2:31: fatal error: DBCCRenderHeaders.h: No such file or directory
    #include "DBCCRenderHeaders.h"

  35. |

    @熊

    要在你添加的那个文件的c_includes再加上这么一段
    $(LOCAL_PATH)/../../../editor-support/dragonbones \
    $(LOCAL_PATH)/../../../editor-support/dragonbones/renderer/cocos2d-x-3.x \

    路径不一定正确,你要看你的dragonbones是放在哪里。对应去找相对路径。

  36. |

    @ray
    我现在能成功打包了,windows先能正常运行,连手机调试提示db为空
    attempt to index global 'db' (a nil value)
    大神知道是什么回事么?

  37. |

    @熊

    有加入 dragonbones 的工程 build 过 android 的 runtime 么?

  38. |

    @ray
    重新build过了。打包过程也提示有dragonbones
    [armeabi] StaticLibrary : libaudioengine.a
    [armeabi] StaticLibrary : libdragonbones.a
    [armeabi] StaticLibrary : libui.a
    但还是找不到db
    是不是生成的libcocos2dlua.so文件里面没有 libdragonbones.a,这个是不是要在什么地方配置的。

  39. |

    @ray
    搞定了,原来是我手抽把注册的那段代码删除了。register_all_dragonbones(_state);

    另外,大神,我们有没有群什么的,以后方便大家讨论,
    我放了20个左右人模在手机上就跑不动了,光效里面使用了混合模式,现在很卡。

  40. |

    @熊

    我也是因为游戏性能问题才打算考虑使用 dragonbones 。 之前用 csd 感觉效果不是很好。你们游戏的光效是不是运用太多了。

  41. |

    @熊

    我也想求博主建群~

  42. | |

    @ray
    @熊
    dragonbones有官方QQ群:205889387
    性能测试还没有做过,不过我们游戏中也有好多dragonbones的实例,没有出现很卡的情况,建议做一个简单的demo跑下,看看是不是真的是dragonbones本身的问题。

  43. |

    @lite3
    我试过用三星的3502u放三十只龙进去。帧率会掉到20多帧。

  44. |

    锤子手机30只龙跑步动作,30~40帧徘徊。感觉上效率好像有点低……顶点数3000来个,drawcall 4
    博主项目里一般跑几个实例不影响帧率?

  45. | |

    @Tshine
    是cocos2dx3.x的吗,其实还没做过性能测试。

  46. |

    @lite3
    嗯,是的。
    cocos2dx3.3final cpp做的测试

  47. | |

    @Tshine
    昨天上传了db的性能测试例子,在我的MX1上可以放50只帧频是50左右,看来性能不是很好。

  48. |

    求mac下如何配置!!!!!

  49. | |

    @熊
    xcode下没有的,直接将dragonbones下的文件都放到libcocos2d中,然后将lua绑定的文件放到liblua工程中,并设置好搜索路径就好了。

  50. |

    太详细啦!!谢谢!

  51. |

  52. |

    博主,有几个问题,劳烦回答下
    1请问你给的cpp下载地址现在官方并没有给出啊,这个重构版本是你自己重构的还是之前官方重构的,现在删除了的原因
    2不知道你用这个版本有没有出现过内存泄漏的情况,我们项目中引用这份库文件的话,会造成挺严重的内存泄漏,请问需要我们额外的去手动释放么

  53. | |

    @求知小少年
    这是我写的教程,不过已经是15年的事了,后来换公司了就一直没弄过龙骨了,应该已经失效了

  54. |

    @lite3
    大神你居然还在。。。是这样的,我们教程是3.6的,我按你的教程做了以后在lua中能跑起来,但是如果在lua中调用了slot:setDisplayImage(cc.Sprite:create("BugSpider.png"))这个方法,然后退出包含该dragonbones节点的场景就会出现触发断点的情况,
    断点在
    E:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\crt\src\free.c
    --------
    void __cdecl _free_base (void * pBlock)
    {

    int retval = 0;

    if (pBlock == NULL)
    return;

    RTCCALLBACK(_RTC_Free_hook, (pBlock, 0));

    retval = HeapFree(_crtheap, 0, pBlock);(这行触发)
    if (retval == 0)
    {
    errno = _get_errno_from_oserr(GetLastError());
    }
    }
    --------

    我在你上传的c++demo里是没有发现这个问题的,请问当时你们项目做换装功能的时候,在lua中会出现这种情况吗,方便留个qq么,我好发图给你

  55. |

    @lite3
    是了,按照这个方法就ok了,谢谢

  56. |

    @lite3
    楼主,按照你的方法,在quick3.3集成了龙骨,vs也生成了player,在buildArmatureNode的时候返回总是空。。。

  57. |

    @lite3
    给你发了个邮件,望交流下。。

回到顶部