cocos2d-x -lua 导入龙骨动画

cocos2d-x 导入龙骨动画

开发环境

win10+VS2017+cocos2d-x 3.17

参考示例

DrangonBones项目源码下载

https://github.com/DragonBones/DragonBonesCPP

  1. 下载后目录如下

    DragonBonesCPP-master:
    在这里插入图片描述

创建cocos2d-x 项目

1. 下载官网cocos2d-x 3.17版本

网址:https://www.cocos.com/cocos2dx

2. 解压下载的zip包,运行脚本,创建工程。

  1. 打开脚本目录
    C:\cocos2d-x-3.17\tools\cocos2d-console\bin
  2. 运行脚本创建工程
    1. Shift+鼠标右键=》在此处打开Powershell窗口

    2. 输入命令

    3. C++工程
      windows命令行输入cocos new dbtest -p org.cocos2dx.com -d D:\ -l cpp
      生成一个dbtest文件夹(C++工程)

    4. lua工程
      cocos new dblua -p org.cocos2dx.com -d D:\ -l lua
      生成一个dblua文件夹(lua工程)

新建DragonBones静态库项目

1. 新建项目

  1. 打开Visual Studio,文件->新建->项目:
  2. 上面选择空项目名称填libDragonBones(当然也是可以随便添的, 不过后面要用到这个项目名称,添其他名字的后面要对应上。以下涉及名称的都不再重复)
  3. 路径位置自己随意

2. 复制示例中的代码

将目录中的下面2个文件夹复制到DragonBones静态库项目工程目录下

DragonBonesCPP-master\DragonBones\src\dragonBones
DragonBonesCPP-master\3rdParty\rapidjson
上面2个文件夹复制到 libDragonBones
在这里插入图片描述

3. 导入文件到静态库项目

在项目的源文件中新建很多文件夹,目录结构和示例中的一致。
建好后,每个文件夹添加现有项,选中对应文件夹中的所有文件,导入。
导入完成后和截图一致。
在这里插入图片描述

4. 直接运行报错

报错内容:
rapidJson/document.h找不到
解决方式:
右击libDragoBones->属性->配置属性->c/c+±>常规->右侧附加包含目录->编辑->增加…\libDragonBones(根据实际情况自行修改)

5. F5调试报错

报错内容:
缺少msvcr110.dll
解决方式:
下载文件,安装。
http://www.microsoft.com/zh-CN/download/details.aspx?id=30679
https://jingyan.baidu.com/article/4f7d57129fa86e1a201927de.html

6. 编译报错

报错内容:
.exe 不包含适合入口点的静态“Main”方法
解决方式:
采用静态库方式。编译通过,生成dll文件。
https://blog.csdn.net/u010716604/article/details/50246457

cocos2d cpp项目中导入libDragonBones项目

1. 文件导入

将之前创建的dbtest工程打开,在路径dbtest\cocos2d\cocos\editor-support\下创建文件夹dragonBones
在这里插入图片描述

复制libDragonBones项目目录下的所有文件
拷贝到dbtest\cocos2d\cocos\editor-support\dragonBones\下
(.vs和.sln不用拷贝)
在这里插入图片描述

2. cocos2dx cpp项目中导入libDragonBones项目

  1. 添加静态项目libDragonBones

    1. vs打开dbtest项目

    2. 右击解决方案->添加->现有项目->选择libDragonBones项目
      (dbtest\cocos2d\cocos\editor-support\dragonBones\libDragonBones\libDragonBones.vcxproj)

  2. 添加引用和依赖项

    1. 依赖项:右击dbtest->生成依赖项->项目依赖项->勾选libDragonBones

    2. 引用:dbtest->引用->右击->添加引用->勾选libDragonBones(我用的vs2017,有不一样的百度下吧,别的版本记不清了)

  3. 直接运行报错解决

    报错内容:
    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也同样添加下。(这里最好别添加新项目属性表,因为好多变量设置需要重新添加,比较麻烦)

  4. 编译通过
    因为VS版本和windows SDK版本不同。可能会编译不通过。
    通过重定解决方案目标解决,将项目的window SDK升级

