Actionscript 3 同一对象不同实例的定时播放
我想在同一个对象(我的例子中是小球)的实例上创建一组,该对象有自己的时间轴和动画,但我希望动画按顺序出现,一个接一个 代码如下:Actionscript 3 同一对象不同实例的定时播放,actionscript-3,Actionscript 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(
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++;
}
var-balls:Array=new-Array();
变量i:int;
i=0;
while(i您可以使用计时器事件。还有一种方法称为setTimeout
setTimeout( function(){
// Do your stuff here
}, 1000 ) // how much time you want to wait
在for循环中执行此操作时需要小心,因为“i”的作用域不一定正确。可以通过递归解决此问题,在递归中,函数反复调用自身,直到满足条件为止
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类来解决。如果不把它写出来,它不会有太多的代码,我想你可以通过带有2个函数的Timer来解决
编辑:在我忘记之前,这里有一些非常重要的东西,你应该注意。
查看以下函数调用:
setTimeout(recursiveLoop,delay);
函数recursiveLoop除了它的名字之外没有()。为什么呢?如果你用()在函数上,函数将立即被调用,而不是等待延迟结束。因此,当您引用函数作为其他函数的参数时,请记住要非常小心。您可能还会问自己如何将参数传递给recursiveLoop()函数。使用setTimeout会很尴尬。但是Greensock Tweening库也可以在一段时间后调用函数,如果您愿意,还可以调用参数。我不同意这些答案。虽然它们提供了一个有效的解决方案,但它们对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();
}
}
var-balls:Array=[];
变量i:int;
while(i=球的长度)
{
返回;
}
电影=球[nextIndex];
movie.addEventListener(Event.ENTER_FRAME,checkMoviePlayHead);
电影。播放();
}
}
使用此代码,所有动画将同时运行,但延迟1秒后。在您的情况下,您可以为循环中的每个动画增加延迟:setTimeout(someFunction,500*(i+1));这非常有效,就像我想象的那样!谢谢!:)while循环将按顺序尽可能快地执行,它不关心setTimeout。你的代码的结果是,在第一次执行while循环一秒钟后,5个ball对象将出现并执行它们的操作。如果你不解释原因,投票否决是无用的和没有建设性的。