cc.repeat完成后isDone依然是false

  • Creator 版本:1.9.0

  • 目标平台: Web

  • 详细报错信息,包含调用堆栈:

  • 重现方式:如上图,重复8次、10次的时候isDone没问题,9次、11次的时候有问题,没继续试了

  • 出现概率:必现

@jare

@panda

谢谢反馈,在 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);
    }
}