Как ждать 3 секунды в ActionScript 2 или 3? - PullRequest
13 голосов
/ 08 ноября 2011

Есть ли способ реализовать ожидание, скажем, 3 секунды в ActionScript, но остаться в рамках той же функции?Я посмотрел setInterval, setTimeOut и аналогичные функции, но мне действительно нужно следующее:

public function foo(param1, param2, param3) {
  //do something here
  //wait for 3 seconds
  //3 seconds have passed, now do something more
}

На случай, если вам интересно, зачем мне это нужно - это законное требование, и нет, я не могу изменитьэто.

Ответы [ 6 ]

27 голосов
/ 08 ноября 2011

Используйте Timer для вызова функции через 3 секунды.

var timer:Timer = new Timer(3000);
timer.addEventListener(TimerEvent.TIMER, callback); // will call callback()
timer.start();

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

class Test {
    private var timer:Timer = new Timer(3000);

    public function foo(param1:int, param2:int, param3:int):void {
        // do something here
        timer.addEventListener(TimerEvent.TIMER, fooPartTwo);
        timer.start();
    }

    private function fooPartTwo(event:TimerEvent):void {
        timer.removeEventListener(TimerEvent.TIMER, fooPartTwo);
        timer = null;
        // 3 seconds have passed, now do something more
    }
}

Вы также можете использовать другую функцию внутри вашей функции foo и сохранить область видимости, так что вам не нужно передавать переменные.

function foo(param1:int, param2:int, param3:int):void {
    var x:int = 2; // you can use variables as you would normally

    // do something here

    var timer:Timer = new Timer(3000);
    var afterWaiting:Function = function(event:TimerEvent):void {
       timer.removeEventListener(TimerEvent.TIMER, afterWaiting);
       timer = null;

       // 3 seconds have passed, now do something more

       // the scope is retained and you can still refer to the variables you
       // used earlier
       x += 2;
    }

    timer.addEventListener(TimerEvent.TIMER, afterWaiting);
    timer.start();
}
4 голосов
/ 08 ноября 2011

Вы также можете использовать delayedCall , от TweenMax .ИМХО, это самый острый способ сделать это, если вы знакомы с семейством TweenMax.

TweenMax.delayedCall(1, myFunction, ["param1", 2]);

function myFunction(param1:String, param2:Number):void  
{ 
   trace("called myFunction and passed params: " + param1 + ", " + param2); 
}

В вашем случае используйте анонимную функцию:

public function foo(param1, param2, param3) {
   //do something here
   trace("I gonna wait 3 seconds");

   TweenMax.delayedCall(3, function()
   {
       trace("3 seconds have passed");
   });
}
4 голосов
/ 08 ноября 2011

Для AS3 используйте Ответ Раду .

Для AS2 используйте функцию setInterval следующим образом:

var timer = setInterval(function, 3000, param1, param2);

function (param1, param2) {

// your function here
clearInterval(timer);

}
2 голосов
/ 01 июня 2015

почему вы делаете некоторые запутанные пути вместо того, чтобы делать правильный путь?

существует метод с именем: "setTimeout ()";

setTimeout(myFunction,3000);

myFunction - это функция, которую вы хотите вызвать после точки. И 3000 - это период, который вы хотите подождать (в миллисекундах).

вам не нужно устанавливать, а затем очищать интервал, или делать таймер с одним счетчиком повторений, или делать что-то еще с большим количеством проблем☺.

2 голосов
/ 08 ноября 2011

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

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

0 голосов
/ 07 марта 2014

ЭТО НЕ В ОДНОЙ ФУНКЦИИ - ОТВЕТЫ: ​​«Как ждать Х секунд в AS2 & 3»

... без с использованием setInterval или clearInterval.

Ответы, опубликованные выше, намного быстрее и проще в использовании. Я разместил это здесь, на всякий случай ...

Иногда вы не сможете использовать set / clearInterval или другие методы, основанные на ограничениях разработки. Вот способ заставить задержку произойти без использования этих методов.

AS2 - Если вы копируете / вставляете приведенный ниже код в вашу временную шкалу, обязательно добавьте на сцену два фрагмента ролика, btnTest и btnGlowTest (включая аналогичные имена экземпляров). Увеличьте "btnGlowTest", измените его цвет и добавьте "btnTest" (для имитации свечения и кнопки соответственно).

Скомпилируйте и проверьте панель вывода для операторов трассировки, чтобы увидеть, как работает код. Нажмите на btnTest - btnGlowTest станет видимым на протяжении всей задержки (только для визуального представления).

У меня также есть таймер обратного отсчета onEnterFrame (таймеры остановки / переключения демонстраций).

