AS3.0两个带有延迟的For循环

时间:2011-06-08 13:39:15

标签: actionscript-3 for-loop delay

我有以下代码,我希望在每个跟踪语句后添加200毫秒的延迟

for (var x_pos:uint = 0; x_pos <= 12; x_pos++){ 
    for (var y_pos:uint = 0; y_pos <=12; y_pos++){
        trace("hello world " +"("x_pos+","+y_pos+")");
        //CODE FOR DELAY OF 200ms    
    }
}

真实情况有点复杂但有点相同:

//For each Row 
for (var x_pos:uint = 0; x_pos <= tile_amount-1; x_pos++){
    //For each column 
    for (var y_pos:uint = 0; y_pos <= tile_amount-1; y_pos++){
        //New tile;
        var newtile:Tile = new Tile;

        //Set position
        newtile.x = ((40*y_pos)-(40*x_pos));
        newtile.y = ((20*y_pos)+(20*x_pos));

        //Add to stage 
        addChild(newtile);
    }
}

有人有什么建议吗?

4 个答案:

答案 0 :(得分:4)

private var x_pos:uint;
private var y_pos:uint;
private var timer:Timer;

public function startLoop():void
{
    x_pos = 0;
    y_pos = 0;

    timer = new Timer(200);
    timer.addEventListener(TimerEvent.TIMER, onTick);
    timer.start();
}

private function onTick(event:TimerEvent):void
{
    trace("hello world " +"("x_pos+","+y_pos+")");

    if (++y_pos <= 12)
        return;

    y_pos = 0;
    if (++x_pos <= 12)
        return;

    timer.stop();
    timer.removeEventListener(TimerEvent.TIMER, onTick);
    timer = null;
}

答案 1 :(得分:3)

你不能在这样的声明中间停止执行代码,最好的办法是使用计时器:

package 
{
    import flash.events.TimerEvent;

    public class Foo
    {

        private var x_pos:uint = 0;
        private var y_pos:uint = 0;
        private var timer:Timer;

        public function Foo()
        {
            timer = new Timer(200, 0);
            timer.addEventListener(TimerEvent.TIMER, handleTick);
            timer.start();
        }


        public function handleTick(e:TimerEvent):void {

            trace("hello world " +"("x_pos+","+y_pos+")");
            y_pos++;
            if(y_pos > 12){
                x_pos++;
                y_pos = 0;
            }

            if(x_pos > 12) timer.stop();
        }

    }
}

答案 2 :(得分:0)

你不能在as3中延迟循环。

为此,您需要使用计时器。您可以在此处找到有关解决方案的一些帮助:How to show the current progressBar value of process within a loop in flex-as3?

最后你只需要修改功能逻辑。

答案 3 :(得分:0)

Actionscript没有阻塞超时系统 - 您需要执行自己的递归功能。以下完美,但这是一个开始。

import flash.utils.setTimeout;

// call the final function.
delayedRecursion(12,12,200, 
   function(curX:Number, curY:Number):void
   {
      trace("hello world " +"("+curX+","+curY+")");
   });

//This is really a wrapper around delayedRecursionHelper
function delayedRecursion(maxX:Number, maxY:Number, 
                          delay:Number, callback:Function):void
{
     delayedRecursionHelper(0,-1,maxX,maxY,delay,callback);
}

// each time you call this, it creates a function which holds the variables
// passed in, but incremented by 1.
function delayedRecursionHelper( 
                                 curX:Number, cury:Number, 
                                 maxX:Number, maxY:Number, 
                                 delay:Number, called:Function ):Function
{
    return function():void
    {
        called(curX, curY);
        // Exit condition: nothing to do here!
        if( curX == maxX && curY == maxY ) return; 
        if( curY == maxY )
        {
            curY = -1;
            curX++;
        }
        curY++;
        setTimeout(delayedRecursionHelper(curX, curY, maxX, maxY, delay), delay);
    }
}