·您当前的位置:首页 > 技术教程 > 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. { 
  3.     import flash.events.Event; 
  4.     import flash.utils.getTimer; 
  5.       
  6.     import org.easily.display.Container; 
  7.       
  8.     public class TickerLauncher extends Container 
  9.     { 
  10.         public var tickerMgr:TickerManager = TickerManager.getInstance(); 
  11.         public var lastTime:Number = 0; 
  12.           
  13.         public function TickerLauncher() 
  14.         { 
  15.             super(); 
  16.             start(); 
  17.         } 
  18.           
  19.         public function start():void 
  20.         { 
  21.             lastTime = getTimer(); 
  22.             addEventListener(Event.ENTER_FRAME, onUpdate); 
  23.         } 
  24.           
  25.         public function stop():void 
  26.         { 
  27.             removeEventListener(Event.ENTER_FRAME, onUpdate); 
  28.         } 
  29.           
  30.         protected function onUpdate(event:Event):void 
  31.         { 
  32.             // TODO Auto-generated method stub 
  33.             var time:Number = getTimer(); 
  34.             var dtime:Number = time - lastTime; 
  35.             lastTime = time; 
  36.             tickerMgr.doTick(dtime); 
  37.         } 
  38.           
  39.         override public function dispose():void 
  40.         { 
  41.             // TODO Auto Generated method stub 
  42.             stop(); 
  43.             super.dispose(); 
  44.         } 
  45.     } 
  46. } 

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

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

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

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

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

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

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

热门文章推荐

请稍候...

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

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