【转】如何做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下。目录结构类似于这样:

添加db库

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

添加预处理宏

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

还有一种简便的方式,不需要去项目配置预定义宏,修改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的时候还需要再次修改这里。

libluacocos2d库中添加两条搜索路径

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

$(EngineRoot)cocos\editor-support\dragonbones
$(EngineRoot)cocos\editor-support\dragonbones\renderer\cocos2d-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.2cocos2dx3.3cocos2dx3.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.2cocos2dx3.3cocos2dx3.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.2cocos2dx3.3cocos2dx3.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.2cocos2dx3.3cocos2dx3.4)
lua_dragonbones_auto.cpp(cocos2dx3.2cocos2dx3.3cocos2dx3.4)

注册libDragonbones到libluacocos2d

右键libluacocos2d/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.2cocos2dx3.3cocos2dx3.4),其他版本的请自行修改。

最后

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

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

时间: 2024-10-26 00:27:40

【转】如何做dragonbones的lua绑定(VisualStudio)的相关文章

如何做dragonbones的lua绑定(mac)

部分文件需要如何做dragonbones的lua绑定(VisualStudio) 支持 a. 将dragonbones(cocos2d_libs), lua_dragonbones_auto.cpp,lua_dragonbones_auto.hpp(cocos2d_lua_bindings/auto)添加到工程 b.  cocos2d_libs/project/Build Settings/Search Paths/User Header Search Paths增加 $(SRCROOT)/..

【转】如何做dragonbones的lua绑定(Android)

这篇写dragonbones的lua绑定之Android部分,不知道怎么在VS(Visual Studio)中绑定的话请看如何在lua项目中使用dragonbones.有了上篇的基础,这次再做Android就比较简单了.注意:ndk9b不能编译通过,我这里使用的是ndk9d,其他版面没有测试. 修改 Application.mk 文件路径:MyLuaGame/frameworks/runtime-src/proj.android/jni/Application.mk 添加预定义宏 APP_CPP

使用cocos2d脚本生成lua绑定

这几天要老大要求把DragonBones移到cocos2dx 3.0 里边,并且绑定lua使用接口.因为刚学lua,使用的引擎也刚从2.2改为3.0,各种不熟悉,折腾了好几天才弄完,有空了总结一下 这篇先说一下cocos2d生成lua绑定的修改,有空的话再写一篇lua中注册回调到c++中方法 我的目录结构 假设我的目录名称是DragonBones -Cocosdx目录 -DragonBones  -c代码 -c代码头 -tools  db_DragonBones.ini genbindings.

用LuaBridge为Lua绑定C/C++对象

最近为了总结Lua绑定C/C++对象的各种方法.第三方库和原理,学习了LuaBridge库为Lua绑定C/C++对象,下面是学习笔记,实质是对该库的Reference Manual基本上翻译了一遍,学习过程中测试代码,放在我的github上. LuaBridge的主要特点 源码只有头文件,没有.cpp文件,没有MakeFile,使用时只需一个#include即可. 支持不同的对象生命周期管理模式. 对Lua栈访问方便并且是类型安全的(type-safe). Automatic function

Cocos2d-x v3.3 lua绑定c++类方法总结

网上有很多cocos2d-x lua绑定c++类的接口教程,这篇文章也是总结他们的经验. 其中重点参考了 http://cn.cocos2d-x.org/tutorial/show?id=1295, 整个过程步骤很详细,会比较傻瓜式,希望对新手读者入门有用. 教程基本环境: 1.使用引擎是v3.3 beta版本 2.开发环境:OSX Yosemite 3. Cocos code IDE 4. Xcode 6 1.在Mac上用Cocos code IDE 写lua还是比较便利的,我们用coco c

lua绑定C++对象系列一——基础知识

本文主要介绍lua绑定C++对象的原理和方法,并能在C/C++定义类和方法,在lua中创建C++类的句柄实例,像面向对象一样去使用C++类实例.为了便于大家理解,系列文章会从基础知识讲解,并通过多个版本的进化,一步步完成从基础到多版本实践的完美结合和深入,彻底理解lua绑定C++对象的原理方法.在阅读本系列文章前,需要具备一定的lua开发经验以及lua与C/C++相互调用操作的知识. 1.基础C/C++和Lua的相互引用调用 我们知道C和lua相互调用,是通过虚拟栈进行数据传递通信的,基础介绍介

cocos2dx v3.x lua绑定分析

打算新项目转到cocos2dx v3上了,下载代码浏览过后发现改动真是非常大,结构性调整很多. 比如tolua绑定这一块,就几乎全翻新了. 胶水代码的生成,改成了全自动式的,通过clang来分析c++代码,可以准确的知道每一个类.函数.参数的信息,再也不用手动写pkg文件了. 运行期对象管理这块,似乎也有了不少改动,至少我原来的一些扩展代码运行不了了,还没来得及细看,待看完再一一录下. 先记录一下目前已看清楚的[类名表.类元表.对象实例]之间的关系: 1.类元表:最核心的表,在lua代码里是不可

cocos2dx lua 绑定之二:手动绑定自定义类中的函数

cococs2dx 3.13.1 + vs2013 + win10 1.首先按照<cocos2dx lua 绑定之一:自动绑定自定义类>绑定Student类 2.在Student类中增加一个用于测试手动绑定的函数manual_call ①Student.h中增加函数 //手动绑定调用函数 void manual_call(); ②Student.cpp中增加函数实现 //和自动绑定相比,只增加了这个函数 void Student::manual_call() { std::cout <&

cocos2d-x lua绑定解析

花了几天时间看了下cocos2d-x lua绑定那块,总算是基本搞明白了,下面分三部分解析lua绑定: 一.lua绑定主要用到的底层函数 lua绑定其本质就是有一个公用的lua_Stack来进行C和Lua之间的值传递,在路径[项目根目录]\frameworks\cocos2d-x\external\lua\luajit\include下有个lua.h文件,大部分lua绑定底层函数以及相关的常量都在这里. 1.lua堆栈常量 #define LUA_REGISTRYINDEX (-10000) /