3. 调用DragonBones方法

  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。
    在这里插入图片描述

  2. 运行项目报错
    报错内容:
    #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. 测试
    资源:
    将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);
  1. 测试效果
    在这里插入图片描述

    修改窗口大小:
    dbtest=>Classes=>AppDelegate.cpp文件中修改

lua项目中导入libDragonBones项目

1. libDragonBones静态库导入

和C++项目导入的方式一模一样,按照上面的步骤走一遍即可

  1. 添加libDragonBones项目
  2. 添加引用和依赖项

2. DragonBonesC++方法lua-binding

1. 绑定方式1
  1. 下载绑定文件
    lua_cocos2dx_dragonbones_auto.cpp
    lua_cocos2dx_dragonbones_auto.hpp
    (需要一个积分,积分必须最少充值98月卡才行。)

  2. 绑定过程

    1. 将下载的文件复制到D:\dblua\frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto下,如图:
      在这里插入图片描述

    2. vs打开项目->libluacocos2d->auto->右键->添加->现有项->选择刚才复制的.hpp、.cpp文件(ctrl+c,ctrl+v也一样)。
      在这里插入图片描述

    3. 注册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

  3. 测试
    资源:
    将DragonBonesCPP-master\Cocos2DX_3.x\Demos\Resources\mecha_1002_101d_show拷贝到D:\dblua\res下。
    编译通过后,替换的路径D:\dblua\simulator\win32\下的

    代码:
    打开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)
  1. 效果
    在这里插入图片描述
2. 绑定方式2

由于缺少积分,没有绑定文件。只能采用别的方式。方式1并未测试是否可行。

  1. 获取绑定文件
    Quick-Cocos2dx-Community官网:http://cocos2d-lua.org/
    Quick-Cocos2dx-Community 3.7.6(Android arm64,龙骨) 版本中加入了龙骨

    下载3.76版本:
    https://pan.baidu.com/s/1Uuy6Yo3Y-zc607pSt91SLQ

    找到绑定的文件:
    打开quick项目,在libluacocos2d=》manual=》dragonBones 文件夹中有梦寐以求的绑定文件。
    lua_dragonBones.cpp
    lua_dragonBones.hpp

  2. 绑定过程

    1. 修改文件名称(也可以不改)
      lua_dragonBones.cpp =》lua_cocos2dx_dragonbones_auto.cpp
      lua_dragonBones.hpp =》lua_cocos2dx_dragonbones_auto.hpp

      修改名称后cpp会报错,引入的头文件名称变了。修改一下。
      其它头文件也有报错,文件其实存在,采用全路径引入即可。
      lua_cocos2dx_dragonbones_auto.cpp文件中最顶上,改为这些头文件路径
      #include “scripting/lua-bindings/auto/lua_cocos2dx_experimental_auto.hpp”
      #include “2d/CCFastTMXLayer.h”
      #include “2d/CCFastTMXTiledMap.h”
      #include “scripting/lua-bindings/manual/tolua_fix.h”
      #include “scripting/lua-bindings/manual/LuaBasicConversions.h”

    2. 开始绑定
      按照绑定方式1的步骤走一遍。

    3. 编译项目
      编译通过

  3. 测试
    运行:
    D:\dblua\simulator\win32\dblua.exe
    运行结果:
    失败
    提示内容:
    并没有控制台窗口,坑爹,没法查信息。

  4. 在lua项目中增加控制台窗口
    打开dblua=>win32=>main.cpp
    增加console窗口代码
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
    AllocConsole();
    freopen(“CONIN " , " r " , s t d i n ) ; f r e o p e n ( " C O N O U T ", "r", stdin); freopen("CONOUT ","r",stdin);freopen("CONOUT”, “w”, stdout);
    freopen(“CONOUT$”, “w”, stderr);
    #endif

        #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
               FreeConsole();
        #endif
    

    代码具体位置参考下面的完整代码:

