同时拥有update和action情况下的,慢动作,的游戏逻辑

有些时候,我们的游戏逻辑既要拥有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);
            }
        }
    },
});


```