控制时间间隔

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

使用 Adobe Flash CS4 Professional 开发应用程序时,您可以访问时间轴,这会使您稳定且逐帧地完成该应用程序。但在纯 ActionScript 项目中,您必须依靠其他计时机制。

循环与计时器之比较

在某些编程语言中,必须使用循环语句(如 for do..while)来设计自己的计时方案while.

通常,循环语句会以本地计算机所允许的速度尽可能快地执行,这表明应用程序在某些计算机上的运行速度较快而在其他计算机上则较慢。如果应用程序需要一致的计时间隔,则您需要将其与实际的日历或时钟时间联系在一起。许多应用程序(如游戏、动画和实时控制器)需要在不同计算机上均能保持一致的、规则的时间驱动计时机制。

ActionScript 3.0 的 Timer 类提供了一个功能强大的解决方案。使用 ActionScript 3.0 事件模型,Timer 类在每次达到指定的时间间隔时都会调度计时器事件。

Timer 类

在 ActionScript 3.0 中处理计时函数的首选方式是使用 Timer 类 (flash.utils.Timer),可以使用它在每次达到间隔时调度事件。

要启动计时器,请先创建 Timer 类的实例,并告诉它每隔多长时间生成一次计时器事件以及在停止前生成多少次事件。

例如,下列代码创建一个每秒调度一个事件且持续 60 秒的 Timer 实例:

var oneMinuteTimer:Timer = new Timer(1000, 60);

Timer 对象在每次达到指定的间隔时都会调度 TimerEvent 对象。TimerEvent 对象的事件类型是 timer (由常量 TimerEvent.TIMER 定义)。TimerEvent 对象包含的属性与标准 Event 对象包含的属性相同。

如果将 Timer 实例设置为固定的间隔数,则在达到最后一次间隔时,它还会调度 timerComplete 事件(由常量 TimerEvent.TIMER_COMPLETE 定义)。

以下是一个用来展示 Timer 类实际操作的小示例应用程序:

package  
{ 
    import flash.display.Sprite; 
    import flash.events.TimerEvent; 
    import flash.utils.Timer; 
 
    public class ShortTimer extends Sprite 
    { 
        public function ShortTimer()  
        { 
            // creates a new five-second Timer 
            var minuteTimer:Timer = new Timer(1000, 5); 
             
            // designates listeners for the interval and completion events 
            minuteTimer.addEventListener(TimerEvent.TIMER, onTick); 
            minuteTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete); 
             
            // starts the timer ticking 
            minuteTimer.start(); 
        } 
 
        public function onTick(event:TimerEvent):void  
        { 
            // displays the tick count so far 
            // The target of this event is the Timer instance itself. 
            trace("tick " + event.target.currentCount); 
        } 
 
        public function onTimerComplete(event:TimerEvent):void 
        { 
            trace("Time's Up!"); 
        } 
    } 
}

创建 ShortTimer 类时,它会创建一个用于每秒计时一次并持续五秒的 Timer 实例。然后,它将两个侦听器添加到计时器:一个用于侦听每次计时,另一个用于侦听 timerComplete 事件。

接着,它启动计数器计时,并且从此时起以一秒钟的间隔执行 onTick() 方法。

onTick() 方法只显示当前的时间计数。五秒钟后,执行 onTimerComplete() 方法,告诉您时间已到。

运行该示例时,您应会看到下列行以每秒一行的速度显示在控制台或跟踪窗口中:

tick 1 
tick 2 
tick 3 
tick 4 
tick 5 
Time's Up!

flash.utils 包中的计时函数

ActionScript 3.0 包含许多与 ActionScript 2.0 提供的计时函数类似的计时函数。这些函数是作为 flash.utils 包中的包级别函数提供的,它们的功能与 ActionScript 2.0 中完全相同。

函数

说明

clearInterval(id:uint):void

取消指定的 setInterval() 调用。

clearTimeout(id:uint):void

取消指定的 setTimeout() 调用。

getTimer():int

返回自 Adobe® Flash® Player 或 Adobe® AIR™ 初始化以来经过的毫秒数。

setInterval(closure:Function, delay:Number, ... arguments):uint

以指定的间隔(以毫秒为单位)运行函数。

setTimeout(closure:Function, delay:Number, ... arguments):uint

在指定的延迟(毫秒)后运行指定的函数。

这些函数仍保留在 ActionScript 3.0 以实现向后兼容。Adobe 不建议您在新的 ActionScript 3.0 应用程序中使用这些函数。通常,在应用程序中使用 Timer 类会更容易且更有效。