·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]as3.0基于系统时间的时间管理器Ticker类

时间:2015-09-13 22:18酷播
作为一个游戏开发者,我想大家或多或少的都从一些老鸟那里听到过,不能用系统自带的Timer的说法。不论是Windows编程中的SetTimer,还是AS3中的Timer,都不适合用于游戏编程中,建议少用,或者干脆不用。

作为一个游戏开发者,我想大家或多或少的都从一些老鸟那里听到过,不能用系统自带的Timer的说法。不论是Windows编程中的SetTimer,还是AS3中的Timer,都不适合用于游戏编程中,建议少用,或者干脆不用。

纠其原因,最关键的还是因为Timer的不准确性,由于Timer事件优先级的原因,很难保证Timer会准时的干你想干的事情。

而游戏里面大部分情况下对时间的准确性是有很大的要求的,有时间需要精确到ms,甚至更低。比如在赛车游戏中,时间就是玩家最关注的点之一,不能有半点马虎。

对于玩家来说,时间就是金钱,时间就是生命啊。。。

不过幸运的是,我们有 getTimer 这个方法,该方法返回 Flash Player 运行以来的毫秒数。这是个万金油,我们可以通过取两帧之间的时间间隔来达到精确控制时间的目的。

先看以下代码:

  1. package org.easily.ticker 
  2.     import flash.events.Event; 
  3.     import flash.utils.getTimer; 
  4.       
  5.     import org.easily.display.Container; 
  6.       
  7.     public class TickerLauncher extends Container 
  8.     { 
  9.         public var tickerMgr:TickerManager = TickerManager.getInstance(); 
  10.         public var lastTime:Number = 0
  11.           
  12.         public function TickerLauncher() 
  13.         { 
  14.             super(); 
  15.             start(); 
  16.         } 
  17.           
  18.         public function start():void 
  19.         { 
  20.             lastTime = getTimer(); 
  21.             addEventListener(Event.ENTER_FRAME, onUpdate); 
  22.         } 
  23.           
  24.         public function stop():void 
  25.         { 
  26.             removeEventListener(Event.ENTER_FRAME, onUpdate); 
  27.         } 
  28.           
  29.         protected function onUpdate(event:Event):void 
  30.         { 
  31.             // TODO Auto-generated method stub 
  32.             var time:Number = getTimer(); 
  33.             var dtime:Number = time - lastTime; 
  34.             lastTime = time
  35.             tickerMgr.doTick(dtime); 
  36.         } 
  37.           
  38.         override public function dispose():void 
  39.         { 
  40.             // TODO Auto Generated method stub 
  41.             stop(); 
  42.             super.dispose(); 
  43.         } 
  44.     } 

在 onUpdate 该方法中,计算了上一帧到这一帧之间的时候间隔 dtime ,有了这个时间,我们就可以制作一个基于该间隔时间的定时器。

比如我要启用一个100 ms 的定时器,可以这样:

  1. var delay:Number = 100
  2. var totalTime:Number = 0
  3. function onTimer(dtime:Number):void 
  4.     totalTime += dtime; 
  5.     if (totalTime >= delay) 
  6.     { 
  7.         //CuPlayer.com酷播提示:定时器到了 
  8.     } 

一个定时器的雏形大概就是上面这个样子了。

可以包装一下,包装一个 Ticker 类,如下:

  1. package org.easily.ticker 
  2.     /** 
  3.      * @author Easily 
  4.      */ 
  5.     public class Ticker 
  6.     { 
  7.         public var timerFunc:Function; 
  8.         public var compFunc:Function; 
  9.           
  10.         public function Ticker(timerFunc_:Function = nullcompFunc_:Function = null
  11.         { 
  12.             timerFunc = timerFunc_
  13.             compFunc = compFunc_;   
  14.         } 
  15.           
  16.         public function start():void 
  17.         { 
  18.             TickerManager.getInstance().addTicker(this); 
  19.         } 
  20.           
  21.         public function stop():void 
  22.         { 
  23.             TickerManager.getInstance().removeTicker(this); 
  24.         } 
  25.           
  26.         public function reset():void 
  27.         { 
  28.         } 
  29.           
  30.         public function doTick(dtime:Number):void 
  31.         { 
  32.         } 
  33.           
  34.         public function dispose():void 
  35.         { 
  36.             stop(); 
  37.             reset(); 
  38.             timerFunc = null
  39.             compFunc = null
  40.         } 
  41.     } 

doTick 方法中就是上面 onTimer 类似的逻辑了。

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器