有没有办法在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
}
如果您想知道我为什么需要这个 - 这是法律要求,不,我无法改变它。
答案 0 :(得分:26)
使用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();
}
答案 1 :(得分:4)
对于AS3,请使用Radu's answer。
对于AS2,请使用setInterval
函数,如下所示:
var timer = setInterval(function, 3000, param1, param2);
function (param1, param2) {
// your function here
clearInterval(timer);
}
答案 2 :(得分: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");
});
}
答案 3 :(得分:2)
ActionScript中没有Sleep
。但是,如果没有将所有代码放在一个函数中并在该函数内等待一段特定的时间,还有其他方法可以实现相同的功能。
您可以轻松地将代码放在两个函数中,并在第一个函数中设置的特定超时后调用第二个函数。
答案 4 :(得分:2)
为什么你做了一些混乱的方式,而不是采取正确的方式?
有一个名为“setTimeout()”;
的方法setTimeout(myFunction,3000);
myFunction是你想要在句号之后调用的函数。而3000是你想要等待的句号(以毫秒为单位)。
你不需要设置然后清除间隔,或者制作一个重复计数的计时器,或者做更麻烦的其他☺。
答案 5 :(得分:0)
这不是一个功能 - 答案:“如何在AS2& 3中等待X秒”
... 不使用使用setInterval或clearInterval。
上面发布的答案更快更容易使用。我在这里发布了这个,以防万一...
有时您可能无法使用基于开发限制的set
/ clearInterval
或其他方法。这是一种在不使用这些方法的情况下延迟发生的方法。
AS2 - 如果您将以下代码复制/粘贴到时间轴,请确保将两个影片剪辑添加到舞台btnTest
和btnGlowTest
(包含类似实例)名)。使“btnGlowTest”更大,颜色不同,&在“btnTest”后面(分别模拟发光和按钮)。
编译并检查输出面板中的trace语句,以查看代码的工作方式。点击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”更大,颜色不同,&amp;在“btnTest”后面(分别模拟发光和按钮)。
编译并检查输出面板中的trace语句,以查看代码的工作方式。点击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);
}