AS3.0 Два цикла For с задержкой - PullRequest
1 голос
/ 08 июня 2011

У меня есть следующий код, и я хотел бы добавить задержку в 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 ]

4 голосов
/ 08 июня 2011
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;
}
3 голосов
/ 08 июня 2011

Вы не можете остановить выполнение кода в середине такого утверждения, лучше всего использовать таймер:

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();
        }

    }
}
0 голосов
/ 08 июня 2011

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);
    }
}
0 голосов
/ 08 июня 2011

Вы не можете задерживать петли в as3.

Для этого вам нужно использовать таймеры.Некоторую помощь для вашего решения вы можете найти здесь: Как показать текущее значение progressBar процесса в цикле в flex-as3?

В конце вам просто нужно изменить логику функции.

...