我想在同一个对象(我的情况下是小球)的实例上做一堆,它有自己的时间轴和自己的动画,但我希望动画顺序,一个接一个地来。
以下是代码:
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上放置代码,所以我宁愿将所有代码放在一个地方,而不是在这里,稍微有点。
答案 0 :(得分:0)
您可以使用计时器事件。还有一个名为setTimeout的方法。
setTimeout( function(){
// Do your stuff here
}, 1000 ) // how much time you want to wait
你需要在你的for循环中小心这样做,因为&#39;我&#39;不一定必须正确地确定范围。
答案 1 :(得分: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也可以在一段时间后调用一个函数,如果你愿意的话也可以调用参数。
答案 2 :(得分: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();
}
}