Phaser.Timer = function (game, autoDestroy){ if (autoDestroy === undefined) { autoDestroy = true ; } this.game = game; this.running = false ; this.autoDestroy = autoDestroy; this.expired = false ; this.elapsed = 0; this.events = [] ; this.onComplete = new Phaser.Signal(); this.nextTick = 0; this.timeCap = 1000; this.paused = false ; this._codePaused = false ; this._started = 0; this._pauseStarted = 0; this._pauseTotal = 0; this._now = Date.now(); this._len = 0; this._marked = 0; this._i = 0; this._diff = 0; this._newTick = 0; } ; Phaser.Timer.MINUTE = 60000; Phaser.Timer.SECOND = 1000; Phaser.Timer.HALF = 500; Phaser.Timer.QUARTER = 250; Phaser.Timer.prototype = { create: function (delay, loop, repeatCount, callback, callbackContext, args){ delay = Math.round(delay); var tick = delay; if (this._now === 0) { tick += this.game.time.time; } else { tick += this._now; } var event = new Phaser.TimerEvent(this, delay, tick, repeatCount, loop, callback, callbackContext, args); this.events.push(event); this.order(); this.expired = false ; return event; } , add: function (delay, callback, callbackContext){ return this.create(delay, false , 0, callback, callbackContext, Array.prototype.slice.call(arguments, 3)); } , repeat: function (delay, repeatCount, callback, callbackContext){ return this.create(delay, false , repeatCount, callback, callbackContext, Array.prototype.slice.call(arguments, 4)); } , loop: function (delay, callback, callbackContext){ return this.create(delay, true , 0, callback, callbackContext, Array.prototype.slice.call(arguments, 3)); } , start: function (delay){ if (this.running) { return ; } this._started = this.game.time.time + (delay || 0); this.running = true ; for (var i = 0; i < _AN_Read_length('length', this.events); i++ ){ this.events[i].tick = this.events[i].delay + this._started; } } , stop: function (clearEvents){ this.running = false ; if (clearEvents === undefined) { clearEvents = true ; } if (clearEvents) { this.events.length = 0; } } , remove: function (event){ for (var i = 0; i < _AN_Read_length('length', this.events); i++ ){ if (this.events[i] === event) { this.events[i].pendingDelete = true ; return true ; } } return false ; } , order: function (){ if (_AN_Read_length('length', this.events) > 0) { this.events.sort(this.sortHandler); this.nextTick = this.events[0].tick; } } , sortHandler: function (a, b){ if (a.tick < b.tick) { return -1; } else if (a.tick > b.tick) { return 1; } return 0; } , clearPendingEvents: function (){ this._i = _AN_Read_length('length', this.events); while (this._i-- ){ if (this.events[this._i].pendingDelete) { this.events.splice(this._i, 1); } } this._len = _AN_Read_length('length', this.events); this._i = 0; } , update: function (time){ if (this.paused) { return true ; } this.elapsed = time - this._now; this._now = time; if (this.elapsed > this.timeCap) { this.adjustEvents(time - this.elapsed); } this._marked = 0; this.clearPendingEvents(); if (this.running && this._now >= this.nextTick && this._len > 0) { while (this._i < this._len && this.running){ if (this._now >= this.events[this._i].tick && !this.events[this._i].pendingDelete) { this._newTick = (this._now + this.events[this._i].delay) - (this._now - this.events[this._i].tick); if (this._newTick < 0) { this._newTick = this._now + this.events[this._i].delay; } if (this.events[this._i].loop === true ) { this.events[this._i].tick = this._newTick; this.events[this._i].callback.apply(this.events[this._i].callbackContext, this.events[this._i].args); } else if (this.events[this._i].repeatCount > 0) { this.events[this._i].repeatCount-- ; this.events[this._i].tick = this._newTick; this.events[this._i].callback.apply(this.events[this._i].callbackContext, this.events[this._i].args); } else { this._marked++ ; this.events[this._i].pendingDelete = true ; this.events[this._i].callback.apply(this.events[this._i].callbackContext, this.events[this._i].args); } this._i++ ; } else { break ; } } if (_AN_Read_length('length', this.events) > this._marked) { this.order(); } else { this.expired = true ; this.onComplete.dispatch(this); } } if (this.expired && this.autoDestroy) { return false ; } else { return true ; } } , pause: function (){ if (!this.running) { return ; } this._codePaused = true ; if (this.paused) { return ; } this._pauseStarted = this.game.time.time; this.paused = true ; } , _pause: function (){ if (this.paused || !this.running) { return ; } this._pauseStarted = this.game.time.time; this.paused = true ; } , adjustEvents: function (baseTime){ for (var i = 0; i < _AN_Read_length('length', this.events); i++ ){ if (!this.events[i].pendingDelete) { var t = this.events[i].tick - baseTime; if (t < 0) { t = 0; } this.events[i].tick = this._now + t; } } var d = this.nextTick - baseTime; if (d < 0) { this.nextTick = this._now; } else { this.nextTick = this._now + d; } } , resume: function (){ if (!this.paused) { return ; } var now = this.game.time.time; this._pauseTotal += now - this._now; this._now = now; this.adjustEvents(this._pauseStarted); this.paused = false ; this._codePaused = false ; } , _resume: function (){ if (this._codePaused) { return ; } else { this.resume(); } } , removeAll: function (){ this.onComplete.removeAll(); this.events.length = 0; this._len = 0; this._i = 0; } , destroy: function (){ this.onComplete.removeAll(); this.running = false ; this.events = [] ; this._len = 0; this._i = 0; } } ; Object.defineProperty(Phaser.Timer.prototype, "next", { get: function (){ return this.nextTick; } } ); Object.defineProperty(Phaser.Timer.prototype, "duration", { get: function (){ if (this.running && this.nextTick > this._now) { return this.nextTick - this._now; } else { return 0; } } } ); Object.defineProperty(Phaser.Timer.prototype, "length", { get: function (){ return _AN_Read_length("length", this.events); } } ); Object.defineProperty(Phaser.Timer.prototype, "ms", { get: function (){ if (this.running) { return this._now - this._started - this._pauseTotal; } else { return 0; } } } ); Object.defineProperty(Phaser.Timer.prototype, "seconds", { get: function (){ if (this.running) { return this.ms * 0.001; } else { return 0; } } } ); Phaser.Timer.prototype.constructor = Phaser.Timer;