定时播放同一对象的不同实例

问题描述 投票:-1回答:3

我想在同一个对象(我的情况下是小球)的实例上做一堆,它有自己的时间轴和自己的动画,但我希望动画顺序,一个接一个地来。

这是代码:

var balls:Array = new Array();
var i:int;
i = 0;
while (i<5)
{
    balls[i] = new animBall();
    balls[i].x = balls[i].x + i * 100;
    drawBall(balls[i]);
    balls[i].gotoAndPlay(2);
//here i really need something like a "wait 500 ms" function
    i++;
}

一切都在同一时间运行。另一个想法是使用计时器,但感觉有点矫枉过正,也许有更好的方法来做到这一点?

我很乐意避免在.fla上放置代码,所以我宁愿将所有代码放在一个地方,而不是在这里,稍微有点。

actionscript-3
3个回答
0
投票

您可以通过递归解决此问题,其中函数一次又一次地调用自身,直到满足条件。

var balls:Array = new Array();
var i:int = 0;
var end:int = 5;
var delay:int = 1000; //1000ms = 1s

recursiveLoop();

function recursiveLoop():void{
  balls[i] = new animBall();
  balls[i].x = balls[i].x + i *100;
  drawBalls(balls[i]);
  balls[i].goToAndPlay(2);
  i++;
  if(i != end){
    setTimeout(recursiveLoop,delay); //wait 1 second then call the function again
  }else{
    //you will end up here once every balls has been created
  }
}

就像你自己说的那样,这也可以通过Timer Class解决。如果没有写出代码就没有更多的代码,我认为你可以通过具有2个功能的定时器来解决它。

编辑:在我忘记之前,这是一个非常重要的事情,你应该注意。看下面的函数调用:

   setTimeout(recursiveLoop,delay);

函数recursiveLoop除了名称之外没有()。为什么呢?好吧,如果你在函数上使用()尝试它,函数将立即被调用,而不是等到延迟用完。所以记住在将函数作为其他函数的参数引用时要非常小心。您可能还会问自己如何将参数传递给recursiveLoop()函数。好吧,使用setTimeout会很尴尬。但Greensocks Tweening Library也可以在一段时间后调用一个函数,如果你愿意的话也可以调用参数。


0
投票

您可以使用计时器事件。还有一个名为setTimeout的方法。

setTimeout( function(){
   // Do your stuff here
}, 1000 ) // how much time you want to wait

在for循环中你需要小心这样做,因为'i'不一定是正确的范围。


0
投票

我不同意这些答案。虽然它们提供了一种可行的解决方案,但它们对PO来说并不实用,因为它们利用了容易产生内存泄漏和性能命中的传统方法。容易并不总是意味着有效率。

var balls:Array = [];
var i:int;
while (i<5)
{
    balls[i] = new animBall();
    balls[i].stop();
    balls[i].x = balls[i].x + i * 100;
    addChild(balls[i]);   
    i++;
}
MovieClip(balls[0]).addEventListener(Event.ENTER_FRAME, checkMoviePlayHead);
MovieClip(balls[0]).play();
function checkMoviePlayHead(event:Event):void
{
    var movie:MovieClip = event.currentTarget as MovieClip;
    if(movie.currentFrame == movie.totalFrames)
    {
        movie.removeEventListener(Event.ENTER_FRAME, checkMoviePlayHead);
        movie.stop();
        var nextIndex:int = balls.indexOf(movie) + 1;
        if(nextIndex >= balls.length)
        {
            return;
        }
        movie = balls[nextIndex];
        movie.addEventListener(Event.ENTER_FRAME, checkMoviePlayHead);
        movie.play();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.