如何运行一一操作?

How to run action one by one?

嗨,我想在 Cocos2d-js 和 flipX3d(duration) 中制作翻转卡片动画,因为这里是我的代码应用程序失败。

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 应该有所帮助,但它会忽略它并同时启动。感谢您的帮助。

即使我将它拆分成函数然后按顺序调用它也会同时启动。

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);
}
});

试试这个:

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));

问题在于,当您想要对同一序列中的不同对象执行 运行 操作时,您需要使用 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);})
    )
);

这应该 运行 popthis.pomoc 上,并且 结束时 执行 callFunc。恕我直言,这是您的最佳选择。


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

PS:请注意,在 v3.x 中,如果您使用开始的方法版本,则无需在操作中使用 new.create()小写,即:cc.sequence 等于 new cc.Sequence.create.

快速警告:如果您希望同时对两个对象使用您在某处定义的操作(即 pop),您需要添加一个 .clone()在您调用它的每个地方(即:that.pomoc.runAction(pop.clone());)。