File: src\hud\components\Time.ts
/**
*
* @module HUD
* @submodule HUDComponents
*
*/
module Kiwi.HUD.HUDComponents {
/**
* A Component to manage and display a Time in a particular format.
* The Time Component creates a new clock on the Time Manager and it uses that clock to keep track of the time.
* When you create a new Time Component you can specify a format that you want the time to display in, which is a string based on keywords.
* Current supported keywords for the format are:
* 's' = 'seconds'
* 'm' = 'minutes'
* 'ms' = milliseconds'
* 'ss' = 'seconds with leading zero'
* 'mm' = 'minutes with leading zero'
*
* @class Time
* @extends Kiwi.Component
* @namespace Kiwi.HUD.HUDComponents
* @constructor
* @param owner {any} The object that this component belongs to.
* @param [format=''] {string} The format that the time is to be displayed in. Leave blank for the default time.
* @return {Kiwi.HUD.HUDComponents.Counter}
*/
export class Time extends Kiwi.Component {
constructor(owner:any, format:string='') {
super(owner, "time");
this.clock = this.game.time.addClock(name + '-clock', 1000);
this.format = format;
}
/**
* The type of object that this is.
* @method objType
* @return {String} 'TimeComponent'
* @public
*/
public objType(): string {
return 'TimeComponent';
}
/**
* The clock that this component creates and uses to manage the current time.
* @property clock
* @type Kiwi.Time.Clock
* @private
*/
public clock: Kiwi.Time.Clock;
/**
* Indicates whether or not the clock is currently running or not, and thus whether or not the time is playing or not.
* @property isRunning
* @type boolean
* @public
*/
public get isRunning():boolean {
return this.clock.isRunning();
}
/**
* Pauses the clock where is stands. Calls the pause method on the clock.
* @method pause
* @public
*/
public pause() {
this.clock.pause();
}
/**
* Stops the clock and thus the time. Calls the stop method of the clock.
* @method stop
* @public
*/
public stop() {
this.clock.stop();
}
/**
* Starts the clock and thus the time.
* @method start
* @public
*/
public start() {
this.clock.start();
this._timeBefore = this.clock.elapsed();
}
/**
* Resumes the clock and thus the time.
* @method resume
* @public
*/
public resume() {
this.clock.resume();
}
/**
* The format that they want the time to be displayed.
* @property _format
* @type string
* @private
*/
private _format: string;
/**
* The format that you want the time to be displayed in.
* @property format
* @type string
* @public
*/
public set format(val: string) {
this._format = val;
}
public get format(): string {
return this._format;
}
/**
* If the clock should 'count down' instead of up.
* @property countDown
* @type boolean
* @default false
* @public
*/
public countDown: boolean = false;
/**
* Used during the formatting stage of displaying the time.
* @property _displayString
* @type string
* @private
*/
private _displayString: string = '';
/**
* The current time in seconds.
* @property _currentTime
* @type number
* @private
*/
private _currentTime: number = 0;
/**
* The current time in seconds. This is READ ONLY.
* @property currentTime
* @type number
* @public
*/
public get currentTime(): number {
return this._currentTime;
}
/**
* The last time that the timer update. Used to calculate the time delta.
* @property _timeBefore
* @type number
* @private
*/
private _timeBefore: number = 0;
/**
* Sets the current time of the timer.
* @method setTime
* @param milli {number} The number of milliseconds.
* @param [sec=0] {number} The number of seconds to add.
* @param [minutes=0] {number} The number of minutes to add.
* @public
*/
public setTime(milli: number, sec: number= 0, minutes: number= 0) {
this._currentTime = milli;
if(sec != 0) this._currentTime += (sec * 1000);
if(minutes != 0) this._currentTime += (minutes * 60 * 1000);
}
/**
* Increases the current time by the amount passed.
* @method addTime
* @param milli {number} The number of milliseconds.
* @param [sec=0] {number} The number of seconds to add.
* @param [minutes=0] {number} The number of minutes to add.
* @public
*/
public addTime(milli:number, sec:number= 0,minutes:number= 0) {
this._currentTime += milli;
if(sec != 0) this._currentTime += (sec * 1000);
if (minutes != 0) this._currentTime += (minutes * 60 * 1000);
}
/**
* Decreases the current time by the amount passed.
* @method removeTime
* @param milli {number} The number of milliseconds.
* @param [sec=0] {number} The number of seconds to add.
* @param [minutes=0] {number} The number of minutes to add.
* @public
*/
public removeTime(milli: number, sec: number= 0, minutes: number= 0) {
this._currentTime -= milli;
if (sec != 0) this._currentTime -= (sec * 1000);
if (minutes != 0) this._currentTime -= (minutes * 60 * 1000);
}
/**
* The speed at which the time will increase/decrease by.
* Modify this property to make the time count down slower/faster.
* @property _speed
* @type number
* @default 1
* @private
*/
public speed: number = 1;
/**
* Returns a string with the current time that this component is upto in the format that was passed.
*
* @method updateTime
* @return string
* @public
*/
public getTime():string {
if (this.countDown) {
this._currentTime -= (this.clock.elapsed() - this._timeBefore) * this.speed;
} else {
this._currentTime += (this.clock.elapsed() - this._timeBefore) * this.speed;
}
this._timeBefore = this.clock.elapsed();
//format time
if (this._format !== '') {
this._displayString = this._format;
//milliseconds
if (this._displayString.indexOf('ms') !== -1) {
var t = String(Math.floor(this._currentTime * 1000) % 1000);
this._displayString = this._displayString.replace('ms', t);
}
//seconds - leading
if (this._displayString.indexOf('ss') != -1) {
var t = String(Math.floor(this._currentTime) % 60);
if (t.length < 2) t = '0' + t;
this._displayString = this._displayString.replace('ss', t);
}
//minutes - leading
if (this._displayString.indexOf('mm') !== -1) {
var t = String(Math.floor(this._currentTime / 60) % 60);
if (t.length < 2) t = '0' + t;
this._displayString = this._displayString.replace('mm', t);
}
//minutes - no leading
if (this._displayString.indexOf('s') != -1) {
var t = String(Math.floor(this._currentTime) % 60);
this._displayString = this._displayString.replace('s', t);
}
//seconds - no leading
if (this._displayString.indexOf('m') !== -1) {
var t = String(Math.floor(this._currentTime / 60) % 60);
this._displayString = this._displayString.replace('m', t);
}
return this._displayString;
} else {
return String(this._currentTime.toFixed(2));
}
}
}
}