squence实现间隔时间不同对象相同动作的实现方法

动作(cc.Action)相信熟悉coccos2d的都不会陌生,动作作为一个游戏中必不可少的组成元素,分为瞬时动作(cc.ActionInstant)和组合动作(cc.ActionInterval),动作往往不是单一的,而是复杂的组合,在这里我就说说组合动作中cc.Squence顺序动作的一个常用需求。

例如:现在有个需求是这样的,需要在间隔时间(2s)不同对象依次执行相同动作,就如同体育课老师用报数来清点人数一样,不同的学生依次报数。说到这里,有的人就会说,这不是很简单吗?当然,你可以每个对象执行runAction同一个动作,然后第一个等待0s,第二个等待2s…

哈哈,可以吧,感觉好黄好暴力,当然可以,在简单的游戏下这样做是没问题,但在复杂的游戏中,不同层的对象之间,cc.delayTime会出现不可预知的bug,这时候怎么办呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//按钮跳动
var sequence = cc.sequence(
cc.callFunc(this.onCallback1, this),//sequence顺序执行action,同时也可顺序回调callback func();
cc.delayTime(2),
cc.callFunc(this.onCallback2, this),
cc.delayTime(2),
cc.callFunc(this.onCallback3, this),
cc.delayTime(2));
this.runAction(sequence.repeatForever());
//兑换按钮跳动
onCallback1:function () {
var jumpBy = cc.jumpBy(1,cc.p(0, 0), 5,3);
this._btn_bank.runAction(jumpBy);
},
//活动按钮跳动
onCallback2:function () {
var jumpBy = cc.jumpBy(1,cc.p(0, 0), 5,3);
this._btn_act.runAction(jumpBy);
},
//礼包按钮跳动
onCallback3:function(){
CommonLobbyCtrl.getInstance().showGiftEffect(this._libao_1);
CommonLobbyCtrl.getInstance().showGiftEffect(this._libao_2);
CommonLobbyCtrl.getInstance().showGiftEffect(this._libao_3);
}

这样的话,代码间简洁漂亮了不少,同时可维护性也强,方便以后变更需求。

有人会说这样这么臃肿,有没有更简洁的方法,当然有!可以用封装方法,方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
 //cc.targetedAction方法:"a = cc.targetedAction( target, action );"

//按钮跳动
var jumpBy = cc.jumpBy(1,cc.p(0, 0), 5,3);
var delayTime = cc.delayTime(2);
//兑换按钮跳动
var target_1 = cc.targetedAction(this._btn_bank, jumpBy);
//活动按钮跳动
var target_2 = cc.targetedAction(this._btn_act, jumpBy);

var seq = cc.sequence(delayTime, target_1, delayTime, target_2);
this.runAction(seq.repeatForever());