ArmatureDisplay 的 complete 回调中调用playAnimation 导致崩溃

creator 1.5.2

ArmatureDisplay 的 complete 回调中调用playAnimation 导致崩溃

以下代码,在web平台上不会崩溃,在模拟器上,执行回调的时候会崩溃。。

是我这样的用法不对吗?如果不对,请问如何在一个动作播放完后能播放一个默认的待机动作?

cc.Class({
    extends: cc.Component,

    properties: {
    },

    onLoad: function () {
        let tempNode = cc.find("temp_node", this.node);
        let armatureDisplay = tempNode.getComponent(dragonBones.ArmatureDisplay);
        armatureDisplay.addEventListener(dragonBones.EventObject.COMPLETE, this.animationCompleted, armatureDisplay);

    },

    animationCompleted: function(event){
        this.playAnimation("daiji", 0);
    }
});

应该是

armatureDisplay.addEventListener(dragonBones.EventObject.COMPLETE, this.animationCompleted, this);

把。。。

不过崩溃的报错看起来跟回调没什么关系,你需要贴一下 native 崩溃的调用栈

我这边把armatureDisplay 作为target 传入 addEventListener 的target 是因为找不到关于回调函数的的参数都是什么含义,什么类型,而且我也把我回调里的event打印出来过,内容很多,没发现有骨骼动画的节点,可能是我漏了

我这个脚本不是挂在骨骼动画的节点上的,所以我不是用this作为target,而且我想在回调中播放待机动作,所以就把armatureDisplay 当作 target了。这样我在回调函数中的this就等同于 armatureDisplay,就可以 this.playAnimation(“daiji”, 0); 这样调用默认动作。

我验证过回调函数中的this 确实就是我传入的target。

而且确实是因为回调函数中的 this.playAnimation(“daiji”, 0); 这句导致的崩溃,我注释掉这行的话就不会崩溃了。这里不应该崩溃才对。。。文档里好像也没说 不能在 回调函数里 调用 armatureDisplay 的 playAnimation 接口。至少同样的代码在web上可以,在模拟器上却不行。

至于native崩溃堆栈,我不知道creator 的模拟器崩溃时要如何得到堆栈,可以请教一下如何得到native的堆栈吗?


后来我看到下面的连接发现有个 isPlaying 的东西,所以直接在update中判断是否是isPlaying,如果不是,就播放待机动作


发现我这问题在下面的连接里也有提到。。这里有几点问题想说,

1、为什么不同平台的接口要设计成不一样的,在native上 isPlaying 是函数类型,而在web上却是 boolean 类型。。。而且时不时的也会发现不同平台的相同功能接口也是不一样的。。。既然是跨平台的引擎为什么要这么设计,而且文档可以说基本都没有的样子。。。

2、就是文档的问题了。比如这个问题中,我看的 ArmatureDisplay 这个文档里看到armature() 这个接口得到Armature 对象。。而这Armature 类型就不知道上哪里查了,后来我搜到下面这个连接才发现 ArmatureDisplay.armature() .animation 有这种操作的。。。可能因为我是从creator直接开始的,不是从cocos c++或js开始的原因,但是很多开发者应该都碰到过和我同样的情况,很多时候文档查着查着就查不下去了。。。

我只是陈述一下我对creator的体验情况。哪里说错了,请包涵一下:sweat_smile:

http://forum.cocos.com/t/dragonbones-bug/44529

用 default 或者 link 模版构建,然后用 Visual Studio 打开 build/jsb-link/frameworks/runtime-src/proj.win32 里面的 sln 文件,然后编译运行,崩溃时,选择中止,就会停止在崩溃的位置,可以在 visual studio 的 call stack 中找到调用栈

好的,谢谢啦。。。

还有那个崩溃问题,我发的那个连接说真的我没看懂,那是1.4版本就存在的问题了。或者骨骼动画可以设置默认动作吗?当没有播放任何动作的时候自动播放待机动作的功能

那个链接里面回复是说可能是 Dragon Bones 运行时的 bug,可能跟 fade 有关系,但是应该只是在 windows 平台,如果你测试 iOS Android 没问题的话,就暂时先不管把

好的。。还没测android 和 iOS 的。。。我就先在update中判断 isPlaying 解决这个需求就好。。。下面堆栈信息

报错信息应该挺明显的了,就是迭代器在迭代时不可修改,这个是 dragonbone 底层的实现,我们目前没办法修复。你这边的解决方法应该是不要在 onComplete 的时候立刻播放动画,而是延迟一帧再播放。