From f10f9324ad00a59a21d31e6e6e511a30c01e6648 Mon Sep 17 00:00:00 2001 From: photonstorm Date: Wed, 9 Oct 2013 13:36:57 +0100 Subject: [PATCH] Animation.killOnComplete added and fixed a few issues in the Tanks game. --- README.md | 2 ++ examples/games/tanks.php | 13 +++++++------ src/animation/Animation.js | 21 +++++++++++++++++++-- src/animation/AnimationManager.js | 11 ++++++----- src/gameobjects/Sprite.js | 7 ++++--- 5 files changed, 38 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 81322dc2..93e827b0 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,8 @@ Version 1.0.7 (in progress in the dev branch) * velocityFromAngle and velocityFromRotation added with examples created. * Fixed the RandomDataGenerator.sow method so if you give in the same seed you'll now get the same results (thanks Hsaka) * World.randomX/Y now works with negative World.bounds values. +* Added killOnComplete parameter to Animation.play. Really useful in situations where you want a Sprite to animate once then kill itself on complete, like an explosion effect. + * TODO: look at Sprite.crop (http://www.html5gamedevs.com/topic/1617-error-in-spritecrop/) diff --git a/examples/games/tanks.php b/examples/games/tanks.php index 42a7e74e..8e3a4c3b 100644 --- a/examples/games/tanks.php +++ b/examples/games/tanks.php @@ -90,7 +90,7 @@ game.load.atlas('enemy', 'assets/games/tanks/enemy-tanks.png', 'assets/games/tanks/tanks.json'); game.load.image('bullet', 'assets/games/tanks/bullet.png'); game.load.image('earth', 'assets/games/tanks/scorched_earth.png'); - game.load.spritesheet('explosion', 'assets/games/tanks/explosion.png', 64, 64, 23); + game.load.spritesheet('kaboom', 'assets/games/tanks/explosion.png', 64, 64, 23); } @@ -166,8 +166,9 @@ for (var i = 0; i < 10; i++) { - var e = explosions.create(0, 0, 'explosion', 0, false); - e.animations.add('boom'); + var explosionAnimation = explosions.create(0, 0, 'kaboom', [0], false); + explosionAnimation.anchor.setTo(0.5, 0.5); + explosionAnimation.animations.add('kaboom'); } tank.bringToTop(); @@ -258,9 +259,9 @@ if (destroyed) { - var e = explosions.getFirstDead(); - e.reset(tank.x, tank.y); - e.play('boom'); + var explosionAnimation = explosions.getFirstDead(); + explosionAnimation.reset(tank.x, tank.y); + explosionAnimation.play('kaboom', 30, false, true); } } diff --git a/src/animation/Animation.js b/src/animation/Animation.js index 09f88ead..1620b38a 100644 --- a/src/animation/Animation.js +++ b/src/animation/Animation.js @@ -59,6 +59,11 @@ Phaser.Animation = function (game, parent, name, frameData, frames, delay, loope */ this.looped = looped; + /** + * @property {boolean} looped - The loop state of the Animation. + */ + this.killOnComplete = false; + /** * @property {boolean} isFinished - The finished state of the Animation. Set to true once playback completes, false during playback. * @default @@ -120,10 +125,11 @@ Phaser.Animation.prototype = { * @method Phaser.Animation#play * @memberof Phaser.Animation * @param {number} [frameRate=null] - The framerate to play the animation at. The speed is given in frames per second. If not provided the previously set frameRate of the Animation is used. - * @param {boolean} [loop=null] - Should the animation be looped after playback. If not provided the previously set loop value of the Animation is used. + * @param {boolean} [loop=false] - Should the animation be looped after playback. If not provided the previously set loop value of the Animation is used. + * @param {boolean} [killOnComplete=false] - If set to true when the animation completes (only happens if loop=false) the parent Sprite will be killed. * @return {Phaser.Animation} - A reference to this Animation instance. */ - play: function (frameRate, loop) { + play: function (frameRate, loop, killOnComplete) { if (typeof frameRate === 'number') { @@ -137,6 +143,12 @@ Phaser.Animation.prototype = { this.looped = loop; } + if (typeof killOnComplete !== 'undefined') + { + // Remove the parent sprite once the animation has finished? + this.killOnComplete = killOnComplete; + } + this.isPlaying = true; this.isFinished = false; @@ -298,6 +310,11 @@ Phaser.Animation.prototype = { this._parent.events.onAnimationComplete.dispatch(this._parent, this); } + if (this.killOnComplete) + { + this._parent.kill(); + } + } }; diff --git a/src/animation/AnimationManager.js b/src/animation/AnimationManager.js index 3cf6920c..a25f2806 100644 --- a/src/animation/AnimationManager.js +++ b/src/animation/AnimationManager.js @@ -101,7 +101,7 @@ Phaser.AnimationManager.prototype = { // If they didn't set the useNumericIndex then let's at least try and guess it if (typeof useNumericIndex === 'undefined') { - if (frames[0] && typeof frames[0] === 'number') + if (frames && frames[0] && typeof frames[0] === 'number') { useNumericIndex = true; } @@ -173,10 +173,11 @@ Phaser.AnimationManager.prototype = { * @method Phaser.AnimationManager#play * @param {string} name - The name of the animation to be played, e.g. "fire", "walk", "jump". * @param {number} [frameRate=null] - The framerate to play the animation at. The speed is given in frames per second. If not provided the previously set frameRate of the Animation is used. - * @param {boolean} [loop=null] - Should the animation be looped after playback. If not provided the previously set loop value of the Animation is used. + * @param {boolean} [loop=false] - Should the animation be looped after playback. If not provided the previously set loop value of the Animation is used. + * @param {boolean} [killOnComplete=false] - If set to true when the animation completes (only happens if loop=false) the parent Sprite will be killed. * @return {Phaser.Animation} A reference to playing Animation instance. */ - play: function (name, frameRate, loop) { + play: function (name, frameRate, loop, killOnComplete) { if (this._anims[name]) { @@ -184,13 +185,13 @@ Phaser.AnimationManager.prototype = { { if (this.currentAnim.isPlaying == false) { - return this.currentAnim.play(frameRate, loop); + return this.currentAnim.play(frameRate, loop, killOnComplete); } } else { this.currentAnim = this._anims[name]; - return this.currentAnim.play(frameRate, loop); + return this.currentAnim.play(frameRate, loop, killOnComplete); } } diff --git a/src/gameobjects/Sprite.js b/src/gameobjects/Sprite.js index 05389ccc..84564989 100644 --- a/src/gameobjects/Sprite.js +++ b/src/gameobjects/Sprite.js @@ -659,14 +659,15 @@ Phaser.Sprite.prototype.bringToTop = function() { * @method play * @param {String} name The name of the animation to be played, e.g. "fire", "walk", "jump". * @param {number} [frameRate=null] The framerate to play the animation at. The speed is given in frames per second. If not provided the previously set frameRate of the Animation is used. -* @param {Boolean} [loop=null] Should the animation be looped after playback. If not provided the previously set loop value of the Animation is used. +* @param {boolean} [loop=false] Should the animation be looped after playback. If not provided the previously set loop value of the Animation is used. +* @param {boolean} [killOnComplete=false] - If set to true when the animation completes (only happens if loop=false) the parent Sprite will be killed. * @return {Phaser.Animation} A reference to playing Animation instance. */ -Phaser.Sprite.prototype.play = function (name, frameRate, loop) { +Phaser.Sprite.prototype.play = function (name, frameRate, loop, killOnComplete) { if (this.animations) { - this.animations.play(name, frameRate, loop); + this.animations.play(name, frameRate, loop, killOnComplete); } }