AS3 О таймерах и циклах

У меня есть небольшой вопрос. Я делаю простую настольную игру. Пользователь имеет возможность играть против ИИ. Это работает нормально. Правила игры гласят, что если кто-то бросает кости и выпадает 1 или 4, он может играть снова. Поэтому я сделал цикл for. Это тоже работает. ИИ играет столько раз, сколько ему нужно, а затем позволяет играть P1. Моя проблема в том, что все анимации движений пешки происходят одновременно. Пример: Ход ИИ: 4. Играет снова: 1. Играет снова: 5. Ход игрока. Анимации для 4, 1 и 5 воспроизводятся одновременно (выглядит странно). Я бы хотел 2-секундную задержку между первым броском от ИИ и следующим, чтобы анимация успела разыграться. Я читал, что я должен использовать timerили setInterval, но я действительно не знаю, где и как разместить его в моем цикле. Вот примерная версия моего кода, если это поможет:

РЕДАКТИРОВАТЬ: обновлен код, благодаря ответу ниже:

function fnTimeOut() {
    var intervalId: uint = setTimeout(fnNextPlayer, 2000, null);
}

next.addEventListener(MouseEvent.CLICK, fnNextPlayer);
function fnNextPlayer (e:Event):void{
    if (player2.currentFrame == 2) { //AI's turn
            randDice=random(1, 6); //dice thrown (have a random function setup already)
            if (randDice==1){
                //start animation
                //move pawns
                fnTimeOut(); //restarts the function after 2secs
            }
            if (randDice==2){
                //start animation
                //move pawns
                player2.gotoAndStop(1); //starts player1's turns
                //stop loop because not 1 or 4
            }
        }
    }
}

Я надеюсь, что кто-то может мне помочь :) Спасибо.


person Jeryl    schedule 12.01.2015    source источник


Ответы (1)


У вас есть много вариантов. Например: вы можете добавить 2 секунды на временную шкалу анимации и прослушать окончание анимации. Или вы удаляете цикл for и запускаете тайм-аут после каждого шага. Что-то вроде этого: Напишите метод, который будет принимать решение для текущего шага:

function MakeDecision()
{
switch( state ):
case( state1):doSomething1()
case( state2 ):doSomething2()
}

куда

function doSomething1()
{
..your game code
startTimer for 2s , and call MakeDecision()
}

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

person Azzy Elvul    schedule 12.01.2015
comment
Прежде всего, спасибо за ваш ответ. Я решил использовать метод тайм-аута (поэтому мне не нужно переписывать много кода). Но я отметил ваш предложенный код и буду использовать его в своем следующем проекте, потому что он выглядит намного лучше, чем то, что я сделал :). Я обновляю свой первый пост рабочим кодом, если он может помочь другим! - person Jeryl; 12.01.2015