【问题标题】:AS3: Stalling a for loop at each passAS3:在每次通过时停止 for 循环
【发布时间】:2012-02-23 18:35:37
【问题描述】:

因此,我找到了一种创建像素化擦除效果的好方法,其中像素的影片剪辑嵌套在行中。我创建了一个遍历每一行的循环,然后在该循​​环内为每一行中的像素创建另一个循环。然后,我使用 1-0 之间的随机数作为延迟,然后再对像素进行 alpha-ups。我使用 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 毫秒吗?谢谢。

【问题讨论】:

  • 您不能在 ActionScript 中停止 for 循环并在循环运行时更新显示。

标签: actionscript-3


【解决方案1】:

你的问题是这个。

trace("setTimeout: "+i);

“i”不是你想的那样。
“i”的范围在 stripeWipeUp 而不是匿名函数。
话虽如此,“i”始终是在所有匿名函数中运行的循环的最后一次迭代的值。
如您所见,匿名函数何时触发“i”很可能等于“total”。

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

创建一个数组并为每个“像素”存储一个自定义类,以控制您想要做什么。
在此类中使用 Timer 对象而不是 setTimeOut。
setTimeOut 是 AS2 遗留的垃圾函数。

【讨论】:

    【解决方案2】:

    删除 setTimeout 并添加延迟乘以 i

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

    【讨论】:

    • 我真的认为这是一个很好的解决方案,而且我认为它会起作用。我确实放弃了 setTimeout,但由于某种原因它停在了第一行……可能是绿袜。我让它可以使用下面的方法
    • 好的,它不会让我发布我的答案,因为我没有足够的代表......我会等到我可以再发布它
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-05
        • 2013-10-08
        • 1970-01-01
        • 2022-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多