#include "main.h"
#include "SimulatorWin.h"
#include <shellapi.h>

int WINAPI _tWinMain(HINSTANCE hInstance,
       HINSTANCE hPrevInstance,
       LPTSTR    lpCmdLine,
       int       nCmdShow)
{
       UNREFERENCED_PARAMETER(hPrevInstance);
       UNREFERENCED_PARAMETER(lpCmdLine);
       #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
              AllocConsole();
              freopen("CONIN$", "r", stdin);
              freopen("CONOUT$", "w", stdout);
              freopen("CONOUT$", "w", stderr);
       #endif
    auto simulator = SimulatorWin::getInstance();
    return simulator->run();
       /* Add By Diyal.yin 添加Win下控制台输出消息 */
       #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
              FreeConsole();
       #endif
}
  1. 重新运行,查看报错信息
    local factory = db.CCFactory:getFactory()
    factory:loadDragonBonesData(“mecha_1002_101d_show/mecha_1002_101d_show_ske.json”)
    报错原因:
    factory这个对象为空。
    问题分析:
    1. 查看lua_cocos2dx_dragonbones_auto.cpp文件的绑定,发现并没有getFactory()方法,
    尝试添加方法,但是返回的对象没有int nIDint* pLuaID属性,而且通过getFactory()方法也获取不到对象。
    2. quick官方既然绑定了,那么它是怎么运行的。查找quick里面的示例,并没有找到。
    创建一个新的工程,创建时,打开了python编辑器(跟本人电脑的编辑器默认配置有关),
    坑爹。quick项目需要用python2.x版本运行。python3.x会有很多语法错误,主要是print部分。
    懒得修改报错,安装python2.7,安装后,增加工程运行配置,选择python2.7,修改python最底下的包名和目录,
    运行python脚本,创建工程,但是创建之后,并没有res和src目录,也没有报错信息,令人绝望。
    3. 找到引擎目录samples下有2个demo。将代码拷贝进去运行,还是报错。再次绝望。
    查找官方的文档,发现骨骼动画下面,有新增一栏,
    dragonBones 用法说明
    http://cocos2d-lua.org/doc/dragonbones/index.md

    -- json 只需解析一次, runtime 自带 cache 功能
    if not app._isLoaded then
            dragonBones.CCFactory:loadDragonBonesData("mecha_1004d/mecha_1004d_ske.json")
            dragonBones.CCFactory:loadTextureAtlasData("mecha_1004d/mecha_1004d_tex.json")
            app._isLoaded = true
    end
    local db = dragonBones.CCFactory:buildArmatureDisplay("mecha_1004d")
    self.db = db
    local ani = db:getAnimation()
    ani:play("walk") -- 用于第一次播放
    db:addDBEventListener("loopComplete", function(event)
            local attackState = ani:getState("attack_01")
            if not attackState then
                    attackState = ani:fadeIn("attack_01", 0.1, 1, 1)
                    attackState:setResetToPose(false)
                    attackState:setAutoFadeOutTime(0.1)
                    attackState:addBoneMask("chest")
                    attackState:addBoneMask("effect_l")
                    attackState:addBoneMask("effect_r")
            end
    end)
    db:addTo(self):center()
    
  2. 替换示例代码和资源重新运行。
    感觉有希望了,不采用方案1中的代码,拷贝官方说明中的资源和代码,运行,继续报错。
    报错原因:
    没有addchild方法。
    报错分析:
    代码是添加到MyApp.lua中,它并不是一个节点。
    将代码改到MainScene.lua中,问题解决。
    运行quick中samples的demo,动画出来了。
    在这里插入图片描述

  3. 重新修改dblua工程中的代码和资源
    将刚才运行成功的代码和资源分别拷贝到D:\dblua\simulator\win32\的res和src中

  4. 运行dblua项目
    运行失败
    报错原因:
    提示app不存在
    问题分析:
    app可能只在quick工程中存在。
    注释掉有app的代码。

    重新运行,还是失败。
    报错信息:
    db:addTo(self):center()
    center()方法没有
    删除居中的代码
    db:addTo(self)

    再次运行,成功!
    在这里插入图片描述

