cocos creator动态加载DragonBones

cocos creator动态加载DragonBones_第1张图片
根据creator的龙骨组件来看的话添加一个龙骨的话需要设置五个地方,分别是DragonAsset(龙骨的配置json文件),DragonAtlas(龙骨的纹理json资源),Armature(Armature名称),Animation(Animation名称),playTimes(动画的循环次数)。
如果只是播放一个单一的龙骨的话直接把资源拖到相应的位置,设置一下动画然后就ok了,但是需要切换不同的龙骨的资源的时候要咋办?按照我的经验来说的话有如下三点可以解决:

  1. 制作成预制资源,在需要的时候加载不同的预制体。
  2. 事先把每个需要用到的龙骨附加到不同的节点,然后根据需要哪个龙骨进行显示跟隐藏。
  3. 动态加载龙骨,利用一个DragonBones组件,当需要不同的龙骨资源的时候动态加载龙骨资源并附到组件上面。

分析上面三点的话,肯定是3最省事省心,1跟2的话没有什么难点,无非就是控制好加载哪个预制体,控制哪个节点的显示。接下来就说说如何实现动态加载龙骨。

动态加载龙骨的思路:利用loader加载需要用到的龙骨资源,然后把需要用到的资源赋值给龙骨组件,设置好各项的参数。
代码如下

    /**
     * 动态加载龙骨
     * @param animationDisplay  龙骨组件
     * @param path              龙骨地址
     * @param armatureName      Armature名称
     * @param newAnimation      Animation名称
     * @param completeCallback  动画播放完毕的回调
     * @param playTimes         播放次数 -1是根据龙骨文件 0五险循环 >0是播放次数
     */
    loadDragonBones(animationDisplay, path, armatureName, newAnimation, completeCallback, playTimes = 1) {  //动态加载龙骨
        cc.loader.loadResDir(path, function(err, assets){

            if(err || assets.length <= 0)  return;

            assets.forEach(asset => {
                if(asset instanceof dragonBones.DragonBonesAsset){
                    animationDisplay.dragonAsset = asset;
                }
                if(asset instanceof dragonBones.DragonBonesAtlasAsset){
                    animationDisplay.dragonAtlasAsset  = asset;
                }
            });

            animationDisplay.armatureName = armatureName;
            animationDisplay.playAnimation(newAnimation, playTimes);
            animationDisplay.addEventListener(dragonBones.EventObject.COMPLETE, completeCallback);
        })
    }

在实现的过程中遇到的几个坑记录一下,一个是armatureName跟Animation一定要一起设置,设置一个的话是不起作用的。用animationDisplay.playTimes = 1的方式设置播放次数也是不起作用,必须要在playAnimation方法里面设置才生效。

你可能感兴趣的:(cocos,creator)