原文:《如何做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。
添加预处理宏
对libDragonbones
和libluacocos2d
库添加预处理宏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)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修改。
- 修改第一行
[cocos2d-x]
=>[dragonbones]
- 修改
prefix = cocos2dx
=>prefix = dragonbones
- 修改
target_namespace = cc
=>target_namespace = db
- 将下列路径追加到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
- 将下列头文件设置到headers,直接覆盖原有的就好,依然空格分隔,不能换行。
%(cocosdir)s/cocos/editor-support/dragonbones/renderer/cocos2d-x-3.x/DBCCRenderHeaders.h %(cocosdir)s/cocos/editor-support/dragonbones/DragonBonesHeaders.h
- 将下列类添加到classess,自己覆盖原有的就好,依然空格分隔,不能换行。可以添加更多你自己需要的类。
DBCCArmature DBCCArmatureNode Armature Animation AnimationState DBCCFactory BaseFactory Slot DBCCSlot WorldClock IAnimatable
- 设置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]
- 设置 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到libluacocos2d
右键libluacocos2d/auto
=> 添加 => 现有项.. ,选择 MyLuaGame/frameworks/cocos2d-x/cocos/scripting/lua-bindings/auto/ 目录下的lua_dragonbones_auto.cpp
和lua_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项目添加搜索路径及预定义宏。