有些时候,我们的游戏逻辑既要拥有update又有action的动作,==然后,要搞一个慢动作的镜头,要求同时减慢update和action
我真是想吐血吐一地,cocos本身的例子写得并不十分清楚
下面是我研究了很久之后得出的简单例子
//测试节点
var TestNode = cc.Node.extend({
_myActionManager:null,
ctor:function() {
this._super();
//先创建完自己的子节点
var sprite = new cc.Sprite("res/CloseNormal.png");
sprite.setPosition(cc.p(0,0));
this.addChild(sprite,10);
this.sprite = sprite;
//优先级越小越先调度
this._accum = 0;
this._totleTime = 0;
//没有东西调用update//= =//它的action和它儿子的action没有关系//所以它仍旧不会停止
//通过改变父对象来控制子对象
return true;
},
startMove:function(){
var spriteAction = cc.sequence(cc.moveBy(2,200,0),cc.moveBy(2,-200,0)).repeatForever();
this.sprite.runAction(spriteAction);
},
setAllActionManager:function(_manager) {
this._myActionManager = _manager;
//注意这里setActionManager()方法里面会执行一个stopAllAction()的函数;
//所以所有的runAction应该都放在setActionManager之后
this.setActionManager(_manager);
//this.sprite.setActionManager(_manager);
//所有子节点的动作都变
var childrenArr = this.getChildren();
for (var key in childrenArr) {
var child = childrenArr;
child.setActionManager(_manager);
}
},
update:function(dt) {
this._accum += dt;
this._totleTime += dt;
cc.log("Time: " + this._totleTime);
if (this._accum<4) {
this.sprite.scale = this.sprite.scale + 0.3*dt;
}else{
this.sprite.scale = 1;
this._accum = 0;
}
},
});
var timeTestScene = cc.Scene.extend({
ctor:function () {
this._super();
this.initLayer();
return true;
},
initLayer:function(){
var result_btn = new ccui.Button();
result_btn.loadTextureNormal("res/CloseNormal.png",0);
result_btn.setZoomScale(-0.05);
result_btn.setPosition(cc.visibleRect.center);
result_btn.addTouchEventListener(this.buttonEvent,this);
this.addChild(result_btn,10);
//首先创建一个全局的 Scheduler 和一个全局的 ActionManager
//对于某个父对象,设置和停止它的动作并不能停止子对象的动作
this._newScheduler = new cc.Scheduler();
this._newActionManager = new cc.ActionManager();
var testNode = new TestNode();
testNode.setPosition(cc.pAdd(cc.visibleRect.center,cc.p(0,50)));
this.addChild(testNode,10);
//设置scheduler 和 actionManager 十分重要
testNode.setScheduler(this._newScheduler);
testNode.setAllActionManager(this._newActionManager);
//首先设置_newScheduler的update,然后设置node的update,然后设置node的动作管理器
cc.director.getScheduler().scheduleUpdateForTarget(this._newScheduler,0,false);
this._newScheduler.scheduleUpdateForTarget(testNode,0,false);
this._newScheduler.scheduleUpdateForTarget(this._newActionManager,0,false);
testNode.startMove();
//然后这里设置一个移动的时间
},
buttonEvent:function(sender, type) {
if (type == ccui.Widget.TOUCH_ENDED) {
if(this._newScheduler.getTimeScale()==1) {
this._newScheduler.setTimeScale(0.1);//这里将update和action都减慢了,欧耶正是我要的效果
}else{
this._newScheduler.setTimeScale(1);
}
}
},
});
```