前言
本来我也是直接百度的,看看有没有现成的方法,然而看了几篇,没有能直接用的,只能自己搞了。
那为什么不用Spine呢,因为没钱。
首先说下,这篇文章很长,不过我会按步骤加上标题的,可以直接看自己感兴趣的部分。
然后是我的运行环境:win10+vs2017+cocos2d-x-3.17(之后可能会补上mac版的)
DrangonBones项目源码下载地址:
https://github.com/DragonBones/DragonBonesCPP
下载后的目录结构如图,DragonBonesCPP-master:
1.新建DragonBones静态库项目
1.1 新建项目
打开Visual Studio,文件->新建->项目:
上面选择空项目
名称填libDragonBones(当然也是可以随便添的, 不过后面要用到这个项目名称,添其他名字的后面要对应上。以下涉及名称的都不再重复)
位置自己改下
1.2 导入代码
将DragonBonesCPP-master\DragonBones\src\dragonBones和DragonBonesCPP-master\3rdParty\rapidjson两个文件拷贝到libDragonBones文件夹下,如图:
然后将这两个文件夹下的文件导入到项目中
源文件->右击->添加->新建筛选器->命名为dragonBones, 然后将DragonBonesCPP-master\DragonBones\src\dragonBones下的文件及目录结构导入,同样文件夹要用新建筛选器,而文件只要control+c,然后在对应筛选器上control+v就好。rapidjson同理导入。
导入后的项目结构如图(当然太长了,没截全):
1.3 现在直接运行项目会报错,说rapidJson/document.h找不到
右击libDragoBones->属性->配置属性->c/c++->常规->右侧附加包含目录->编辑->增加..\..\libDragonBones(根据实际情况自行修改)
2.引入到游戏项目中
2.1 新建cocos2dx cpp项目(lua的后面再说)
windows命令行输入cocos new dbtest -p org.cocos2dx.com -d D:\ -l cpp
2.2 文件导入
dbtest\cocos2d\cocos\editor-support\下新建文件夹dragonBones,如图:
复制libDragonBones项目目录下的所有文件,拷贝到dbtest\cocos2d\cocos\editor-support\dragonBones\下(.vs和.sln不用拷贝),如图:
2.3 cocos2dx cpp项目中导入libDragonBones项目
vs打开dbtest项目
右击解决方案->添加->现有项目->选择libDragonBones项目(dbtest\cocos2d\cocos\editor-support\dragonBones\libDragonBones\libDragonBones.vcxproj)
添加引用和依赖项
依赖项:右击dbtest->生成依赖项->项目依赖项->勾选libDragonBones
引用:dbtest->引用->右击->添加引用->勾选libDragonBones(我用的vs2017,有不一样的百度下吧,别的版本记不清了)
2.4 现在直接运行项目依然会报错,说rapidJson/document.h找不到
好吧,还是附加包含目录的问题:右击libDragoBones->属性->配置属性->c/c++->常规->右侧附加包含目录->编辑, 将之前添加的..\..\libDragonBones改为$(EngineRoot)cocos\editor-support\dragonBones
不过现在$(EngineRoot)还没有定义,需要设置一下:
视图->其他窗口->属性管理器,在右侧属性管理器界面选择libGragonBones->Debug|Win32->右击->添加现有属性表,选择dbtest2\cocos2d\cocos\2d\cocos2d_headers.props。Release|Win32也同样添加下。(这里最好别添加新项目属性表,因为好多变量设置需要重新添加,比较麻烦)
好了,现在可以正确运行项目了,不过还无法在cocos2dx项目中调用DragonBones的方法。(这里备注下,因为我用的是vs2017,运行项目的时候会报错找不到windows sdk 版本8.1,如果有遇到同样问题的,请参考我的另一篇文章:https://blog.csdn.net/u010536615/article/details/66090149)
3. 调用DragonBones方法
3.1 导入代码
dbtest\cocos2d\cocos\editor-support\dragonBones下新建文件夹dbEngine,如图:
将DragonBonesCPP-master\Cocos2DX_3.x\src\dragonBones\cocos2dx下的文件拷贝到dbEngine文件夹下。
然后将dbEngine导入到项目中:
libDragonBones->源文件->右击->添加->新建筛选器->命名为dbEngine, 将dbtest\cocos2d\cocos\editor-support\dragonBones\dbEngine下的文件导入,control+c,control+v。
3.2 运行项目报错"Cannot recognize the target platform; are you targeting an unsupported platform?"
错误如下:
C1189 #error: "Cannot recognize the target platform; are you targeting an unsupported platform?" libDragonBones dbtest\cocos2d\cocos\platform\ccplatformconfig.h
双击错误提示,会发现是_WIN32未定义导致的。
解决方法:
libSpine项目->右击->属性->配置属性->c/c++->预处理器->右侧预处理器定义->编辑,将内容复制到libDragonBones项目同位置下。
3.3 测试
资源:
将DragonBonesCPP-master\Cocos2DX_3.x\Demos\Resources\mecha_1002_101d_show拷贝到dbtest\Resources下。
附加包含目录:
右击dbtest->属性->配置属性->c/c++->常规->右侧附加包含目录->编辑,增加$(EngineRoot)cocos\editor-support\dragonBones\dbEngine和$(EngineRoot)cocos\editor-support\dragonBones。
打开dbtest->src->HelloWorldScene.cpp:
引入头文件#include "CCDragonBonesHeaders.h"
在init()方法下增加代码:
//dragonbones
const auto factory = dragonBones::CCFactory::getFactory();
factory->loadDragonBonesData("mecha_1002_101d_show/mecha_1002_101d_show_ske.json");
//factory->loadDragonBonesData("mecha_1002_101d_show/mecha_1002_101d_show_ske.dbbin");
factory->loadTextureAtlasData("mecha_1002_101d_show/mecha_1002_101d_show_tex.json");
const auto armatureDisplay = factory->buildArmatureDisplay("mecha_1002_101d", "mecha_1002_101d_show");
armatureDisplay->getAnimation()->play("idle");
armatureDisplay->setPosition(0.0f, -200.0f);
addChild(armatureDisplay);
3.4 效果
左下角的机器人就是DragonBones骨骼动画。
4. lua项目
就是多了个DragonBones的C++方法导出给lua用的步骤(lua-binding)。
4.1 新建cocos2dx-lua项目
windows命令行输入cocos new dblua -p org.cocos2dx.com -d D:\ -l lua
4.2 dblua项目中导入libDragonBones项目(和上面dbtest项目过程一样,可以直接跳过)
将之前的C++项目dbtest\cocos2d\cocos\editor-support\dragonBones复制到新建的dblua项目中对应目录(D:\dblua\frameworks\cocos2d-x\cocos\editor-support\)。
vs打开新建的dblua项目
右击解决方案->添加->现有项目->选择libDragonBones项目(dblua\frameworks\cocos2d-x\cocos\editor-support\dragonBones\libDragonBones\libDragonBones.vcxproj)
添加引用和依赖项
依赖项:右击dblua->生成依赖项->项目依赖项->勾选libDragonBones
引用:dblua->引用->右击->添加引用->勾选libDragonBones(vs2017)
4.3 DragonBonesC++方法lua-binding
下载lua_cocos2dx_dragonbones_auto.cpp 和 lua_cocos2dx_dragonbones_auto.hpp两个文件。(这里说明下:1.下面的连接是我在网上下的,因为几乎完全不能用,然后就自己改了一些方法,让最简单的播放动画功能能用。2.csdn上传资源的时候没法选择免积分,所以就选了1积分。会lua-binding的直接忽略就行。)
lua_cocos2dx_dragonbones_auto.rar
将lua_cocos2dx_dragonbones_auto.cpp 和 lua_cocos2dx_dragonbones_auto.hpp引入到项目中:
(1)将下载的文件复制到D:\dblua\frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto下,如图:
(2)vs打开项目->libluacocos2d->auto->右键->添加->现有项->选择刚才复制的.hpp、.cpp文件(ctrl+c,ctrl+v也一样)。
4.4 注册lua-binding
打开D:\dblua\frameworks\cocos2d-x\cocos\scripting\lua-bindings\manual\lua_module_register.cpp
添加头文件:#include "scripting/lua-bindings/auto/lua_cocos2dx_dragonbones_auto.hpp"
添加代码:lua_module_register(lua_State* L)方法中添加register_all_dragonbones(L);
附加包含目录:libluacocos2d->属性->配置属性->c/c++->常规->右侧附加包含目录->编辑,增加下面四项:
$(EngineRoot)cocos\editor-support\dragonBones\dbEngine
$(EngineRoot)cocos\editor-support\dragonBones
$(EngineRoot)cocos\editor-support\dragonbones\dragonBones
$(EngineRoot)cocos\scripting\lua-bindings\manual
4.5 测试
资源:
将DragonBonesCPP-master\Cocos2DX_3.x\Demos\Resources\mecha_1002_101d_show拷贝到D:\dblua\res下。
代码:
打开D:\dblua\src\app\MyApp.lua,在MainScene:onCreate()方法中增加代码:
local factory = db.CCFactory:getFactory()
factory:loadDragonBonesData("mecha_1002_101d_show/mecha_1002_101d_show_ske.json")
factory:loadTextureAtlasData("mecha_1002_101d_show/mecha_1002_101d_show_tex.json")
local armatureDisplay = factory:buildArmatureDisplay("mecha_1002_101d", "mecha_1002_101d_show")
armatureDisplay:getAnimation():play("idle")
armatureDisplay:setPosition(100, 100)
self:addChild(armatureDisplay)
4.6 效果
5.打包Android
5.1 环境
AndroidStudio(SDK,NDK用的AndroidStudio默认下载的)+jdk-8u5
5.2 Android.mk
5.2.1 D:\dblua\frameworks\cocos2d-x\cocos\editor-support\dragonBones下新建Android.mk文件,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := dragon_bones_static
LOCAL_MODULE_FILENAME := libdb
LOCAL_ARM_MODE := arm
# ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
# MATHNEONFILE := math/MathUtil.cpp.neon
# else
# MATHNEONFILE := math/MathUtil.cpp
# endif
LOCAL_SRC_FILES := \
dragonBones/animation/Animation.cpp \
dragonBones/animation/AnimationState.cpp \
dragonBones/animation/BaseTimelineState.cpp \
dragonBones/animation/TimelineState.cpp \
dragonBones/animation/WorldClock.cpp \
dragonBones/armature/Armature.cpp \
dragonBones/armature/Bone.cpp \
dragonBones/armature/Constraint.cpp \
dragonBones/armature/DeformVertices.cpp \
dragonBones/armature/Slot.cpp \
dragonBones/armature/TransformObject.cpp \
dragonBones/core/BaseObject.cpp \
dragonBones/core/DragonBones.cpp \
dragonBones/event/EventObject.cpp \
dragonBones/factory/BaseFactory.cpp \
dragonBones/geom/Point.cpp \
dragonBones/geom/Transform.cpp \
dragonBones/model/AnimationConfig.cpp \
dragonBones/model/AnimationData.cpp \
dragonBones/model/ArmatureData.cpp \
dragonBones/model/BoundingBoxData.cpp \
dragonBones/model/CanvasData.cpp \
dragonBones/model/ConstraintData.cpp \
dragonBones/model/DisplayData.cpp \
dragonBones/model/DragonBonesData.cpp \
dragonBones/model/SkinData.cpp \
dragonBones/model/TextureAtlasData.cpp \
dragonBones/model/UserData.cpp \
dragonBones/parser/BinaryDataParser.cpp \
dragonBones/parser/DataParser.cpp \
dragonBones/parser/JSONDataParser.cpp \
dbengine/CCArmatureDisplay.cpp \
dbengine/CCFactory.cpp \
dbengine/CCSlot.cpp \
dbengine/CCTextureAtlasData.cpp
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/..
LOCAL_C_INCLUDES := $(LOCAL_PATH)/..
LOCAL_STATIC_LIBRARIES := cocos2dx_internal_static
include $(BUILD_STATIC_LIBRARY)
5.2.2 D:\dblua\frameworks\cocos2d-x\cocos\Android.mk修改
LOCAL_STATIC_LIBRARIES += spine_static下面,大概310行增加 :
LOCAL_STATIC_LIBRARIES += dragon_bones_static
$(call import-module,editor-support/spine)下面,大概332行增加:
$(call import-module,editor-support/dragonBones)
5.2.3 D:\dblua\frameworks\cocos2d-x\cocos\scripting\lua-bindings\proj.android\Android.mk修改
#spine下面,大概119行增加:
#dragonBones
LOCAL_SRC_FILES += ../auto/lua_cocos2dx_dragonbones_auto.cpp \
$(LOCAL_PATH)/../../../editor-support/spine \下面,大概152行增加:
$(LOCAL_PATH)/../../../editor-support/dragonBones \
5.3 修改lua_cocos2dx_dragonbones_auto.cpp
由于之前在vs上,libluacocos2d项目的lua_cocos2dx_dragonbones_auto.cpp文件调用libdb项目的代码时,用的附加包含目录,android编译时是获取不到vs上设置的路径的,所以这里将该文件引入的.h头文件做下修改。
#include "editor-support/dragonBones/dbEngine/CCDragonBonesHeaders.h"
#include "editor-support/dragonBones/dragonBones/DragonBonesHeaders.h"
5.4 AndroidStudio
用AndroidStudio打开D:\dblua\frameworks\runtime-src\proj.android
Build->Make Project,其间可能会有错误提示, 缺少组件一类的,根据提示点击安装就行了。提示类似:
Gradle sync failed: Failed to find Build Tools revision 27.0.1
最后点击绿色的三角图标Run。(我是直接打包到了真机上,就不发图了)
6.MAC版本
首先说明下,这篇文章是2018年11月份写的,现在加mac版的时间是2020年8月9号20:42。隔的比较久,但毕竟会用到,自己也会看看,所以还是加上。
6.1 环境
Xcode 11.5
6.2 在Xcode上运行前面第4大步骤的lua项目
找到上面完成的lua项目,dblua->frameworks->runtime-src->proj.ios_mac->dblua.xcodeproj->双击打开项目。
直接运行,如果是在模拟器上运行(真机上是没这个问题的,iphone XR ios13.5.1),Xcode 11.5版本会报错:
Argument value 10880 is outside the valid range [0, 255]
解决方法
btVector3.h文件 42行左右
将#define BT_SHUFFLE(x,y,z,w) ((w)<<6 | (z)<<4 | (y)<<2 | (x)) 后面加个 &0xff:
#define BT_SHUFFLE(x,y,z,w) ( ((w)<<6 | (z)<<4 | (y)<<2 | (x)) & 0xff)
6.3 将dragonBones导入项目
dblua->cocos2d_libs.xcodeproj->editor-support->右键->Add Files to "cocos2d_libs.xcodeproj",如图:
选择dragonBones,然后下方将libcocos2d ios勾选,点击Add。
然后将多余的文件移出项目(因为一次性选择的,所以有些没用的文件也会包含进来,当然一点一点操作,只将有用的文件导入进来也是可以的,就有点麻烦),如图:
将红框中的文件移出项目,右键->Delete->Remove References。(libdb对应之前的libDragonBones,我在后来的项目中改名了)
6.4 现在运行项目会报错
stdint.h 中 "Use this header only with Microsoft Visual C++ compilers!"等一堆的报错。
将rapidjson/msinttypes下的stdint.h和inttypes.h全部删除,右键msinttypes->Delete->Remove References,如图:
6.5 添加搜索路径
现在运行项目会报错:JSONDataParser.h文件中提示'rapidjson/document.h' file not found。
dblua->cocos2d_libs.xcodeproj->PROJECT->cocos2d_libs->Building Settings->searchPath->user header searchPath->增加
$(SRCROOT)/../cocos/editor-support/dragonBones。
6.6 添加lua_cocos2dx_dragonbones_auto.hpp和lua_cocos2dx_dragonbones_auto.cpp
直接运行会提示:
Undefined symbols for architecture arm64:
"register_all_dragonbones(lua_State*)", referenced from:
lua_module_register(lua_State*) in libluacocos2d iOS.a(lua_module_register.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
导入文件:
dblua->cocos2d_lua_bindings.xcodeproj->auto->右键->Add Files to "cocos2d_lua_bindings.xcodeproj",同6.3,选择上面两个文件。
同样要添加搜索路径,否则会报错'dragonBones/DragonBonesHeaders.h' file not found。
dblua->cocos2d_lua_bindings.xcodeproj->PROJECT->cocos2d_lua_bindings->Building Settings->searchPath->user header searchPath->增加$(SRCROOT)/../../../editor-support/dragonBones。
同样也是真机运行,就不发图了。