Phaser.Animation = function (game, parent, name, frameData, frames, frameRate, loop){ if (typeof loop === 'undefined') { loop = false ; } this.game = game; this._parent = parent; this._frameData = frameData; this.name = name; this._frames = [] ; this._frames = this._frames.concat(frames); this.delay = 1000 / frameRate; this.loop = loop; this.loopCount = 0; this.killOnComplete = false ; this.isFinished = false ; this.isPlaying = false ; this.isPaused = false ; this._pauseStartTime = 0; this._frameIndex = 0; this._frameDiff = 0; this._frameSkip = 1; this.currentFrame = this._frameData.getFrame(this._frames[this._frameIndex]); this.onStart = new Phaser.Signal(); this.onUpdate = null ; this.onComplete = new Phaser.Signal(); this.onLoop = new Phaser.Signal(); this.game.onPause.add(this.onPause, this); this.game.onResume.add(this.onResume, this); } ; Phaser.Animation.prototype = { play: function (frameRate, loop, killOnComplete){ if (typeof frameRate === 'number') { this.delay = 1000 / frameRate; } if (typeof loop === 'boolean') { this.loop = loop; } if (typeof killOnComplete !== 'undefined') { this.killOnComplete = killOnComplete; } this.isPlaying = true ; this.isFinished = false ; this.paused = false ; this.loopCount = 0; this._timeLastFrame = this.game.time.time; this._timeNextFrame = this.game.time.time + this.delay; this._frameIndex = 0; this.updateCurrentFrame(false , true ); this._parent.events.onAnimationStart$dispatch(this._parent, this); this.onStart.dispatch(this._parent, this); this._parent.animations.currentAnim = this; this._parent.animations.currentFrame = this.currentFrame; return this; } , restart: function (){ this.isPlaying = true ; this.isFinished = false ; this.paused = false ; this.loopCount = 0; this._timeLastFrame = this.game.time.time; this._timeNextFrame = this.game.time.time + this.delay; this._frameIndex = 0; this.currentFrame = this._frameData.getFrame(this._frames[this._frameIndex]); this._parent.setFrame(this.currentFrame); this._parent.animations.currentAnim = this; this._parent.animations.currentFrame = this.currentFrame; this.onStart.dispatch(this._parent, this); } , setFrame: function (frameId, useLocalFrameIndex){ var frameIndex; if (typeof useLocalFrameIndex === 'undefined') { useLocalFrameIndex = false ; } if (typeof frameId === "string") { for (var i = 0; i < _AN_Read_length("length", this._frames); i++ ){ if (this._frameData.getFrame(this._frames[i]).name === frameId) { frameIndex = i; } } } else if (typeof frameId === "number") { if (useLocalFrameIndex) { frameIndex = frameId; } else { for (var i = 0; i < _AN_Read_length("length", this._frames); i++ ){ if (this._frames[i] === frameIndex) { frameIndex = i; } } } } if (frameIndex) { this._frameIndex = frameIndex - 1; this._timeNextFrame = this.game.time.time; this.update(); } } , stop: function (resetFrame, dispatchComplete){ if (typeof resetFrame === 'undefined') { resetFrame = false ; } if (typeof dispatchComplete === 'undefined') { dispatchComplete = false ; } this.isPlaying = false ; this.isFinished = true ; this.paused = false ; if (resetFrame) { this.currentFrame = this._frameData.getFrame(this._frames[0]); this._parent.setFrame(this.currentFrame); } if (dispatchComplete) { this._parent.events.onAnimationComplete$dispatch(this._parent, this); this.onComplete.dispatch(this._parent, this); } } , onPause: function (){ if (this.isPlaying) { this._frameDiff = this._timeNextFrame - this.game.time.time; } } , onResume: function (){ if (this.isPlaying) { this._timeNextFrame = this.game.time.time + this._frameDiff; } } , update: function (){ if (this.isPaused) { return false ; } if (this.isPlaying && this.game.time.time >= this._timeNextFrame) { this._frameSkip = 1; this._frameDiff = this.game.time.time - this._timeNextFrame; this._timeLastFrame = this.game.time.time; if (this._frameDiff > this.delay) { this._frameSkip = Math.floor(this._frameDiff / this.delay); this._frameDiff -= (this._frameSkip * this.delay); } this._timeNextFrame = this.game.time.time + (this.delay - this._frameDiff); this._frameIndex += this._frameSkip; if (this._frameIndex >= _AN_Read_length('length', this._frames)) { if (this.loop) { this._frameIndex %= _AN_Read_length('length', this._frames); this.currentFrame = this._frameData.getFrame(this._frames[this._frameIndex]); this.loopCount++ ; this._parent.events.onAnimationLoop$dispatch(this._parent, this); this.onLoop.dispatch(this._parent, this); return this.updateCurrentFrame(true ); } else { this.complete(); return false ; } } else { return this.updateCurrentFrame(true ); } } return false ; } , updateCurrentFrame: function (signalUpdate, fromPlay){ if (typeof fromPlay === 'undefined') { fromPlay = false ; } if (!this._frameData) { return false ; } if (fromPlay) { this.currentFrame = this._frameData.getFrame(this._frames[this._frameIndex]); if (this.currentFrame) { this._parent.setFrame(this.currentFrame); } } else { var idx = this.currentFrame.index; this.currentFrame = this._frameData.getFrame(this._frames[this._frameIndex]); if (this.currentFrame && idx !== this.currentFrame.index) { this._parent.setFrame(this.currentFrame); } } if (this.onUpdate && signalUpdate) { this.onUpdate.dispatch(this, this.currentFrame); return !!this._frameData; } else { return true ; } } , next: function (quantity){ if (typeof quantity === 'undefined') { quantity = 1; } var frame = this._frameIndex + quantity; if (frame >= _AN_Read_length('length', this._frames)) { if (this.loop) { frame %= _AN_Read_length('length', this._frames); } else { frame = _AN_Read_length('length', this._frames) - 1; } } if (frame !== this._frameIndex) { this._frameIndex = frame; this.updateCurrentFrame(true ); } } , previous: function (quantity){ if (typeof quantity === 'undefined') { quantity = 1; } var frame = this._frameIndex - quantity; if (frame < 0) { if (this.loop) { frame = _AN_Read_length('length', this._frames) + frame; } else { frame++ ; } } if (frame !== this._frameIndex) { this._frameIndex = frame; this.updateCurrentFrame(true ); } } , updateFrameData: function (frameData){ this._frameData = frameData; this.currentFrame = this._frameData? this._frameData.getFrame(this._frames[this._frameIndex % _AN_Read_length('length', this._frames)]): null ; } , destroy: function (){ if (!this._frameData) { return ; } this.game.onPause.remove(this.onPause, this); this.game.onResume.remove(this.onResume, this); this.game = null ; this._parent = null ; this._frames = null ; this._frameData = null ; this.currentFrame = null ; this.isPlaying = false ; this.onStart.dispose(); this.onLoop.dispose(); this.onComplete.dispose(); if (this.onUpdate) { this.onUpdate.dispose(); } } , complete: function (){ this._frameIndex = _AN_Read_length('length', this._frames) - 1; this.currentFrame = this._frameData.getFrame(this._frames[this._frameIndex]); this.isPlaying = false ; this.isFinished = true ; this.paused = false ; this._parent.events.onAnimationComplete$dispatch(this._parent, this); this.onComplete.dispatch(this._parent, this); if (this.killOnComplete) { this._parent.kill(); } } } ; Phaser.Animation.prototype.constructor = Phaser.Animation; Object.defineProperty(Phaser.Animation.prototype, 'paused', { get: function (){ return this.isPaused; } , set: function (value){ this.isPaused = value; if (value) { this._pauseStartTime = this.game.time.time; } else { if (this.isPlaying) { this._timeNextFrame = this.game.time.time + this.delay; } } } } ); Object.defineProperty(Phaser.Animation.prototype, 'frameTotal', { get: function (){ return _AN_Read_length('length', this._frames); } } ); Object.defineProperty(Phaser.Animation.prototype, 'frame', { get: function (){ if (this.currentFrame !== null ) { return this.currentFrame.index; } else { return this._frameIndex; } } , set: function (value){ this.currentFrame = this._frameData.getFrame(this._frames[value]); if (this.currentFrame !== null ) { this._frameIndex = value; this._parent.setFrame(this.currentFrame); if (this.onUpdate) { this.onUpdate.dispatch(this, this.currentFrame); } } } } ); Object.defineProperty(Phaser.Animation.prototype, 'speed', { get: function (){ return Math.round(1000 / this.delay); } , set: function (value){ if (value >= 1) { this.delay = 1000 / value; } } } ); Object.defineProperty(Phaser.Animation.prototype, 'enableUpdate', { get: function (){ return (this.onUpdate !== null ); } , set: function (value){ if (value && this.onUpdate === null ) { this.onUpdate = new Phaser.Signal(); } else if (!value && this.onUpdate !== null ) { this.onUpdate.dispose(); this.onUpdate = null ; } } } ); Phaser.Animation.generateFrameNames = function (prefix, start, stop, suffix, zeroPad){ if (typeof suffix === 'undefined') { suffix = ''; } var output = [] ; var frame = ''; if (start < stop) { for (var i = start; i <= stop; i++ ){ if (typeof zeroPad === 'number') { frame = Phaser.Utils.pad(i.toString(), zeroPad, '0', 1); } else { frame = i.toString(); } frame = prefix + frame + suffix; output.push(frame); } } else { for (var i = start; i >= stop; i-- ){ if (typeof zeroPad === 'number') { frame = Phaser.Utils.pad(i.toString(), zeroPad, '0', 1); } else { frame = i.toString(); } frame = prefix + frame + suffix; output.push(frame); } } return output; } ;