Задержка в цикле с ActionScript 3 - PullRequest
0 голосов
/ 15 декабря 2011

У меня есть какая-то функция цикла для игры, этот цикл для открытия поля 9, здесь код

function random_item_2(coinsx)
{
    var listItem:Array = new Array();
    for (var i:uint=0; i<15; i++)
    {
        listItem.push(i);
    }
    ItemLeft = 0;
    for (var x:uint=0; x<boardWidth; x++)
    {
        for (var y:uint=0; y<boardHeight; y++)
        {
            var thisItem:FirstBox = new FirstBox();
            thisItem.x = x * IcardHorizontalSpacing + IboardOffsetX;
            thisItem.y = y * IcardVerticalSpacing + IboardOffsetY;
            var r:int = Math.floor(Math.random() * listItem.length);
            thisItem.cardface = listItem[r];
            listItem.splice(r,1);
            thisItem.gotoAndStop(thisItem.cardface+2);
            var itemFound = this.foundItem(thisItem.cardface);
            if (itemFound == 50 || itemFound == 100 || itemFound == 250 || itemFound == 500 || itemFound == 1000)
            {
                var itemC = Number(coinsx) + Number(itemFound);
                coinsx = itemC;
                update_coins(Number(coinsx));
                info_coinstext(String(coinsx));
                trace('Gold Coins Found > '+itemFound);
            }else if(itemFound!='Kosong'){
                updateItem(itemFound);
                trace('Item Found > '+itemFound);
            }
            addChild(thisItem);
            ItemLeft++;
        }
    }
}

проблема в том, что 9 ящиков открываются за один раз, а не один за другим, я хочу, чтобы ящики открывались один за другим, после того, как открылся первый ящик, чтобы открылся следующий ящик, здесь для некоторого алгоритма, который я хотел

open the first box
delay 5 sec
open the second box
delay for 5 sec

как я могу это сделать?

Ответы [ 3 ]

2 голосов
/ 15 декабря 2011

Ну, есть несколько вариантов.

Вы можете использовать setTimeout для задержки вызова функции:

setTimeout(functionToExecuteAfterDelay, 2000)

ИЛИ

Вы можете использовать класс таймераas3 для выполнения функций в установленные промежутки времени.

var myTimer:Timer = new Timer(5000,9); //Will tick 9 times, each after 5000 milliseconds
myTimer.addEventListener(TimerEvent.TIMER,someFunction);
myTimer.start();
function someFunction(event:TimerEvent) {
    //do your openingstuff here
}

Лично я бы выбрал вариант 2. Кроме того, удалите прослушиватель TimerEvent после того, как с ним покончено.

1 голос
/ 15 декабря 2011

Чтобы добавить задержку в цикл for, вы должны написать что-то вроде этого:

function random_item_2(coinsx)
{
    var listItem:Array = new Array();
    for (var i:uint=0; i<15; i++)
    {
        listItem.push(i);
    }
    ItemLeft = 0;

    const DELAY:int = 5000;

    for (var x:uint=0; x<boardWidth; x++)
    {
        for (var y:uint=0; y<boardHeight; y++)
        {
            setTimeout(addItem, (x*boardHeight+y)*DELAY, x, y);
        }
    }
}

function addItem(x:uint, y:uint) : void
{
    var thisItem:FirstBox = new FirstBox();
    thisItem.x = x * IcardHorizontalSpacing + IboardOffsetX;
    thisItem.y = y * IcardVerticalSpacing + IboardOffsetY;

    var r:int = Math.floor(Math.random() * listItem.length);

    thisItem.cardface = listItem[r];
    listItem.splice(r,1);
    thisItem.gotoAndStop(thisItem.cardface+2);

    var itemFound = this.foundItem(thisItem.cardface);

    if(itemFound == 50 || itemFound == 100 || itemFound == 250 || itemFound == 500 || itemFound == 1000)
    {
        var itemC = Number(coinsx) + Number(itemFound);
        coinsx = itemC;
        update_coins(Number(coinsx));
        info_coinstext(String(coinsx));
        trace('Gold Coins Found > '+itemFound);
    }
    else if(itemFound!='Kosong')
    {
        updateItem(itemFound);
        trace('Item Found > '+itemFound);
    }

    addChild(thisItem);
    ItemLeft++;
}

Увеличивая задержку каждый раз, когда вы устанавливаете тайм-аут, функция будет вызываться позже.

0 голосов
/ 15 декабря 2011

Это классический случай setInterval

var interval:int=0;
var nextBoxToOpen:int=0;
var maxBoxes:int = 9;

function openBox(e:TimerEvent):void {
    //code to open box;
    nextBoxToOpen++;
    if(nextBoxToOpen >= maxBoxes) {
        nextBoxToOpen=0;
        clearInterval(interval);
    }
}

function startOpen():void {
    interval = setInterval(openBox, 5000);
}

ИЛИ, в AS3 вы можете использовать таймер

var tmr:Timer = new Timer(5000, 9); //Interval = 5000 ms, Number of ticks = 9
tmr.addEventListener(TimerEvent.TIMER, openBox);
tmr.start();
function openBox():void {
    var boxToOpen = tmr.currentCount;
    //code to open box;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...