在for循环中使用setInterval

时间:2012-07-13 12:16:41

标签: actionscript-3 flash actionscript

我目前在AS3面临一个小问题。我想要实现的是在for循环中淡化图像。问题是循环没有等待setInterval函数完成。

for(var i in imageClips){
    setInterval(function(){
        fade(imageClips[i]);
    }, 6000);        
}

一旦调用了setInterval函数,该行为就很明显了。我现在的问题是,有没有办法让循环等待完成setInterval函数中发生的事情?

提前致谢, 托马斯

3 个答案:

答案 0 :(得分:1)

setInterval不会延迟循环执行。你可以这样做:

function fadeImages(imageClips) {
  // Create a clone
  var imageStack:Array = imageClips.concat();

  // Create the callback that will fade all images
  var doFade:Function = function() {
    if (imageStack.length > 0) {
      fade(imageStack.shift());
      setInterval(doFade, 6000);
    }
  }

  // Start fading images
  doFade();
}

// Fade specified images
fadeImages(imageClips);

如果你想再次进行淡入淡出,请再次使用该功能。

修改:使用函数包装代码段。

答案 1 :(得分:1)

如果您使用Greensocks'TweenMax之类的图书馆来补充你的生活,那么你的生活会变得更轻松。它几乎是Flash中程序化动画的标准,并提供了惊人数量的功能,包括在补间上设置延迟的功能。

使用TweenMax,您的代码看起来像这样:

var delay:int = 6; // delay between fades in seconds
var duration:int = 1; // duration of fade in seconds

for (var i in imageClips) 
{
    TweenMax.to(imageClips[i], duration, { alpha: 0, delay: i * delay });  
}

答案 2 :(得分:0)

您可以使用事件而不是等待动画结束。在每个动画结束时发送一个完整的事件(例如,在MovieClip的最后一帧):

dispatchEvent(new Event(Event.COMPLETE));

然后为每个动画添加侦听器:

var index:int = -1;

function fadeNext(event:Event = null):void {
    index += 1;
    if (index < imageClips.length) fade(imageClips[index]);
}

for (var i in imageClips) {
    imageClips[i].addEventListener(Event.COMPLETE, fadeNext, false, 0, true);
}

fadeNext();

这样您就可以更改动画的持续时间,而无需同步任何超时。