打包成so文件 (待续)

参考:http://cocos2d-lua.org/doc/buildapk/index.md

注意事项:
1、ndk安装,环境变量的设置。
2、build_native.py 脚本编译。
3、so体积优化,路径: frameworks/runtime-src/proj.android/libcocos2dx/jni/Application.mk
4、lua手动绑定文件加入: frameworks/runtime-src/proj.android/libcocos2dx/jni/Android.mk

mac环境变量添加:
在~/.bash_profile文件中加入下面代码:
PATH=/usr/local/bin:$PATH:/Users/u0u0/bin/android-ndk-r10d
请理解shell的工作原理,并灵活修改path变量。
最后运行下面的命令刷新shell的path:
$source ~/.bash_profile

运行 build_native.py 脚本编译 native 代码
环境变量只需第一次设置,再确保引擎的setup.sh或setup.bat正确运行后,你就可以直接运行 build_native.py 来编译 native 代码了。
build_native.py 有几个可选参数,如下:
NAME
build_native –

SYNOPSIS
build_native [-h] [-r] [-c]

-h 输出帮助信息
-r 编译release版本
-c 清理编译环境

build_native.py 在编译成功后,会自动拷贝 res , src 到assert目录,每当这两个文件夹下的数据有改动的时候,你都应该再次运行 build_native.py 脚本。别担心,native代码不会再次编译,整个过程很快就会完成。

so文件体积的优化
Quick 对 Android 的 Native 编译进行了模块化设置,可以根据游戏实际用到的功能进行裁剪,从而达到减少包体积的目的。
打开项目下的frameworks/runtime-src/proj.android/libcocos2dx/jni/Application.mk文件,找到如下的代码片段:
CC_USE_CURL := 1 # 1使用curl的http,0使用Java http
CC_USE_CCSTUDIO := 1 # CocoStudio runtime
CC_USE_CCBUILDER := 1 # CocosBuider runtime
CC_USE_SPINE := 1 # Spine runtime
CC_USE_PHYSICS := 1 # Chipmunk库
CC_USE_TIFF := 1 # TIFF库
CC_USE_WEBP := 1 # webp库
CC_USE_JPEG := 1 # jpeg 库
CC_USE_3D := 1 # Cocos 3D 支持
CC_USE_SQLITE := 1 # Sqlite 支持
CC_USE_UNQLITE := 1 # UnQLite 支持
CC_USE_PROTOBUF := 1 # Google protocol buffers 数据协议
CC_USE_SPROTO := 1 # 云风的 Sproto 数据协议
后面的备注已说明模块的作用,如需关掉,只需要把 1 改为 0,例如关闭 Sproto 支持:
CC_USE_SPROTO := 0
修改完毕,再次运行build_native.py编译so库。

lua绑定类添加:
打开项目下的frameworks/runtime-src/proj.android/libcocos2dx/jni/Android.mk文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := cocos2dlua_shared

LOCAL_MODULE_FILENAME := libcocos2dlua

LOCAL_SRC_FILES := hellolua/main.cpp \
../../../Classes/VisibleRect.cpp \
../../../Classes/AppDelegate.cpp \
../../../Classes/LuaBridge.cpp


LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/../../../Classes \
$(COCOS2DX_ROOT)/external \
$(COCOS2DX_ROOT)/quick/lib/quick-src \
$(COCOS2DX_ROOT)/quick/lib/quick-src/extra

LOCAL_STATIC_LIBRARIES := extra_static
LOCAL_STATIC_LIBRARIES += cocos2d_lua_static
LOCAL_STATIC_LIBRARIES += lua_extensions_static

include $(BUILD_SHARED_LIBRARY)

$(call import-module,scripting/lua-bindings/proj.android)
$(call import-module, quick-src/lua_extensions)
$(call import-module, quick-src/extra)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值