[AS3]as3.0基于系统时间的时间管理器Ticker类
作为一个游戏开发者,我想大家或多或少的都从一些老鸟那里听到过,不能用系统自带的Timer的说法。不论是Windows编程中的SetTimer,还是AS3中的Timer,都不适合用于游戏编程中,建议少用,或者干脆不用。
纠其原因,最关键的还是因为Timer的不准确性,由于Timer事件优先级的原因,很难保证Timer会准时的干你想干的事情。
而游戏里面大部分情况下对时间的准确性是有很大的要求的,有时间需要精确到ms,甚至更低。比如在赛车游戏中,时间就是玩家最关注的点之一,不能有半点马虎。
对于玩家来说,时间就是金钱,时间就是生命啊。。。
不过幸运的是,我们有 getTimer 这个方法,该方法返回 Flash Player 运行以来的毫秒数。这是个万金油,我们可以通过取两帧之间的时间间隔来达到精确控制时间的目的。
先看以下代码:
- package org.easily.ticker
- {
- import flash.events.Event;
- import flash.utils.getTimer;
- import org.easily.display.Container;
- public class TickerLauncher extends Container
- {
- public var tickerMgr:TickerManager = TickerManager.getInstance();
- public var lastTime:Number = 0;
- public function TickerLauncher()
- {
- super();
- start();
- }
- public function start():void
- {
- lastTime = getTimer();
- addEventListener(Event.ENTER_FRAME, onUpdate);
- }
- public function stop():void
- {
- removeEventListener(Event.ENTER_FRAME, onUpdate);
- }
- protected function onUpdate(event:Event):void
- {
- // TODO Auto-generated method stub
- var time:Number = getTimer();
- var dtime:Number = time - lastTime;
- lastTime = time;
- tickerMgr.doTick(dtime);
- }
- override public function dispose():void
- {
- // TODO Auto Generated method stub
- stop();
- super.dispose();
- }
- }
- }
在 onUpdate 该方法中,计算了上一帧到这一帧之间的时候间隔 dtime ,有了这个时间,我们就可以制作一个基于该间隔时间的定时器。
比如我要启用一个100 ms 的定时器,可以这样:
- var delay:Number = 100;
- var totalTime:Number = 0;
- function onTimer(dtime:Number):void
- {
- totalTime += dtime;
- if (totalTime >= delay)
- {
- //CuPlayer.com酷播提示:定时器到了
- }
- }
一个定时器的雏形大概就是上面这个样子了。
可以包装一下,包装一个 Ticker 类,如下:
- package org.easily.ticker
- {
- /**
- * @author Easily
- */
- public class Ticker
- {
- public var timerFunc:Function;
- public var compFunc:Function;
- public function Ticker(timerFunc_:Function = null, compFunc_:Function = null)
- {
- timerFunc = timerFunc_;
- compFunc = compFunc_;
- }
- public function start():void
- {
- TickerManager.getInstance().addTicker(this);
- }
- public function stop():void
- {
- TickerManager.getInstance().removeTicker(this);
- }
- public function reset():void
- {
- }
- public function doTick(dtime:Number):void
- {
- }
- public function dispose():void
- {
- stop();
- reset();
- timerFunc = null;
- compFunc = null;
- }
- }
- }
doTick 方法中就是上面 onTimer 类似的逻辑了。
热门文章推荐
- [HLS]做自己的m3u8点播系统使用HTTP Live Streaming(HLS技术)
- [FMS]FMS流媒体服务器配置与使用相关的介绍
- [AS3]什么是M3U8,与HTML5的区别是什么
- AS2.0 让flash自适应全屏,并且不自动缩放
- [AS3]as3.0的sound类常用技巧整理
- [AS3]as3与ByteArray详解、ByteArray介绍、ByteArray用法
- 关于RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍
- [JS]分享浏览器弹出窗口不被拦截JS示例