动作(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), 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
|
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());
|