[1.9.3] cc.repeat 和 ActionInterval.repeat 的实现有区别

由于各种原因还在使用1.9.3, 想了解一下是否使用不当导致的问题, 大概情况如下:


// 这样调用repeat是没问题的
shakeAction(node: cc.Node, time: number, shake: number, repeat: number) {
    node.stopAllActions();
    node.scale = 1;
    node.runAction(
        cc.sequence(
            cc.sequence(
                cc.scaleTo(time, 1 + shake, 1 - shake),
                cc.scaleTo(time, 1 - shake, 1 + shake),
            ).repeat(repeat), // 这样调用repeat是没问题的
            cc.scaleTo(time, 1),
        )
    );
}

// 这样调用repeat就有问题了
spfAction(sp: cc.Sprite, time: number, defSpf: cc.SpriteFrame, actSpf: cc.SpriteFrame, repeat: number) {
    sp.node.stopAllActions();
    sp.spriteFrame = actSpf;
    sp.node.scaleX = 1;
    sp.node.runAction(
        cc.sequence(cc.sequence(
            cc.delayTime(time),
            cc.callFunc(() => sp.node.scaleX = -sp.node.scaleX), // 这个回调里打log, 大概率只会出现最后一次
            // cc.delayTime(time), // 或者用2个delayTime包住一个callFunc, 也可以正常repeat
        ).repeat(repeat)),
        cc.callFunc(() => {
            sp.node.scaleX = 1;
            sp.spriteFrame = defSpf;
        }),
    );
}

// 这样调用又没问题了
spfAction2(sp: cc.Sprite, time: number, defSpf: cc.SpriteFrame, actSpf: cc.SpriteFrame, repeat: number) {
    sp.node.stopAllActions();
    sp.spriteFrame = actSpf;
    sp.node.scaleX = 1;
    sp.node.runAction(
        cc.sequence(
            cc.repeat( // 用cc.repeat又可以解决了
                cc.sequence(
                    cc.delayTime(time),
                    cc.callFunc(() => sp.node.scaleX = -sp.node.scaleX),
                ), repeat),
            cc.callFunc(() => {
                sp.node.scaleX = 1;
                sp.spriteFrame = defSpf;
            }),
        )
    );
}