Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 AS3:在每次传递时暂停for循环_Actionscript 3 - Fatal编程技术网

Actionscript 3 AS3:在每次传递时暂停for循环

Actionscript 3 AS3:在每次传递时暂停for循环,actionscript-3,Actionscript 3,所以我想出了一个很好的方法来创建一个像素化的擦除效果,用一行嵌套像素的电影剪辑。我已经创建了一个穿过每一行的循环,然后在循环中为每一行的像素创建了另一个循环。然后我使用1-0之间的随机数作为延迟,然后再对像素进行alpha放大。我用Greensock做吐温,效果很好 一个问题是,我不能为行暂停for循环,而每一行都会同时出现。尽管如此,像素是交错的,这是一个很好的效果,但我希望它从左向右移动。因此,我的代码如下所示:(顺便说一句,是的,AS3确实有setTimeout,并且工作正常) 函数str

所以我想出了一个很好的方法来创建一个像素化的擦除效果,用一行嵌套像素的电影剪辑。我已经创建了一个穿过每一行的循环,然后在循环中为每一行的像素创建了另一个循环。然后我使用1-0之间的随机数作为延迟,然后再对像素进行alpha放大。我用Greensock做吐温,效果很好

一个问题是,我不能为行暂停for循环,而每一行都会同时出现。尽管如此,像素是交错的,这是一个很好的效果,但我希望它从左向右移动。因此,我的代码如下所示:(顺便说一句,是的,AS3确实有setTimeout,并且工作正常)

函数stripeWipeUp(stripe:MovieClip):无效{
var total=stripe.numChildren;

对于(var i:int=0;i删除setTimeout,只需添加一个与i相乘的延迟

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

你的问题是这个

trace("setTimeout: "+i);
“我”不是你想象的那样。
“i”的作用域在StripeView中,而不是匿名函数中。
也就是说,“i”始终是在所有匿名函数中运行的循环的最后一次迭代的值。
正如您所看到的,当anon函数触发时,“i”很可能等于“total”。

这就是为什么我们避免使用匿名函数,因为范围很难确定。

创建一个数组,并为每个“像素”存储一个自定义类,以控制您要执行的操作。

在这个类中,使用一个Timer对象而不是setTimeOut。
setTimeOut是AS2遗留下来的一个垃圾函数。

我将把I和j、计时器以及计时器的事件处理程序封装到一个类中。在事件处理程序中,我将:

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

我能够通过取出内部部件并使其成为一个单独的功能来让它工作。我更喜欢像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;

}

}
//像素行
函数行(条带:MovieClip,i:int,up:Boolean,del:Number):void{
setTimeout(函数(){
变量行:MovieClip=stripe.getChildAt(i)作为MovieClip;
var pixTotal=row.numChildren;

对于(var j:int=0;jI真的认为这是一个很好的解决方案,我认为它会起作用。我确实删除了setTimeout,但由于某种原因它在第一行停止了…可能是greensock。我使用下面的方法使它起作用。好吧,它不会留下我的答案,因为我没有足够的代表性…我会等到我可以的时候再发布它。)您不能在ActionScript中暂停for循环并在循环运行时更新显示。
// 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;

}

}