Two new particle examples and a group animation example. Also fixed CocoonJS sound issue and Cache sound locked bug.

This commit is contained in:
photonstorm
2013-12-31 03:37:11 +00:00
parent 3b87ce9fc9
commit 86f6ddcbc8
15 changed files with 228 additions and 13 deletions
+8 -4
View File
@@ -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
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "phaser",
"version": "1.1.3",
"version": "1.1.4",
"homepage": "http://phaser.io",
"authors": [
"photonstorm <rich@photonstorm.com>"
+12
View File
@@ -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"
+40
View File
@@ -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');
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

+1 -1
View File
@@ -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);
+27
View File
@@ -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);
}
+100
View File
@@ -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);
}
+31
View File
@@ -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');
}
+2 -1
View File
@@ -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();
+4 -4
View File
@@ -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) {
+1 -1
View File
@@ -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 };
},
+1 -1
View File
@@ -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 ...