-
Creator 版本:1.9.0
-
目标平台: Web
-
详细报错信息,包含调用堆栈:

-
重现方式:如上图,重复8次、10次的时候isDone没问题,9次、11次的时候有问题,没继续试了
-
出现概率:必现
谢谢反馈,在 2.0 修复了
https://github.com/cocos-creator/engine/pull/2467
这个问题的原因是 JS 的浮点数运算精度问题:
1/9 + 1/9 + … + 1/9 九次加法的结果大于 1,导致我们的判断失效。
1.x 版本暂时可以在用户代码中附加修改
cc.Repeat.prototype.update = function (dt) {
dt = this._computeEaseTime(dt);
var locInnerAction = this._innerAction;
var locDuration = this._duration;
var locTimes = this._times;
var locNextDt = this._nextDt;
if (dt >= locNextDt) {
while (dt > locNextDt && this._total < locTimes) {
locInnerAction.update(1);
this._total++;
locInnerAction.stop();
locInnerAction.startWithTarget(this.target);
locNextDt += locInnerAction._duration / locDuration;
this._nextDt = locNextDt > 1 ? 1 : locNextDt;
}
// fix for issue #1288, incorrect end value of repeat
if (dt >= 1.0 && this._total < locTimes) {
// fix for cocos-creator/fireball/issues/4310
locInnerAction.update(1);
this._total++;
}
// don't set a instant action back or update it, it has no use because it has no duration
if (!this._actionInstant) {
if (this._total === locTimes) {
locInnerAction.stop();
} else {
// issue #390 prevent jerk, use right update
locInnerAction.update(dt - (locNextDt - locInnerAction._duration / locDuration));
}
}
} else {
locInnerAction.update((dt * locTimes) % 1.0);
}
}