【问题标题】:How to wait for 3 seconds in ActionScript 2 or 3?如何在 ActionScript 2 或 3 中等待 3 秒?
【发布时间】:2023-03-20 07:35:01
【问题描述】:

有什么方法可以在 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 秒。
  • 不,你没有。 3 秒的代码阻塞可能会使浏览器崩溃。您想要的是等待并忽略所有用户输入,这是截然不同的。
  • 我的代码在 UI 层之下。我完全无法控制 UI。

标签: actionscript


【解决方案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】:

    ActionScript 中没有 Sleep。但是还有其他方法可以实现相同的目的,而无需将所有代码放在一个函数中并在该函数中等待特定的时间。

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

    【讨论】:

    • 没有的原因吗?计算机也没有理由存在。
    • @Christian Care 解释一下你可以在单个函数中做哪些在延迟回调中不能做的事情?
    • “没有理由”并不意味着“侮辱”。可能是我母语的逐字翻译在这里不太好:-)我已经更正了这个说法。
    【解决方案3】:

    对于 AS3,请使用 Radu's answer

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

    var timer = setInterval(function, 3000, param1, param2);
    
    function (param1, param2) {
    
    // your function here
    clearInterval(timer);
    
    }
    

    【讨论】:

    • 您也可以使用setTimeout(function() { ... }, 3000);(无需清除)。
    【解决方案4】:

    您也可以使用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");
       });
    }
    

    【讨论】:

    • 在这个项目中我必须使用纯 AS,没有额外的库,但感谢您提供的信息。
    【解决方案5】:

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

    ...不使用 setInterval 或 clearInterval。

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

    由于开发限制,有时您可能无法使用set/clearInterval 或其他方法。这是一种无需使用这些方法即可实现延迟的方法。

    AS2 - 如果您将以下代码复制/粘贴到时间轴,请确保将两个影片剪辑添加到舞台,btnTestbtnGlowTest(包括类似的实例名称)。使“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 中运行的代码。有不同的方法可以实现类似的结果,但根据项目范围,这些方法是为了让事情正常运行而使用的。

    如果您将以下代码复制/粘贴到时间轴,请确保将两个影片剪辑添加到舞台,btnTestbtnGlowTest(包括类似的实例名称)。使“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);
    }
    

    【讨论】:

      【解决方案6】:

      为什么你做一些混乱的方式而不是做正确的方式?

      有一个方法名为:"setTimeout()";

      setTimeout(myFunction,3000);
      

      myFunction 是您要在句点之后调用的函数。而 3000 是您要等待的时间段(以毫秒为单位)。

      你不需要设置然后清除间隔,或者做一个重复计数的计时器或者做其他更麻烦的事情☺。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-23
        • 2023-04-10
        • 2019-09-11
        • 2011-12-02
        • 1970-01-01
        • 1970-01-01
        • 2020-05-19
        相关资源
        最近更新 更多