Если вы хотите, чтобы задержка / свечение были длиннее - увеличьте число glowGameTime. Измените имена в соответствии со своими потребностями и / или примените логику по-другому.

var startTime:Number = 0;
var currentTime:Number = 0;
var mainTime:Number = 5;//"game" time on enter frame

var glowStartTime:Number = 0;
var glowCurrentTime:Number = 0;
var glowGameTime:Number = 1.8;//"delayed" time on press

btnGlowTest._visible = false;

this.onEnterFrame = TimerFunction;
startTime = getTimer();

function TimerFunction()
{   
    currentTime = getTimer();   

    var timeLeft:Number = mainTime - ((currentTime - startTime)/1000);

    timeLeft = Math.floor(timeLeft);    
    trace("timeLeft = " + timeLeft);

    if(timeLeft <= 0)
    {
        trace("time's up...3 bucks off");
        //...do stuff here
        btnGlowTest._visible = false;//just for show
        btnTest._visible = false;//just for show
        StopTime();
    }
}

function glowTimerFunction()
{   
    glowCurrentTime = getTimer();   

    var glowTimeLeft:Number = glowGameTime - ((glowCurrentTime - glowStartTime)/1000);  

    glowTimeLeft = Math.floor(glowTimeLeft);    
    //trace("glowTimeleft = " + glowTimeLeft);

    if(glowTimeLeft <= 0)
    {
        trace("TIME DELAY COMPLETE!");
        //...do stuff here
        btnGlowTest._visible = false;//just for show
        btnTest._visible = false;//just for show
        StopTime();
    }
}

btnTest.onPress = function()
{
    trace("onPress");
    btnGlowTest._visible = true;
    StopTime(); 
    GlowTime();
}

function GlowTime()
{
    trace("GlowTime Function"); 
    this.onEnterFrame = glowTimerFunction;  
    glowStartTime = getTimer();
}

function StopTime()
{
    trace(">>--StopTime--<<");
    delete this.onEnterFrame;   
}

AS3 - Ниже приведен приведенный выше код для настройки в AS3. Существуют разные способы достижения сходных результатов, но в зависимости от масштаба проекта это методы, которые использовались для правильного функционирования.

Если вы копируете / вставляете приведенный ниже код в вашу временную шкалу, обязательно добавьте на сцену два фрагмента ролика, btnTest и btnGlowTest (включая похожие имена экземпляров). Увеличьте "btnGlowTest", измените его цвет и добавьте "btnTest" (для имитации свечения и кнопки соответственно).

Скомпилируйте и проверьте панель вывода для операторов трассировки, чтобы увидеть, как работает код. Нажмите на btnTest - btnGlowTest станет видимым на протяжении всей задержки (только для визуального представления).

Если вы хотите, чтобы задержка / свечение были длиннее - увеличьте число GlowTimer:Timer (в настоящее время установлено на 950). Измените имена в соответствии со своими потребностями и / или примените логику по-другому.

import flash.events.MouseEvent;
import flash.utils.Timer;
import flash.events.TimerEvent;

var startTime:Number = 0;
var currentTime:Number = 0;
var gameTime:Number = 4;//"game" time on enter frame

var GlowTimer:Timer = new Timer(950,0);//"delayed" time on press

btnGlowTest.visible = false;

GlowTimer.addEventListener(TimerEvent.TIMER, GlowTimeListener, false, 0, true);
btnTest.addEventListener(MouseEvent.MOUSE_DOWN, btnTestPressed, false, 0, true);
addEventListener(Event.ENTER_FRAME,TimerFunction, false, 0, true);

startTime = getTimer();

function TimerFunction(event:Event)
{   
    currentTime = getTimer();

    var timeLeft:Number = gameTime - ((currentTime - startTime)/1000);  

    timeLeft = Math.floor(timeLeft);
    trace("timeLeft = " + timeLeft);

    if(timeLeft <= 0)
    {
        trace("time's up, 3 bucks off");
        StopTime();
    }   
}

function GlowTimeListener (e:TimerEvent):void
{
    trace("TIME DELAY COMPLETE!");      
    StopTime();
}

function btnTestPressed(e:MouseEvent)
{   
    trace("PRESSED");       
    removeEventListener(Event.ENTER_FRAME, TimerFunction);
    btnGlowTest.visible = true;
    GlowTimer.start();
}

function StopTime()
{
    trace(">>--Stop Time--<<");
    btnGlowTest.visible = false;//just for show
    btnTest.visible = false;//just for show
    GlowTimer.stop();
    removeEventListener(TimerEvent.TIMER, GlowTimeListener);
    removeEventListener(Event.ENTER_FRAME, TimerFunction);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...