AS3:在每次传球时停止for循环

时间:2012-02-23 18:35:37

标签: actionscript-3

所以我已经找到了一种创建像素化划像效果的好方法,其中像素的影片剪辑嵌套在行中。我创建了一个遍历每一行的循环,然后在该循​​环中为每行中的像素创建了另一个循环。然后我在1-0之间使用一个随机数作为延迟,然后才对像素进行alpha-up。我使用Greensock作为补间,效果很好。

一个问题,我无法停止行的for循环,并且每行都会立即出现。尽管如此,像素是交错的,这是一个很好的效果,但我希望它从左到右移动。所以我的代码看起来像这样:(顺便说一句,是的,AS3确实有setTimeout,它工作正常)

function stripeWipeUp(stripe:MovieClip):void {

var total = stripe.numChildren;

for (var i:int = 0; i<total; i++) { // the rows
    trace(i);
    setTimeout(function() {
        trace("setTimeout: "+i);
        var row:MovieClip = stripe.getChildAt(i) as MovieClip;
        var pixTotal = row.numChildren;

        for (var j:int = 0; j<pixTotal; j++) { the pixels

            var pix:MovieClip = row.getChildAt(j) as MovieClip;
            var num = Math.floor(Math.random()*100)/100; // the delay
            pixUp(pix, num); // my greensock function

        }
    }, 500);    
}
}

在那里使用setTimeout会发生的事情是,在一个setTimeout完成之前,“i”for循环命中每一行(有27个)。因此,它不能正常工作 - 在setTimeout完成之前,下一个循环不应该执行。任何想法如何实现这一点,每行停止大约500毫秒?感谢。

4 个答案:

答案 0 :(得分:1)

你的问题就是这个。

trace("setTimeout: "+i);

“我”不是你的想法 “i”的范围是stripeWipeUp而不是匿名函数 据说“i”始终是在所有匿名函数中运行的循环的最后一次迭代的值。
因此,你可以看到,当anon函数触发“i”时,最有可能等于“total”
这就是为什么我们避免使用匿名函数,因为范围很难确定。

创建一个数组并在其中存储一个自定义类,用于控制您想要执行的操作的每个“像素” 在这个类中使用Timer对象而不是setTimeOut。
setTimeOut是从AS2遗留下来的垃圾函数。

答案 1 :(得分:0)

删除setTimeout,只需添加延迟乘以i

var num = ( i * 500 ) + Math.floor(Math.random()*100)/100; // the delay

答案 2 :(得分:0)

我会将I和j,一个Timer,以及一个Timer的事件处理程序封装到一个类中。在事件处理程序中我会:

  • 对与j和i
  • 对应的像素执行效果
  • 更新j(和i)
  • 如果有更多像素,请安排下一个事件

答案 3 :(得分:-1)

我能够通过将内部部分取出并使其成为单独的功能来使其工作。我更喜欢像Creynders这样更清洁的解决方案,但由于某些原因无效。这是代码:

// the row of pixels
function row(stripe:MovieClip, i:int, up:Boolean, del:Number):void {

setTimeout(function() {

    var row:MovieClip = stripe.getChildAt(i) as MovieClip;
    var pixTotal = row.numChildren;

    for (var j:int = 0; j<pixTotal; j++) {

        var pix:MovieClip = row.getChildAt(j) as MovieClip;
        var num = Math.floor(Math.random()*100)/100;
        (up) ? pixUp(pix, num) : pixDown(pix, num);

    }
}, del);
}
// the rows in the "stripe"
function stripeWipe(stripe:MovieClip, up:Boolean):void {

var total = stripe.numChildren;
var del:Number = 0;

for (var i:int = 0; i<total; i++) {

    row(stripe, i, up, del);
    del = del+100;

}

}