Phaser.Timer = function (game, autoDestroy){ if (typeof autoDestroy === 'undefined') { autoDestroy = true ; } this.game = game; this.running = false ; this.autoDestroy = autoDestroy; this.expired = false ; this.events = [] ; this.onComplete = new Phaser.Signal(); this.nextTick = 0; this.paused = false ; this._codePaused = false ; this._started = 0; this._pauseStarted = 0; this._now = 0; this._len = 0; this._i = 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){ var tick = delay; if (this.running) { if (this._now === 0) { tick += this.game.time.now; } 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.splice.call(arguments, 3)); } , repeat: function (delay, repeatCount, callback, callbackContext){ return this.create(delay, false , repeatCount, callback, callbackContext, Array.prototype.splice.call(arguments, 4)); } , loop: function (delay, callback, callbackContext){ return this.create(delay, true , 0, callback, callbackContext, Array.prototype.splice.call(arguments, 3)); } , start: function (){ this._started = this.game.time.now; this.running = true ; } , stop: function (clearEvents){ this.running = false ; if (typeof 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; } , update: function (time){ if (this.paused) { return true ; } this._now = time; this._len = _AN_Read_length('length', this.events); this._i = 0; while (this._i < this._len){ if (this.events[this._i].pendingDelete) { this.events.splice(this._i, 1); this._len-- ; } this._i++ ; } this._len = _AN_Read_length('length', this.events); if (this.running && this._now >= this.nextTick && this._len > 0) { this._i = 0; while (this._i < this._len && this.running){ if (this._now >= this.events[this._i].tick) { var diff = this._now - this.events[this._i].tick; var newTick = (this._now + this.events[this._i].delay) - diff; if (newTick < 0) { newTick = this._now + this.events[this._i].delay; } if (this.events[this._i].loop === true ) { this.events[this._i].tick = 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 = newTick; this.events[this._i].callback.apply(this.events[this._i].callbackContext, this.events[this._i].args); } else { this.events[this._i].callback.apply(this.events[this._i].callbackContext, this.events[this._i].args); this.events.splice(this._i, 1); this._len-- ; } this._i++ ; } else { break ; } } if (_AN_Read_length('length', this.events) > 0) { 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 && !this.expired) { this._pauseStarted = this.game.time.now; this.paused = true ; this._codePaused = true ; } } , _pause: function (){ if (this.running && !this.expired) { this._pauseStarted = this.game.time.now; this.paused = true ; } } , resume: function (){ if (this.running && !this.expired) { var pauseDuration = this.game.time.now - this._pauseStarted; for (var i = 0; i < _AN_Read_length('length', this.events); i++ ){ this.events[i].tick += pauseDuration; } this.nextTick += pauseDuration; this.paused = false ; this._codePaused = false ; } } , _resume: function (){ if (this._codePaused) { return ; } else { this.resume(); } } , destroy: function (){ this.onComplete.removeAll(); this.running = false ; this.events = [] ; this._i = this._len; } } ; 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 (){ return this._now - this._started; } } ); Object.defineProperty(Phaser.Timer.prototype, "seconds", { get: function (){ return this.ms * 0.001; } } ); Phaser.Timer.prototype.constructor = Phaser.Timer;