我也是在做三消游戏时遇到这个问题,我并不知道动作什么时候结束,完美的想法是动作结束后就做什么。
cc.sequence,component.scheduleOnce,甚至什么setTimeout都用过,结果是动作一般都能完美执行,就是在delay后该执行执行,但是记录消除块位置信息的MAP不能及时更新,(该MAP记录那个位置是什么块的一个键值对表,比如01点是chess1),不及时表现在,块都落下来了,MAP中的记录的那个位置还是null,我现在想到的补救办法是:把消除的那块不是真消除而是替换成一个名字是UUID的新块,播放他的下落效果而已。这不怎么舒服的。求救,谢谢。
cc.sequence(action1,action2,action3,…,cc.callFunc(()=>{
//在这里面干你想要做的事情
}))
亲,的确这么回事,我现在也这么写的,只不过就是不知道什么时候动作结束,或者说我动作结束就怎么怎么样,只能靠着cc.timeDelay完了,cc.callFunc这种sequence串来执行,有点感觉不舒服。
其实说什么,逻辑和执行效果分开来。我觉得本质上是因为schedule和sequence之类不能和for共存。
我这样写一个方法
destroyItemStep2: function () {
this.createArray = new Array();
// this.createPosArray = new Array();
this.c = 0;
this.schedule(
function () {
var nameArray = this.destroyArray[this.c];
let board = this.node.getChildByName("chessBoard");
if (nameArray != null) {
for (var j = 0; j < nameArray.length; j++) {
var item = board.getChildByName(nameArray[j]);
if (item!=null){
item.getComponent("chess").destroySelf();
}
}
this.pubDelay += G.DESTROY_DELAY_TIME;
}
this.c++;
if (this.c > this.destroyArray.length)
{
// this.judgeDown();
// this.scheduleOnce(this.judgeDown.bind(this, this.destroyArray.length * G.DESTROY_DELAY_TIME + 0.1), G.DESTROY_DELAY_TIME + 0.1);
}
},1, this.destroyArray.length,0);
return this.destroyArray.length * G.DESTROY_DELAY_TIME ;
},
在自己单独执行时执行正常。
但在他前面写几个for循环来执行刷新矩阵逻辑就会出错,就不是按顺序一个一个执行了。就会失效,块会一并消除。