Как подождать 3 секунды в ActionScript 2 или 3?
Есть ли способ реализовать ожидание, скажем, 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
}
Если вы задаетесь вопросом, зачем мне это нужно - это юридическое требование, и нет, я не могу его изменить.
Ответы
Ответ 1
Используйте 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();
}
Ответ 2
Для AS3 используйте ответ Radu.
Для AS2 используйте функцию setInterval
следующим образом:
var timer = setInterval(function, 3000, param1, param2);
function (param1, param2) {
// your function here
clearInterval(timer);
}
Ответ 3
Вы также можете использовать delayedCall, из TweenMax. ИМХО, это самый острый способ сделать это, если вы знакомы с семейством TweenMax.
TweenMax.delayedCall(1, myFunction, ["param1", 2]);
function myFunction(param1:String, param2:Number):void
{
trace("called myFunction and passed params: " + param1 + ", " + param2);
}
В вашем случае с помощью функции anonymous:
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
В ActionScript нет Sleep
. Но есть и другие способы добиться того же, не имея всего кода в одной функции, и ждать в пределах этой функции определенного количества времени.
Вы можете легко иметь свой код в двух функциях и вызывать второй после определенного тайм-аута, установленного в вашей первой функции.
Ответ 5
почему вы делаете некоторые путаные способы, а не делаете правильный путь?
существует метод с именем: "setTimeout()";
setTimeout(myFunction,3000);
myFunction - это функция, которую вы хотите вызвать после периода. 3000 - это период, который вы хотите подождать (как милисекунды).
вам не нужно устанавливать интервал четкости или делать таймер с одним количеством повторений или делать еще больше проблем.
Ответ 6
ЭТО НЕ В ОДНОМ ФУНКЦИИ - ОТВЕТЫ: "Как подождать X секунд в 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 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 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);
}