Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 同一对象不同实例的定时播放_Actionscript 3 - Fatal编程技术网

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对象将出现并执行它们的操作。如果你不解释原因,投票否决是无用的和没有建设性的。