moveTo移动后衔接bezierTo循环

正在制作一个循环绕圈圈的动画,但是程式执行第一圈时可以正常绕行一圈,第二圈转弯时就会出现问题,不会照着第一圈的路径跑,请问有人遇过这个问题吗?

代码如下:

let horse1_PosX = [-140,290,382,382,286,-270,-355,-355,-265];
let horse1_PosY = [105,105,70,-80,-137,-137,-90,65,113];

var bezier = [cc.v2(horse1_PosX[1], horse1_PosY[1]), cc.v2(383, 100), cc.v2(horse1_PosX[2], horse1_PosY[2])];
var bezier2 = [cc.v2(horse1_PosX[3], horse1_PosY[3]), cc.v2(370, -145), cc.v2(horse1_PosX[4], horse1_PosY[4])];
var bezier3 = [cc.v2(horse1_PosX[5], horse1_PosY[5]), cc.v2(-360, -125), cc.v2(horse1_PosX[6], horse1_PosY[6])];
var bezier4 = [cc.v2(horse1_PosX[7], horse1_PosY[7]), cc.v2(-350, 135), cc.v2(horse1_PosX[8], horse1_PosY[8])];

//
var Action1 = cc.moveTo(2,horse1_PosX[1],horse1_PosY[1]);
var Action2 = cc.bezierTo(0.75,bezier);
var Action3 = cc.moveTo(1.5,horse1_PosX[3],horse1_PosY[3]);
var Action4 = cc.bezierTo(0.9,bezier2);
var Action5 = cc.moveTo(2,horse1_PosX[5],horse1_PosY[5]);
var Action6 = cc.bezierTo(0.9,bezier3);
var Action7 = cc.moveTo(1.5,horse1_PosX[7],horse1_PosY[7]);
var Action8 = cc.bezierTo(0.9,bezier4);
var Action9 = cc.moveTo(1,horse1_PosX[0],horse1_PosY[0]);

start () {
node_horse.active = false;
node_horse.x = -415;
node_horse.y = 100;

    testHorse = cc.instantiate(node_horse);
    testHorse.parent = node_bg;
    testHorse.name = "TempHorse";
    testHorse.active = true;
    testHorse.x = horse1_PosX[0];
    testHorse.y = horse1_PosY[0];
    testHorse.getComponent(cc.Animation).play("Horse");

    //繞行一圈點擊該物件再跑一次runAction
    testHorse.on('touchend',this.restarRun);

    testHorse.stopAllActions();
    testHorse.runAction(
        cc.sequence(
            Action1,Action2,Action3,Action4,Action5,Action6,Action7,Action8,Action9),
    );
},

restarRun(){
    
    testHorse.x = horse1_PosX[0];
    testHorse.y = horse1_PosY[0];
    
    testHorse.stopAllActions();
    
    testHorse.runAction(
        cc.sequence(
            Action1,Action2,Action3,Action4,Action5,Action6,Action7,Action8,Action9),
    );
},

这里问题很好找你打个断点就找到了,你的这个bezier在执行完第一次动作的时候这个数组的值就发生改变了,所以你下次运行就不对了,这个应该是引用问题,cc.bezierTo(0.75,bezier);这个方法直接引用了你的bezier数组,所以运动的同时改变了你的bezier数组的值,解决方法也很简单,有很多种,比如你每次都重新定义bezier,或者你传值传克隆数组的值。
简单来说就是这样` let horse1_PosX = [-140, 290, 382, 382, 286, -270, -355, -355, -265];
let horse1_PosY = [105, 105, 70, -80, -137, -137, -90, 65, 113];

    let startRun = () => {
        cc.log("怎么回事");
        let bezier = [cc.v2(horse1_PosX[1], horse1_PosY[1]), cc.v2(383, 100), cc.v2(horse1_PosX[2], horse1_PosY[2])];
        this.testHorse.stopAllActions();
        let Action1 = cc.moveTo(2, horse1_PosX[1], horse1_PosY[1]);
        let Action2 = cc.bezierTo(0.75, bezier);
        this.testHorse.x = horse1_PosX[0];
        this.testHorse.y = horse1_PosY[0];
        this.testHorse.runAction(
            cc.sequence(
                Action1, Action2),
        );
    };
    startRun();
    //繞行一圈點擊該物件再跑一次runAction
    this.testHorse.on('touchend', startRun);`
1赞

真的很感谢前辈的指导,问题总算解决了!
把所有数值重新定义以后,就正常了。