如何逐个运行?

时间:2015-02-18 00:42:35

标签: javascript cocos2d-js

嗨我想在Cocos2d-js和flipX3d(持续时间)制作翻转卡片动画,导致应用程序失败,这是我的代码。

var MenuLayer = cc.Layer.extend({
spriteBG:null,

ctor:function () {
    this._super();
    this.init();
},
init:function() {

    var size = cc.winSize;

    var closeItem = new cc.MenuItemImage(
        res.CloseNormal_png,
        res.CloseSelected_png,
        function () {
            cc.log("Close is clicked!");
        }, this);
    closeItem.attr({
        x: size.width - 20,
        y: 20,
        anchorX: 0.5,
        anchorY: 0.5
    });

    var menu = new cc.Menu(closeItem);
    menu.x = 0;
    menu.y = 0;
    this.addChild(menu, 1);

    this.spriteBG = new cc.Sprite(res.MenuBG);

    this.spriteBG.attr({
        x: size.width / 2,
        y: size.height / 2,
        scale: 1.5
    });
    this.addChild(this.spriteBG, 0);

    this.pomoc = new cc.Sprite(res.Card_Back);
    this.pomoc.setPosition(size.width/3, size.height/3);
    this.addChild(this.pomoc, 2, 1);

    this.pomoc1 = new cc.Sprite(res.Card_Back);
    this.pomoc1.setPosition(size.width/3, size.height/3);
    this.pomoc1.runAction(cc.scaleTo(0, 0, 1));
    this.addChild(this.pomoc1, 2, 1);
    cc.FlipX3D

    var startButton = new cc.MenuItemSprite( 
            new cc.Sprite(res.Start_1),
            new cc.Sprite(res.Start_2),
            function(){


                cc.log("==start clicked");
                var pop = cc.scaleTo(0.5, 0, 1);
                var pop1 = cc.scaleTo(0.5, 1, 1);
                var seq = new cc.Sequence(this.pomoc.runAction(pop),this.pomoc1.runAction(pop1));
            },this
    );
    var Start = new cc.Menu(startButton);
    Start.setPosition(size.width/2, size.height/2)
    this.addChild(Start);

}
});



var MenuScene = cc.Scene.extend({
onEnter:function () {
    this._super();
    var layer = new MenuLayer();
    this.addChild(layer);
}
});

问题是pop并且pop1立即启动我需要pop,然后pop1。 Sequance应该有所帮助,但它会忽略它并同时开始。谢谢你的帮助。

即使我将其拆分为函数然后以sequance调用它也会同时启动。

var MenuLayer = cc.Layer.extend({
spriteBG:null,

ctor:function () {
    this._super();
    this.init();
},
init:function() {

    var size = cc.winSize;

    var closeItem = new cc.MenuItemImage(
        res.CloseNormal_png,
        res.CloseSelected_png,
        function () {
            cc.log("Close is clicked!");
        }, this);
    closeItem.attr({
        x: size.width - 20,
        y: 20,
        anchorX: 0.5,
        anchorY: 0.5
    });

    var menu = new cc.Menu(closeItem);
    menu.x = 0;
    menu.y = 0;
    this.addChild(menu, 1);

    this.spriteBG = new cc.Sprite(res.MenuBG);

    this.spriteBG.attr({
        x: size.width / 2,
        y: size.height / 2,
        scale: 1.5
    });
    this.addChild(this.spriteBG, 0);

    this.pomoc = new cc.Sprite(res.Card_Back);
    this.pomoc.setPosition(size.width/3, size.height/3);
    this.addChild(this.pomoc, 2, 1);

    this.pomoc1 = new cc.Sprite(res.Card_Back);
    this.pomoc1.setPosition(size.width/3+10, size.height/3+10);
    this.pomoc1.runAction(cc.scaleTo(0, 0, 1));
    this.addChild(this.pomoc1, 2, 1);

    var startButton = new cc.MenuItemSprite( 
            new cc.Sprite(res.Start_1),
            new cc.Sprite(res.Start_2),
            function(){


                cc.log("==start clicked");
                cc.Sequence.create(this.pom1(),this.pom2());
            },this
    );
    var Start = new cc.Menu(startButton);
    Start.setPosition(size.width/2, size.height/2)
    this.addChild(Start);

},
pom1: function(){
    this.pomoc.runAction(cc.scaleTo(0.5, 0, 1));
},
pom2:function(){
    this.pomoc1.runAction(cc.scaleTo(1, 1, 1));
}
});



var MenuScene = cc.Scene.extend({
onEnter:function () {
    this._super();
    var layer = new MenuLayer();
    this.addChild(layer);
}
});

2 个答案:

答案 0 :(得分:0)

试试这个:

this.pomoc.runAction(cc.Sequence.create(pop, cc.CallFunc.create(startPop1, this)));

function startPop1(obj) {
   this.pomoc1.runAction(pop1);
}

或:

this.pomoc.runAction(pop);
this.pomoc1.runAction(cc.Sequence.create(cc.DelayTime.create(popActionDuration), pop1));

答案 1 :(得分:0)

问题在于,当您想在同一序列中的不同对象上运行操作时,需要使用callFunc。但是你也应该记住(据我所知)callFunc没有办法告诉Sequence它在结束时包装它,所以你应该放Delay那里。

你如何使用它也有点奇怪..什么时候应该运行?定义seq应该只创建序列。但不执行它。

保持你做事的风格,你应该替换它:

var seq = new cc.Sequence(this.pomoc.runAction(pop),this.pomoc1.runAction(pop1));

有了这个:

var seq = cc.sequence(
    cc.callFunc(function(){that.pomoc.runAction(pop);}),
    cc.delay(1),
    cc.callFunc(function(){that.pomoc1.runAction(pop1);})
);

但如果是我,我会这样做(无论你想要执行序列的地方):

this.pomoc.runAction(
    cc.sequence(
        pop,
        cc.callFunc(function(){that.pomoc1.runAction(pop1);})
    )
);

这应该在pop上运行this.pomoc,在结束时 执行callFunc。恕我直言,这是你最好的选择。


请注意,在callFunc中,this将没有您期望的含义,因此您应该在var that = this;成为好之前定义var size = cc.winSize;的地方。

PS:请注意,在v3.x中,如果使用以小写字母开头的方法版本,则不需要在操作中使用new.create(),即:{{1 }等于cc.sequence

快速警告:如果您希望同时在两个对象上使用您在某处定义的操作(即new cc.Sequence.create),则需要在每个对象上添加pop你称之为的地方(即:.clone())。