[常见问题记录帖] action的执行顺序问题。

版版我今天获得了一个bug反馈,说是执行了五个action的callback的动作,结果callback只调用了四次。

我想,这不可能呀。这可是大问题呀。于是我拿到了代码。一运行,发现,还真的是runAction了五次,只回调了四次。 :8:

这到底是哪里出了问题呢?:3:

现在附上代码,大家能看出来是什么问题不?:877:

HelloWorldLayer.js

ctor:function(){
...
for(var i=0; i<5;i++){
             var textEffect = TextEffect.create(100,cc.p(500,400));
            //var textEffect = this.create(100,cc.p(500,400));
             if(textEffect)
                  this.addChild(textEffect,1000);
        }
...
}

TextEffect .js


var TextEffect = {
     fontList : ],
     create : function(num, pos) {
          if(!num)
               return;
          var str = "";
          if(num < 0)
               str = num;
          else
               str = "+"+num;


          var ret = new cc.LabelBMFont(str,"res/fonts/bitmapFontTest.fnt");
          ret.x = pos.x+45;
          ret.y = pos.y;
          this.fontList.push(ret);
          cc.log("添加一个飘血");
          ret.runAction(cc.sequence(cc.moveBy(1, cc.p(0, 30) ), cc.callFunc(this.destroy, this)));
          return ret;
     },
    destroy : function(){
        if(this.fontList.length){
               cc.log("删除一个飘血");
             this.fontList.removeFromParent(true);
             this.fontList.shift();
        }
    },
     clear : function(){
          this.fontList = ];
     }
};

以上是测试代码,
出现的情况就是
先打印了五次 添加一个飘血
而后只打印了四次 删除一个飘血。

大家看出代码有什么问题了么?:886:

下面揭晓答案。

是的,没错,问题的答案就是 标题说的。action的执行顺序问题。

this.fontList将五次创建的LabelBMFont存储起来了。但是回调的时候,并不一定是按顺序回调回来的,也就是,这段代码

 this.fontList.removeFromParent(true);

删除了不该删除的BMFont对象。

最后修改如下

destroy : function(sender){
        if(this.fontList.length){
               cc.log("删除一个飘血");
               sender.removeFromParent(true);
             //this.fontList.removeFromParent(true);
             //this.fontList.shift();
        }
    },

就正常了。你猜到了么?:870:

学习学习:2::2:

:14:学习学习

:7:啥原因?

this.fontList.removeFromParent(true);
         this.fontList.shift();

这里的问题

饭饭 给力啊。 :856:

哈哈 我以前遇到过这个问题哦

直接
ret.runAction(cc.sequence(cc.moveBy(1, cc.p(0, 30) ),cc.removeSelf(true)));
就行了,不需要用destroy和把ret放到数组里记着,方正飘玩自动消失

最后一次 被废掉了

阿斯顿发送到发送到

学习学习。。。。。

:10::10::10:总是回复可见

7楼给力:7:涨姿势了

顶。。。。。。。。。。。。。。

回复可见一下

学习学习!!!!!

回复看看~~~~

回复看看 不明觉厉啊!

龙哥 在不 小弟不才 刚刚把龙哥代码跑了一遍 删除飘血也是log了5次啊 看着代码 感觉是不是龙哥贴错代码了呀 是不是把修复过的代码贴上来了 this.fontlist 为什么会把5次创建的label存储起来啊 这个list不应该是testeffect的变量嘛

回复学习一下