DragonBones官方已经提供了cocos2d-x的库文件SkeletonAnimationLibraryCPP, 目前支持到了2.2. 但是并未提供3.0版本的库,官方说3.0发布正式版时会支持.

如果现在就要使用3.0版本的话稍作修改也是可以实现的.

另外需要注意的是,在写文章时,这个库的master分支貌似有bug,需要使用dev分支的源码修改.

以下DragonBonesdb表示.

在项目的wiki中已经说明,平台有关的文件只有以下几个:

  • Cocos2dxAtlasNode.cpp db中使用使用的基本现实对象,类似cocos2d-x中的Node
  • Cocos2dxDisplayBridge.cpp dbcocos2d-x现实对象的操作中间件
  • Cocos2dxFactory.cpp db的生成工厂
  • Cocos2dxTextureAtlas.cpp db读取texture的类

其实对于Cocos2dxAtlasNode.cpp可以用Sprite代替, Cocos2dxTextureAtlas.cpp只用用SpriteFrameCache就好了.

所以这两个类不用改,删掉就好了.

为了实现这一目的,我们需要在db导出素材时选择Zip(XML+PNGS), 这是为了我们可以使用TexturePacker来打包图片素材,用SpriteFrameCache加载. TexturePacker的打包还是很让人称赞的.

db导出选项

导出以后解压zip,把texture文件夹下的图片用TexturePacker打包到成plist就可以用一下函数加载了:

1
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("xxx.plist");

下面修改Cocos2dxFactory.cpp.

  • CC前缀的修改
  • CCNode.h等头文件路径的修改

主要是这个函数:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
//这个函数用来根据db的数据生成cocos2d-x的显示对象
Object* Cocos2dxFactory::generateDisplay(ITextureAtlas *textureAtlas, const String &fullName, Number pivotX, Number pivotY)
{
    std::stringstream ss;
    ss << fullName << ".png";

    //用资源名直接用缓存里生成Sprite
    auto sp = cocos2d::Sprite::createWithSpriteFrameName(ss.str());
    auto size = sp->getContentSize();
    sp->setCascadeOpacityEnabled(true);
    //设置sp的注册点,注意Y方向,flash和cocos2d-x的坐标系不同
    sp->setAnchorPoint(cocos2d::Point(
        pivotX / (float)size.width,
        1.0f - pivotY / size.height
        ));
    return new CocosNode(sp);
}

Cocos2dxDisplayBridge.cpp基本只用修改头文件和CC前缀就好了, 这个文件只要勇于操作cocos2d-x的显示对象的各种变换和添加移除.

删除其余的Cocos2dx开头的文件,修复各种编译错误.

然后就可以用了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Zombie/t.plist");

dragonBones::Cocos2dxFactory fac;
dragonBones::XMLDataParser parser;
dragonBones::XMLDocument doc;

doc.LoadFile("Zombie/skeleton.xml");
fac.addSkeletonData(parser.parseSkeletonData(doc.RootElement()));

_zombie = fac.buildArmature("Zombie_polevaulter", "", "Zombie");
auto skeletonNode = static_cast<dragonBones::CocosNode*>(_zombie->getDisplay())->node;
skeletonNode->setPosition(50, 300);
addChild(skeletonNode);
_zombie->getAnimation()->gotoAndPlay("anim_walk");

因为db结构很好,和平台相关的类封装的都很好, 所以修改起来很方便.

其实我们只不过修改了generateDisplay函数,改为使用Sprite这样避免了对Cocos2dxAtlasNode的使用. 利用了cocos2d-x自己的素材加载函数,避免了对Cocos2dxTextureAtlas的使用.

额外一些工作就是删除文件,修改头文件路径,修改编译错误.