From 86f6ddcbc8b22707fcf28289384f7b9d77f6e329 Mon Sep 17 00:00:00 2001 From: photonstorm Date: Tue, 31 Dec 2013 03:37:11 +0000 Subject: [PATCH] Two new particle examples and a group animation example. Also fixed CocoonJS sound issue and Cache sound locked bug. --- README.md | 12 ++- bower.json | 2 +- examples/_site/examples.json | 12 +++ examples/animation/group creation.js | 40 ++++++++ examples/assets/sprites/rain.png | Bin 0 -> 1432 bytes examples/assets/sprites/snowflakes.png | Bin 0 -> 2919 bytes examples/assets/sprites/snowflakes_large.png | Bin 0 -> 21519 bytes examples/groups/for each.js | 2 +- examples/particles/rain.js | 27 +++++ examples/particles/snow.js | 100 +++++++++++++++++++ examples/wip/group call all.js | 31 ++++++ examples/wip/mod.js | 3 +- src/core/Group.js | 8 +- src/loader/Cache.js | 2 +- src/sound/Sound.js | 2 +- 15 files changed, 228 insertions(+), 13 deletions(-) create mode 100644 examples/animation/group creation.js create mode 100644 examples/assets/sprites/rain.png create mode 100644 examples/assets/sprites/snowflakes.png create mode 100644 examples/assets/sprites/snowflakes_large.png create mode 100644 examples/particles/rain.js create mode 100644 examples/particles/snow.js create mode 100644 examples/wip/group call all.js diff --git a/README.md b/README.md index c75db05c..c50d708c 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ Version 1.1.4 - "Kandor" - In development Significant API changes: -* Loader.tileset has a new method signature. Please use the new format: load.tileset(key, url, tileWidth, tileHeight, tileMargin, tileSpacing, rows, columns, total). +* Loader.tileset has been removed as it's no longer required, this was as part of the Tilemap system overhaul. * TilemapLayers are now created via the Tilemap object itself: map.createLayer(x, y, width, height, tileset, layer, group) and no longer via the GameObjectFactory. * Tilemap.createFromObjects can now turn a bunch of Tiled objects into Sprites in one single call, and copies across all properties as well. * Tween.onStartCallback and onCompleteCallback have been removed to avoid confusion. You should use the onStart, onLoop and onComplete events instead. @@ -54,8 +54,8 @@ Significant API changes: New features: -* Gamepad API support has been added with lots of new examples showing how to use it (thanks Karl Macklin) -* Phaser.Game constructor can now be passed a single object containing game settings + Stage settings, useful for advanced configurations. +* Gamepad API support has been added with lots of new examples (thanks Karl Macklin) +* Phaser.Game constructor can now be passed a single object containing all of your game settings + Stage settings. Useful for advanced configurations. * The width/height given to Phaser.Game can now be percentages, i.e. "100%" will set the width to the maximum window innerWidth. * Added a stage.fullScreenScaleMode property to determine scaling when fullscreen (thanks oysterCrusher) * Added support for margin and spacing around a frame in Loader.spritesheet. @@ -83,6 +83,9 @@ New Examples: * Tweens - Example showing how to use the tween events, onStart, onLoop and onComplete. * Display - Pixi Render Texture. A Phaser conversion of the Pixi.js Render Texture example. * Input - 5 new examples showing how to use the Gamepad API (thanks Karl Macklin) +* Animation - Group Creation, showing how to create animations across all Group children in one call. +* Particles - Rain by Jens Anders Bakke. +* Particles - Snow by Jens Anders Bakke. Updates: @@ -128,7 +131,8 @@ Bug Fixes: * Canvas.addToDOM is now more robust when applying the overflowHidden style. * Fixed Pixi.StripShader which should stop the weird TileSprite GPU issues some were reporting (thanks GoodboyDigital) * Patched desyrel.xml so it doesn't contain any zero width/height characters, as they broke Firefox 25. - +* Cache.addSound now implements a locked attribute (thanks haden) +* Sound now checks for CocoonJS during playback to avoid readyState clash (thanks haden) You can view the Change Log for all previous versions at https://github.com/photonstorm/phaser/changelog.md diff --git a/bower.json b/bower.json index 74bd4116..70ab4e24 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "phaser", - "version": "1.1.3", + "version": "1.1.4", "homepage": "http://phaser.io", "authors": [ "photonstorm " diff --git a/examples/_site/examples.json b/examples/_site/examples.json index 2036beff..afbee69a 100644 --- a/examples/_site/examples.json +++ b/examples/_site/examples.json @@ -4,6 +4,10 @@ "file": "change+texture+on+click.js", "title": "change texture on click" }, + { + "file": "group+creation.js", + "title": "group creation" + }, { "file": "local+json+object.js", "title": "local json object" @@ -542,10 +546,18 @@ "file": "no+rotation.js", "title": "no rotation" }, + { + "file": "rain.js", + "title": "rain" + }, { "file": "random+sprite.js", "title": "random sprite" }, + { + "file": "snow.js", + "title": "snow" + }, { "file": "when+particles+collide.js", "title": "when particles collide" diff --git a/examples/animation/group creation.js b/examples/animation/group creation.js new file mode 100644 index 00000000..ee575536 --- /dev/null +++ b/examples/animation/group creation.js @@ -0,0 +1,40 @@ + +var game = new Phaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { preload: preload, create: create }); + +function preload() { + + game.load.atlas('seacreatures', 'assets/sprites/seacreatures_json.png', 'assets/sprites/seacreatures_json.json'); + game.load.image('undersea', 'assets/pics/undersea.jpg'); + game.load.image('coral', 'assets/pics/seabed.png'); + +} + +function create() { + + game.add.sprite(0, 0, 'undersea'); + + // Here we create our group and populate it with 6 sprites + var group = game.add.group(); + + for (var i = 0; i < 6; i++) + { + // They are evenly spaced out on the X coordinate, with a random Y coordinate + sprite = group.create(120 * i, game.rnd.integerInRange(100, 400), 'seacreatures', 'octopus0000'); + } + + // These are the frame names for the octopus animation. We use the generateFrames function to help create the array. + var frameNames = Phaser.Animation.generateFrameNames('octopus', 0, 24, '', 4); + + // Here is the important part. Group.callAll will call a method that exists on every child in the Group. + // In this case we're saying: child.animations.add('swim', frameNames, 30, true, false) + // The second parameter ('animations') is really important and is the context in which the method is called. + // For animations the context is the Phaser.AnimationManager, which is linked to the child.animations property. + // Everything after the 2nd parameter is just the usual values you'd pass to the animations.add method. + group.callAll('animations.add', 'animations', 'swim', frameNames, 30, true, false); + + // Here we just say 'play the swim animation', this time the 'play' method exists on the child itself, so we can set the context to null. + group.callAll('play', null, 'swim'); + + game.add.sprite(0, 466, 'coral'); + +} diff --git a/examples/assets/sprites/rain.png b/examples/assets/sprites/rain.png new file mode 100644 index 0000000000000000000000000000000000000000..d9a944df751d09cec2f6c8c29e4b84167cfe369b GIT binary patch literal 1432 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2co$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xRe+5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8SShQXy|I}Wa#4N zVr*>SWMpJ$U}|Iu)9aa6T#}fVoC>oy6KF3~uK`}YR?bDKi6!|(A^G_^uoMuGkzbNu zoRMFk;2dnK;G3A7nFr#7q6gwzm(-%nveXo}qWoM1aQIqfVzHmFzae^4$O$ujpkwqw zi32IIz=VJ)5X6KheIN&(c~bL$Ii?7hHHz;Y)nZ^^JmKl$7*cWTOwj2(VMl>Av+iy! z-&@GRHu(sLN5Bz9%a4K|H2*N%KiHYyRJ_iC?*x;If*4FjMQi5^? zi(TvmvJ5&mVPPc)Ne^ zjAoO4XMQ4cc8B1X$XiOW_Y?RXz9r0HPgKHqd+L9@d09H)iA`I%hsT{Y zO>d7rapr!(RiS4u{&I8Cgr6m+g08PM+_-1gOFMaK3vzz0ZwkAf`z0&a0>x`6rVZHabUZ@K&TTj~5+hD8vUduIB z%S&C!Vd+segMHKGE&oj@S?aG79B@A4cGb&ic`4iU7OAm*+_q|`W`k81u+VNvvmdKI;Vst0IRA7s{jB1 literal 0 HcmV?d00001 diff --git a/examples/assets/sprites/snowflakes.png b/examples/assets/sprites/snowflakes.png new file mode 100644 index 0000000000000000000000000000000000000000..caf98ae88cdadb8f51c8e95ca4b4b6ff60852eeb GIT binary patch literal 2919 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 HJ(2e}6d(PE literal 0 HcmV?d00001 diff --git a/examples/assets/sprites/snowflakes_large.png b/examples/assets/sprites/snowflakes_large.png new file mode 100644 index 0000000000000000000000000000000000000000..b88111287115aec0d513c6d70d7e5a9909e4089b GIT binary patch literal 21519 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 P00000NkvXXu0mjfS1jet literal 0 HcmV?d00001 diff --git a/examples/groups/for each.js b/examples/groups/for each.js index 705422d3..0e6e177b 100644 --- a/examples/groups/for each.js +++ b/examples/groups/for each.js @@ -1,7 +1,7 @@ var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create, update: update, render: render }); -var baseAlphaIncSpeed= 0.006; +var baseAlphaIncSpeed = 0.006; function preload() { game.load.spritesheet('item', 'assets/buttons/number-buttons-90x90.png', 90, 90); diff --git a/examples/particles/rain.js b/examples/particles/rain.js new file mode 100644 index 00000000..06aa3dae --- /dev/null +++ b/examples/particles/rain.js @@ -0,0 +1,27 @@ +// This example was created by Jens Anders Bakke + +var game = new Phaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { preload: preload, create: create }); + +function preload() { + + game.load.spritesheet('rain', 'assets/sprites/rain.png', 17, 17); + +} + +function create() { + + var emitter = game.add.emitter(game.world.centerX, 0, 400); + emitter.width = game.world.width; + // emitter.angle = 30; // uncomment to set an angle for the rain. + + emitter.makeParticles('rain'); + emitter.maxParticleScale = 0.5; + emitter.minParticleScale = 0.1; + emitter.setYSpeed(300, 500); + emitter.setXSpeed(-5, 5); + emitter.minRotation = 0; + emitter.maxRotation = 0; + + emitter.start(false, 1600, 5, 0); + +} diff --git a/examples/particles/snow.js b/examples/particles/snow.js new file mode 100644 index 00000000..5dafe04a --- /dev/null +++ b/examples/particles/snow.js @@ -0,0 +1,100 @@ +// This example was created by Jens Anders Bakke + +var game = new Phaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { preload: preload, create: create }); + +function preload() { + + game.load.spritesheet('snowflakes', 'assets/sprites/snowflakes.png', 17, 17); + game.load.spritesheet('snowflakes_large', 'assets/sprites/snowflakes_large.png', 64, 64); + +} + +var max = 0; +var front_emitter; +var mid_emitter; +var back_emitter; +var update_interval = 4 * 60; +var i = 0; + +function create() { + + back_emitter = game.add.emitter(game.world.centerX, -32, 600); + back_emitter.makeParticles('snowflakes', [0, 1, 2, 3, 4, 5]); + back_emitter.maxParticleScale = 0.6; + back_emitter.minParticleScale = 0.2; + back_emitter.setYSpeed(20, 100); + back_emitter.gravity = 0; + back_emitter.width = game.world.width * 1.5; + back_emitter.minRotation = 0; + back_emitter.maxRotation = 40; + + + mid_emitter = game.add.emitter(game.world.centerX, -32, 250); + mid_emitter.makeParticles('snowflakes', [0, 1, 2, 3, 4, 5]); + mid_emitter.maxParticleScale = 1.2; + mid_emitter.minParticleScale = 0.8; + mid_emitter.setYSpeed(50, 150); + mid_emitter.gravity = 0; + mid_emitter.width = game.world.width * 1.5; + mid_emitter.minRotation = 0; + mid_emitter.maxRotation = 40; + + + front_emitter = game.add.emitter(game.world.centerX, -32, 50); + front_emitter.makeParticles('snowflakes_large', [0, 1, 2, 3, 4, 5]); + front_emitter.maxParticleScale = 1; + front_emitter.minParticleScale = 0.5; + front_emitter.setYSpeed(100, 200); + front_emitter.gravity = 0; + front_emitter.width = game.world.width * 1.5; + front_emitter.minRotation = 0; + front_emitter.maxRotation = 40; + + changeWindDirection(); + + back_emitter.start(false, 14000, 20); + mid_emitter.start(false, 12000, 40); + front_emitter.start(false, 6000, 1000); + +} + +function update() { + + i++; + + if (i === update_interval) + { + changeWindDirection(); + update_interval = Math.floor(Math.random() * 20) * 60; // 0 - 20sec @ 60fps + i = 0; + } + +} + +function changeWindDirection() { + + var multi = Math.floor((max + 200) / 4), + frag = (Math.floor(Math.random() * 100) - multi); + max = max + frag; + + if (max > 200) max = 150; + if (max < -200) max = -150; + + setXSpeed(back_emitter, max); + setXSpeed(mid_emitter, max); + setXSpeed(front_emitter, max); + +} + +function setXSpeed(emitter, max) { + + emitter.setXSpeed(max - 20, max); + emitter.forEachAlive(setParticleXSpeed, this, max); + +} + +function setParticleXSpeed(particle, max) { + + particle.body.velocity.x = max - Math.floor(Math.random() * 30); + +} diff --git a/examples/wip/group call all.js b/examples/wip/group call all.js new file mode 100644 index 00000000..f06b22ef --- /dev/null +++ b/examples/wip/group call all.js @@ -0,0 +1,31 @@ + +var game = new Phaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { preload: preload, create: create }); + +function preload() { + + game.load.atlas('seacreatures', 'assets/sprites/seacreatures_json.png', 'assets/sprites/seacreatures_json.json'); + game.load.image('undersea', 'assets/pics/undersea.jpg'); + game.load.image('coral', 'assets/pics/seabed.png'); + +} + +function create() { + + game.add.sprite(0, 0, 'undersea'); + + var group = game.add.group(); + + for (var i = 0; i < 6; i++) + { + sprite = group.create(120 * i, game.rnd.integerInRange(100, 400), 'seacreatures', 'octopus0000'); + } + + var frameNames = Phaser.Animation.generateFrameNames('octopus', 0, 24, '', 4); + + group.callAll('animations.add', 'animations', 'swim', frameNames, 30, true, false); + + group.callAll('play', null, 'swim'); + + game.add.sprite(0, 466, 'coral'); + +} diff --git a/examples/wip/mod.js b/examples/wip/mod.js index d244e0e6..0fc25ae0 100644 --- a/examples/wip/mod.js +++ b/examples/wip/mod.js @@ -56,7 +56,8 @@ function create() { // vu4 = game.add.sprite(400, 250, 'vu3'); module = new Protracker(); - module.buffer = game.cache.getBinary('globaltrash'); +// module.buffer = game.cache.getBinary('globaltrash'); + module.buffer = game.cache.getBinary('macrocosm'); module.parse(); module.play(); diff --git a/src/core/Group.js b/src/core/Group.js index 8763afff..51b12c90 100644 --- a/src/core/Group.js +++ b/src/core/Group.js @@ -223,7 +223,7 @@ Phaser.Group.prototype = { */ create: function (x, y, key, frame, exists) { - if (typeof exists == 'undefined') { exists = true; } + if (typeof exists === 'undefined') { exists = true; } var child = new Phaser.Sprite(this.game, x, y, key, frame); @@ -263,7 +263,7 @@ Phaser.Group.prototype = { */ createMultiple: function (quantity, key, frame, exists) { - if (typeof exists == 'undefined') { exists = false; } + if (typeof exists === 'undefined') { exists = false; } for (var i = 0; i < quantity; i++) { @@ -805,7 +805,7 @@ Phaser.Group.prototype = { }, /** - * Calls a function on all of the children that have exists=true in this Group. + * Returns a reference to a function that exists on a child of the Group based on the given callback array. * * @method Phaser.Group#callbackFromArray * @param {object} child - The object to inspect. @@ -863,7 +863,7 @@ Phaser.Group.prototype = { * * @method Phaser.Group#callAll * @param {string} method - A string containing the name of the function that will be called. The function must exist on the child. - * @param {string} [context=''] - A string containing the context under which the method will be executed. Leave to '' to default to the child. + * @param {string} [context=null] - A string containing the context under which the method will be executed. Set to null to default to the child. * @param {...*} parameter - Additional parameters that will be passed to the method. */ callAll: function (method, context) { diff --git a/src/loader/Cache.js b/src/loader/Cache.js index 60553472..ad5a51bc 100644 --- a/src/loader/Cache.js +++ b/src/loader/Cache.js @@ -320,7 +320,7 @@ Phaser.Cache.prototype = { decoded = true; } - this._sounds[key] = { url: url, data: data, isDecoding: false, decoded: decoded, webAudio: webAudio, audioTag: audioTag }; + this._sounds[key] = { url: url, data: data, isDecoding: false, decoded: decoded, webAudio: webAudio, audioTag: audioTag, locked: this.game.sound.touchLocked }; }, diff --git a/src/sound/Sound.js b/src/sound/Sound.js index f3c79d74..9e8d7389 100644 --- a/src/sound/Sound.js +++ b/src/sound/Sound.js @@ -552,7 +552,7 @@ Phaser.Sound.prototype = { else { // console.log('sound not locked, state?', this._sound.readyState); - if (this._sound && this._sound.readyState == 4) + if (this._sound && (this.game.device.cocoonJS || this._sound.readyState === 4)) { this._sound.play(); // This doesn't become available until you call play(), wonderful ...