[转]AS3 游戏计时器管理

因为工作需要 花了点时间 写了一个AS3游戏计时器管理

在游戏开发过程中 会发现有很多地方会运用到计时器的功能 比如升级某个建筑 部队到达某城还有多少时间 等等 如果在每一个需要计时器的动作上都new Timer的话 太多计时器 将会吃掉你的CPU 导致有点卡卡 不流畅(这个经验来自于去年开发的游戏)

所以不管有多少个地方要用到计时器 咱们只需要一个new Timer就可以了 这个计时器类的时间跳动是有标准的 是按秒进行播放器的

单位换算
如:1小时=60分
1小时=3600秒
1分=60秒
1秒=1/60 分
1秒=1/3600小时
1秒=1000毫秒;

此类为一个单例类,封装了两个方法

public function regTimer(_timeItem:String=null, _timeNum:int=0, _timeTxt:TextField=null,_fun:Function=null):void

参数说明:

_timeItem:String 为一个注册到计时器的唯一的一个标识符

_timeNum:int 一个要进行倒数计时的秒数

_timeTxt:TextField 一个文本框对象

_fun:Function 在倒数的时候 需要回调的方法

public function removeTimer(_timeItem:String):void

参数说明:

_timeItem:String 要删除注册在计时器中的标识符(唯一性)


package myapp.utility.common{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.text.TextField;
import flash.utils.Timer;
import myapp.utility.common.debug.Debug;
import myapp.utility.myevents.GameTimeEvent;
/**
* @author silva
* 实现方法
* regTimer(_timeItem:String, _timeNum:int, _timeTxt:TextField):void
* //注册了时间后 倒数完会自己删除注册的对象 排除在队列中
* 游戏计时器管理器
*/
public class GameTime extends Sprite {
private var timer:Timer;
public static var TIMEOVER:String = "GameTime::timerover";
private static var _class:GameTime;
private var timeListArr:Array = new Array();
public function GameTime():void {
if (_class != null) throw Error("请不要实例化此类");
return;
}
/**
* 此类是一个单例 本想是做成静态的 因为静态类无法广播事件
* @return GameTime
*/
public static function getInstance():GameTime {
if (_class == null) return _class = new GameTime();
return _class;
}
/**
* 注册计时器
*/
private function initTimer():void {
if (timer == null) {
timer = new Timer(1000);
}
if (timer.running == false ) {
timer.addEventListener(TimerEvent.TIMER, timerHandler);
timer.start()
}
}
/**
* 增加某个队列 请注意标签符的唯一性
* @param _timeItem 注册计时的标识符
* @param _timeNum 时间 单位为秒
* @param _timeTxt 显示转换后时间的文本框
*/
public function regTimer(_timeItem:String=null, _timeNum:int=0, _timeTxt:TextField=null,_fun:Function=null):void {
var len:int = timeListArr.length;
var regBoo:Boolean = false;
for (var i = 0; i < len; i++) {
if (timeListArr[i]["timeItem"] == _timeItem) {
//已注册的计时器
regBoo = true;
break;
}
}
if (regBoo==false) {
//没有注册就写入计时队列中
timeListArr.push( { timeItem:_timeItem, timeNum:_timeNum, textfiled:_timeTxt,fun:_fun } );
}
initTimer();
}
/**
* 删除某个队列
* 在队列中 删除对应注册计时标签识符
* @param _timeItem 注册计时的标识符
*/
public function removeTimer(_timeItem:String):void {
var len:int = timeListArr.length;
for (var i = 0; i < len; i++) {
//Debug.error(timeListArr[i]["timeItem"] +" - "+_timeItem);
if (timeListArr[i]["timeItem"] == _timeItem) {
var temArr:Array = timeListArr.splice(i, 1);

break;
}
}
}
/**
* 运行计时器
*/
private function runTimer():void {
var len:int = timeListArr.length;
Debug.error("计时列队 - " + len);
if (len == 0) {
stopTimer();
return;
}
for (var i = 0; i < len; i++) {
var temNum:int = int(timeListArr[i]["timeNum"]);
temNum--;
if (timeListArr[i]["textfiled"] != null) {
timeListArr[i]["textfiled"].text = ConvertTime(temNum);
timeListArr[i]["timeNum"] = temNum;
}
///
try {
if (timeListArr[i]["fun"] != null) {
var funs:Function = timeListArr[i]["fun"];
funs();
}
}catch (e:Error) {
Debug.error(e.toString());
}
//Debug.error(fun)
if (temNum == 0) {
dispatchEvent(new GameTimeEvent(TIMEOVER,timeListArr[i]["timeItem"]));
removeTimer(timeListArr[i]["timeItem"]);
if (len == 1) {
stopTimer();
}
}
}
}
/**
* 停止计时器
*/
private function stopTimer():void {
Debug.warning("停止计时")
timer.stop();
timer.removeEventListener(TimerEvent.TIMER, timerHandler);
}
/**
* TimerEvent事件侦听实现
* @param e
*/
private function timerHandler(e:TimerEvent):void {
runTimer();
}
/**
* 将秒数据格式转化为 00:00:00格式
* @param _timeNum
* @return String
*/
private function ConvertTime(_timeNum:int):String {
return (int(_timeNum / 3600).toString() + ":" + int(_timeNum % 3600 / 60).toString() + ":"+ int(_timeNum % 3600 % 60).toString() + "");
}
}
}

计时器事件类:

package myapp.utility.myevents{
import flash.events.Event;
/**
* @author silva
* 计时器管理事件类
*/
public class GameTimeEvent extends Event{
private var info:String;
public function GameTimeEvent(type:String, eventInfo:String, bubbles:Boolean = false, cancelable:Boolean = false):void{
super(type, bubbles, cancelable);
info = eventInfo;
}
/**
* 返回计时器的计时标识符
*/
public function get eventInfo():Object{
return info;
}
}
}



如:1小时=60分

1小时=3600秒

1分=60秒

1秒=1/60 分

1秒=1/3600小时

1秒=1000毫秒;

如:1小时=60分

1小时=3600秒

1分=60秒

1秒=1/60 分

1秒=1/3600小时

1秒=1000毫秒;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值