2

現在、AS3 で小さな問題に直面しています。私が達成したいのは、for ループで画像をフェードすることです。問題は、ループが setInterval 関数が終了するのを待っていないことです。

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

setInterval 関数が呼び出されると、動作は明確になり、ループが続行されます。私の質問は、 setInterval 関数で起こっていることでループが完了するのを待つ方法はありますか?

前もって感謝します、トーマス

4

3 に答える 3

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 });  
}
于 2012-07-13T13:15:51.710 に答える
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);

フェードをやり直したい場合は、関数をもう一度実行してください。

編集:スニペットを関数でラップしました。

于 2012-07-13T12:23:32.087 に答える
0

アニメーションが終了するのを待つ代わりに、イベントを使用できます。各アニメーションの最後 (たとえば、ムービークリップの最後のフレーム) で完了イベントをディスパッチします。

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();

このようにして、タイムアウトを同期する必要なく、アニメーションの継続時間を変更できます。

于 2012-07-13T13:23:22.033 に答える