关于Animation延迟播放的BUG,以及临时的解决办法

策划提了一个需求:多个相同特效播放时希望能有一点先后的感觉。
为此查了一下API文档,发现AnimationState有一个delay属性:延迟多少秒播放
这正好符合要求,于是写了下面的代码验证:

var ani = this.sprite.getComponent(cc.Animation);
var state = ani.getAnimationState("test");
state.delay = 1;
ani.play("test");

运行后发现动画根本没有延迟,自己来研究一下为什么。
看了代码之后发现在animation\type.jsAnimationNode.update方法里面有这一段:

 if (this._duringDelay) {
	this._timeNoScale += delta;
	if (this._timeNoScale < this.delay) {
		return;
	}
	...

也就是延迟的判断依赖于_duringDelay这个属性,往上看,发现在AnimationNodeAnimationState的父类)的构造函数中有:

if (this.delay > 0) {
	this._duringDelay = true;
}

也就是this.delay大于0,这个属性才生效,但原因在于构造函数里面,this.delay根本就没有机会设置。而我上面的代码设置已经晚了,作用不到_duringDelay这个成员了。所以,也就是说AnimationState.delay这个特性基本上是没有的。

但是要在外部达到延迟的目的也是可以的,方法很简单,就是在外部手动设置_duringDelay ,代码就成这样:

var ani = this.sprite.getComponent(cc.Animation);
var state = ani.getAnimationState("test");
state.delay = 1;
state._duringDelay = true;
ani.play("test");

这个代码在浏览器和模拟器下验证通过 ,可以延迟。在这里写下这一点小技巧,以帮助那些遇到同样问题的人。

但是用这种修改内部属性的方法,终究不是个办法呀,万一新版本改掉了呢?而作为列在API文档里面的特性,正常使用不生效,这个有点说不过去吧。希望官方修改一下,原因都在上面了。

@panda @jare @nantas

3赞

关注~

收到,已记录