doMove(block, position, callback){
cc.tween(block).to(MOVE_DURATION,{ position }).call(()=>{
callback &&callback()}).start();},
在moveLeft()方法中,先定义一个标签hasMoved标识往左滑动这个操作是否有导致数字块的变化,然后对这个move方法按照之前的算法思路分五种情况进行讨论: a. 移动到顶 & b. 当前数字为空:结束迭代; c. 移动方向上前一个数字格为空:向该方向移动。将当前block与data与移动方向上前一格绑定,当前格清零,并调用doMove()函数完成实体移动动画,最后hasMoved标签置为true表示有数字块的变化; d. 移动方向上前一个数字格相同:合并。将data * 2与移动方向上前一格绑定,当前格清零,当前格block置为null,前一个生成新的拥有data * 2值的数字块,并调用doMove()函数完成实体移动动画,最后hasMoved标签置为true表示有数字块的变化; e. 移动方向上前一个数字格不同:结束迭代。
moveLeft(){
console.log('move left');let hasMoved =false;letmove=(x, y, callback)=>{if(y ==0||this.data[x][y]==0){
callback &&callback();return;}elseif(this.data[x][y -1]==0){// Movelet block =this.blocks[x][y];let position =this.positions[x][y -1];this.blocks[x][y -1]= block;this.data[x][y -1]=this.data[x][y];this.data[x][y]=0;this.blocks[x][y]=null;this.doMove(block, position,()=>{move(x, y -1, callback);});
hasMoved =true;}elseif(this.data[x][y -1]==this.data[x][y]){// Mergelet block =this.blocks[x][y];let position =this.positions[x][y -1];this.data[x][y -1]*=2;this.data[x][y]=0;this.blocks[x][y]=null;this.blocks[x][y -1].getComponent('block').setNumber(this.data[x][y -1]);this.doMove(block, position,()=>{
block.destroy();
callback &&callback();});
hasMoved =true;}else{
callback &&callback();return;}};...let counter =0;for(let i =0; i < toMove.length;++i){move(toMove[i].x, toMove[i].y,()=>{
counter++;if(counter == toMove.length){this.afterMove(hasMoved);}});}},