moveTo动作无法移动到正确目标位置,请高手帮我看看

代码是这样的
for (let i = 0; i < this.game.circleArray.length; i++) {
for (let j = this.game.circleArray.length - 1; j > -1; j–) {
if (!this.game.circleArray[i][j].active && j !== this.game.circleArray.length - 1) {
cc.log(i,j);//1,7
cc.log(cc.v2(this.game.circleArray[i][j].position));//Vec2 {x: -223.99998474121094, y: -88}
cc.log(cc.v2(this.game.circleArray[i][j+1].position));//Vec2 {x: -224, y: -24}
this.game.circleArray[i][j+1].runAction(cc.sequence(cc.moveTo(1,cc.v2(this.game.circleArray[i][j].position)),cc.callFunc(function () {
cc.log(cc.v2(this.game.circleArray[i][j].position));//Vec2 {x: -223.99998474121094, y: -88}
cc.log(cc.v2(this.game.circleArray[i][j+1].position));//Vec2 {x: -224, y: -150.96119689941406}
},this)));
}
}
}
看了log,就看到移动完成之后this.game.circleArray[i][j+1].position和我设定的目标位置不同,请高手帮我看看,是我的目标坐标设定有问题吗,这样移动出来的效果是多往下移动了一行

在for循环里定义一个局部变量 let 去接收你要移动到的位置,
for循环结束的时候的所有的动作还没结束,此时所有要移动的位置都在变动。

动作没执行完 i和j 已经变了

了解,谢谢,我试试看

就是在循环里记录,然后在循环外执行动作是吗

我试了一下,在for循环的外边定义变量,存储需要移动的位置,但是仍然是是一样的结果,并不移动到目标位置上,会多移动一行,修改后的代码
let needMovePos = [];
let needMove = [];
for (let i = 0; i < this.game.circleArray.length; i++) {
for (let j = this.game.circleArray.length - 1; j > -1; j–) {
if (!this.game.circleArray[i][j].active && j !== this.game.circleArray.length - 1) {
if (needMovePos.every(x =>{return x !== cc.v2(this.game.circleArray[i][j].position);})) {
needMovePos.push(cc.v2(this.game.circleArray[i][j].position));
}
if (needMove.every(x =>{return x !== [i,j+1];})) {
needMove.push([i,j+1]);
}
}
}
}
for (let i = 0; i < needMove.length; i++) {
this.game.circleArray[needMove[i][0]][needMove[i][1]].runAction(cc.moveTo(1,cc.v2(needMovePos[i])));
}

动作还没有结束就进入了下一次循环。 我有个思路: 先把要移动的点记录到一个数组中。定义一个判断用的变量 canRunAction = false 然后用cc.sequence 配合 cc.callFunc 做一个动作结束回调 动作结束回调作用就是把 canRunAction设为 true 这样就循环位置数组 判断canRunAction 如果false 就 continue 如果true 就执行动作

想了想 continue会跳过当前循环的位置…… 所以可以的话放到update里判断吧

意思就是在update里面判断动作是不是已经完成,完成了才进行下一次循环是吗?

嗯。当前正在进行的动作结束后再开始下一个动作

我测了一下,看起来不是循环的问题,我不用循环遍历,单独运行一个动作,还是会出现移动的目标点不是我设置的目标位置
let needMovePos = [];
let needMove = [];
for (let i = 0; i < this.game.circleArray.length; i++) {
for (let j = this.game.circleArray.length - 1; j > -1; j–) {
if (!this.game.circleArray[i][j].active && j !== this.game.circleArray.length - 1) {
if (needMovePos.every(x =>{return x !== cc.v2(this.game.circleArray[i][j].position);})) {
needMovePos.push(cc.v2(this.game.circleArray[i][j].position));
}
if (needMove.every(x =>{return x !== [i,j+1];})) {
needMove.push([i,j+1]);
}
}
}
}
cc.log(needMovePos[0]);这个单点的坐标是移动的目标坐标_Vec2 {x: -31.9999942779541, y: -216.0000762939453}_
cc.log(needMove[0]);这个是需要移动的节点的数组索引_[4, 6]_
cc.log(this.game.circleArray[needMove[0][0]][needMove[0][1]].position);这个是移动前的坐标_Vec3 {x: -32, y: -152, z: 0}_
let needMoveAction = cc.moveTo(1,needMovePos[0]);
let needMoveCallFunc = cc.callFunc(function () {
cc.log(this.game.circleArray[needMove[0][0]][needMove[0][1]].position);动作结束后回调这个节点移动后的坐标是_Vec3_ {x: -32, y: -280.00030517578125, z: 0}_
},this);
this.game.circleArray[needMove[0][0]][needMove[0][1]].runAction(cc.sequence(needMoveAction,needMoveCallFunc));
原本移动的目标位置是_Vec2 {x: -31.9999942779541, y: -216.0000762939453}但是移动结束后实际移动到的位置是_Vec3 {x: -32, y: -280.00030517578125, z: 0}_,y方向多移动了64,这个也就是节点的高度,所以是多移动了一行,这个跟遍历真的有关系吗,我这样测的移动动作是单独的不在循环遍历里边,但还是不能到目标位置