如何在ActionScript 2或3中等待3秒钟?

如何在ActionScript 2或3中等待3秒钟?,actionscript,Actionscript,有没有办法实现等待,比如说,在ActionScript中等待3秒钟,但保持在相同的函数中?我看过setInterval、setTimeOut和类似的函数,但我真正需要的是: public function foo(param1, param2, param3) { //do something here //wait for 3 seconds //3 seconds have passed, now do something more } 如果你想知道我为什么需要这个-这是法律要

有没有办法实现等待,比如说,在ActionScript中等待3秒钟,但保持在相同的函数中?我看过setInterval、setTimeOut和类似的函数,但我真正需要的是:

public function foo(param1, param2, param3) {
  //do something here
  //wait for 3 seconds
  //3 seconds have passed, now do something more
}
如果你想知道我为什么需要这个-这是法律要求,不,我不能更改它。

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

ActionScript中没有
睡眠
。但是,还有其他方法可以实现同样的功能,而不需要将所有代码放在一个函数中,并在该函数中等待特定的时间

您可以轻松地将代码分成两个函数,并在第一个函数中设置的特定超时后调用第二个函数。

供AS3使用

对于AS2,使用如下的
setInterval
函数:

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

function (param1, param2) {

// your function here
clearInterval(timer);

}
您也可以使用,从。嗯,如果你熟悉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");
   });
}

这不是一个函数-回答:“如何在AS2和AS3中等待X秒”

不使用使用setInterval或clearInterval

上面发布的答案更快,更容易使用。我把这个贴在这里,以防万一

有时您可能无法使用
set
/
clearInterval
或基于开发限制的其他方法。这里有一种不使用这些方法就可以实现延迟的方法

AS2-如果您将下面的代码复制/粘贴到时间表中,请确保在舞台上添加两个电影剪辑,
btnTest
btnGlowTest
(包括类似的实例名称)。使“btnGlowTest”变大,颜色不同,并位于“btnTest”后面(分别模拟辉光和按钮)

编译并检查输出面板中的跟踪语句,以查看代码是如何工作的。单击btnTest-btnGlowTest将在整个延迟期间可见(仅用于视觉表示)

我这里也有一个单帧倒计时(演示停止/切换计时器)

如果您希望延迟/发光时间更长,请增加
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;   
}

为什么你在做一些困惑的事情而不是正确的事情

有一个方法名为:“setTimeout()”

myFunction是您希望在该时间段后调用的函数。3000是您希望等待的时间段(以毫秒计)


您不需要设置然后清除间隔,或使计时器重复计数或做其他更麻烦的事情☺.

您需要有单独的或子函数来防止代码阻塞。阻塞是可以的。事实上,我希望所有东西都被封锁3秒钟。不,你不能。3秒钟的代码阻塞会使浏览器崩溃。您想要的是等待并忽略所有用户输入,这是明显不同的。我的代码位于UI层的下方。我完全无法控制用户界面。在这个项目中,我必须使用纯AS,没有额外的库,但感谢您提供的信息。没有理由吗?计算机也没有理由存在。@Christian想解释一下在一个函数中可以做什么,而在延迟回调中不能做什么吗?“没有理由”并不是“侮辱”。可能是我母语的逐字翻译在这里不太好:-)我已经更正了语句。你也可以使用
setTimeout(function(){…},3000)(无需清除)。
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);
}
setTimeout(myFunction,3000);