cocos2dx&cocos2dx-lua项目导入龙骨DragonBones

前言

本来我也是直接百度的,看看有没有现成的方法,然而看了几篇,没有能直接用的,只能自己搞了。

那为什么不用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。

同样也是真机运行,就不发图了。

 

 

 

 

 

 

 

 

                             

 

 

 

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
cocos2dx-lua中,使用ScrollView加载大量项目可以通过以下步骤实现: 1. 创建一个ScrollView,并设置其大小和位置。 ```lua local scrollView = ccui.ScrollView:create() scrollView:setContentSize(cc.size(500, 500)) scrollView:setPosition(cc.p(0, 0)) ``` 2. 设置ScrollView的滚动方向和滚动条位置。 ```lua scrollView:setDirection(ccui.ScrollViewDir.vertical) scrollView:setScrollBarPositionFromCorner(cc.p(7, 7)) ``` 3. 创建一个容器,用于存储要加载的内容。 ```lua local container = ccui.Layout:create() container:setContentSize(cc.size(500, 10000)) scrollView:addChild(container) ``` 4. 定义一个函数,用于加载每一项内容到容器中。 ```lua local function loadItem(index) local item = ccui.Text:create() item:setString("Item " .. index) item:setPosition(cc.p(250, 10000 - index * 50)) container:addChild(item) end ``` 5. 在ScrollView的回调函数中,根据滚动位置动态加载内容。 ```lua local function scrollViewEvent(sender, eventType) if eventType == ccui.ScrollviewEventType.scrolling then local pos = scrollView:getInnerContainer():getPosition() local top = scrollView:getContentSize().height local bottom = top - scrollView:getInnerContainerSize().height if pos.y < bottom + 500 then for i = 1, 10 do loadItem(i) end end end end scrollView:addScrollViewEventListener(scrollViewEvent) ``` 这样,当用户滚动到ScrollView的底部时,会自动加载10个新的内容项到容器中。通过判断ScrollView的滚动位置,只有当滚动到接近底部时才会加载新的内容项,避免一次性加载大量的内容导致卡顿。可以根据实际需求调整每次加载的内容数量和内容项的布局样式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值