dragonBones的闪退问题,已解决

感谢各位大神的帮助,问题已解决

以下例子是动态加载骨骼动画并设置到已有骨骼组件上的例子,已测试web和原生均无问题
系统 macos
ccc版本 cocos creator1.9.0
原生构建方式 link

https://pan.baidu.com/s/1pFy6ludsEKHVGrUt7iZXBQ

解决问题的代码是在给骨骼组件设置新的资源前加上:

        //如果没有这一行,原生平台会闪退
        cc.sys.isNative && armatureDisplay._factory.clear()

        //如果没有这三行,web平台会爆找不到动画的警告
        armatureDisplay.armatureName = null;
        armatureDisplay.dragonAsset = null;
        armatureDisplay.dragonAtlasAsset = null;
1赞

说真的,我也是无语了,开始以为你逻辑可能有问题,所以去看了你代码,没有问题,你的龙骨动画armature都不调的吗

this._isMecha = false
var animationDisplay = cc.find(“New Node”,this.node).getComponent(dragonBones.ArmatureDisplay);
this.loadDragonBones(animationDisplay,“Texture/mecha/”,‘mecha_1502b’,“stand”,1)

var animationDisplay = cc.find(“New Node”,this.node).getComponent(dragonBones.ArmatureDisplay);
this.loadDragonBones(animationDisplay,“Texture/dragon/”,‘armatureName’,“stand”,1)

记得把第三个参数换成你需要

崩溃的原因是你用的龙骨动画里面,压根没有你用到的名字,仔细检查一下

谢谢回复,我已经改好了,但是闪退依旧
var node = cc.find(“New Node”,this.node)
var armatureDisplay = node.getComponent(dragonBones.ArmatureDisplay)
if(this._isMecha){
this._isMecha = false
this.loadDragonBones(armatureDisplay,“Texture/dragon/”,‘armatureName’,“stand”,0)
}
else{
this.loadDragonBones(armatureDisplay,“Texture/mecha/”,‘mecha_1502b’,“walk”,0)
}

你的闪退是在什么情况下出现的?还是每次动画的时候都会闪退

1赞

谢谢大神关注我的问题:grin: 感谢感谢
在原声平台,每次点击按钮都会闪退,代码已更新,新的连接麻烦看下
https://pan.baidu.com/s/1-H8fvlHw3R5fmsgpqkWgeQ

在你的代码里添加了3行,你看看原生平台还会不会崩溃:

  loadDragonBones(armatureDisplay, path, armatureName, newAnimation){
        cc.loader.loadResDir(path, function(err, assets){
            if(err || assets.length <= 0)  return;
            armatureDisplay.armatureName = "";
            armatureDisplay.dragonAsset = null;
            armatureDisplay.dragonAtlasAsset = null;

            for ( let i = 0; i < assets.length; i++ ) {
                if (assets[i] instanceof dragonBones.DragonBonesAsset) {
                    armatureDisplay.dragonAsset = assets[i];
                }
        
                if (assets[i] instanceof dragonBones.DragonBonesAtlasAsset) {
                    armatureDisplay.dragonAtlasAsset = assets[i];
                }
            }
    
            armatureDisplay.armatureName = armatureName;
            armatureDisplay.playAnimation(newAnimation, 1);
            
        })
    },

继续谢谢大手持续关注

加了这三行后,崩溃依旧,报错也没变

帮你稍微的调整了一下代码 浏览器没有爆黄警告 但是真机没测试 没时间 你自己试试吧

cc.Class({
    extends: cc.Component,

    properties: {
        _isMecha:true,
    },

    loadDragonBones(armatureDisplay, path, armatureName, newAnimation){
        cc.loader.loadResDir(path, function(err, assets){
            if(err || assets.length <= 0)  return;

			 assets.forEach(asset => {
                if(asset instanceof dragonBones.DragonBonesAsset){
                    armatureDisplay.dragonAsset = asset;
                }
                if(asset instanceof dragonBones.DragonBonesAtlasAsset){
                    armatureDisplay.dragonAtlasAsset = asset;
                }
            });  
            armatureDisplay.armatureName = armatureName;
            armatureDisplay.playAnimation(newAnimation, 1);
            
        })
    },

    onClick(){
        var node = cc.find("New Node",this.node)
        var armatureDisplay = node.getComponent(dragonBones.ArmatureDisplay)
		armatureDisplay.dragonAsset = null;        //(初始化)
		armatureDisplay.dragonAtlasAsset = null;  //(初始化)
		armatureDisplay.armatureName = null;  //(初始化)
        if(this._isMecha){
            this._isMecha = false;
            this.loadDragonBones(armatureDisplay,"Texture/dragon/",'armatureName',"stand",0)
        }
        else{
	    this._isMecha = true;
            this.loadDragonBones(armatureDisplay,"Texture/mecha/",'mecha_1502b',"walk",0)
        }
    },
});

按照您给的建议修改后,我发现问题更明确了
骨骼组件第一次设置为某个骨骼已经没有问题了,但是第二次设置为这个骨骼的时候依然崩溃
比如第一次设置为龙,没有问题,再次设置为龙或者设置为机甲后再次设置为龙,会崩溃,且没有崩溃日志

谢谢大神抽空帮看

按照您给的建议修改后,我发现问题更明确了
骨骼组件第一次设置为某个骨骼已经没有问题了,但是第二次设置为这个骨骼的时候依然崩溃
比如第一次设置为龙,没有问题,再次设置为龙或者设置为机甲后再次设置为龙,会崩溃,且没有崩溃日志

@jare @panda 求大牛们关注一下,帮忙看看,线上项目,着急:grin:谢谢啦

cc.sys.isNative && this.db._factory.clear(false)
    db.dragonAsset = armatureDisplay.dragonAsset
    db.dragonAtlasAsset = armatureDisplay.dragonAtlasAsset
    db.armatureName = 'Armature'
1赞

谢谢大神的帮助,问题已解决
还想问问大神你是怎么知道_factory.clear(false)的,我看文档都没有啊

可以看源码:grinning:

这个bug竟然已经几个月了,无力吐槽!