diff --git a/README.md b/README.md index 58cd0e37..ba259d08 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ By Richard Davey, [Photon Storm](http://www.photonstorm.com) View the [Official Website](http://phaser.io)
Follow on [Twitter](https://twitter.com/photonstorm)
Join the [Forum](http://www.html5gamedevs.com/forum/14-phaser/)
-Try out 200+ [Phaser Examples](http://gametest.mobi/phaser/examples/)
+Try out 210+ [Phaser Examples](http://examples.phaser.io)
Read the [documentation online](http://docs.phaser.io) [Subscribe to our new Phaser Newsletter](https://confirmsubscription.com/h/r/369DE48E3E86AF1E). We'll email you when new versions are released as well as send you our regular Phaser game making magazine. @@ -188,6 +188,7 @@ Updates: * Phaser.Math.min enhanced so you can now pass in either an array of numbers or lots of numbers as parameters to get the lowest. * Phaser.Math.max added as the opposite of Math.min. * Phaser.Math.minProperty and maxProperty added. Like Math.min/max but can be given a property an an array or list of objects to inspect. +* Added 'full' paramter to Body.reset, allowing you to control if motion or all data is reset or not. Bug Fixes: diff --git a/examples/_site/view_full.html b/examples/_site/view_full.html index 410357b2..877fcd88 100644 --- a/examples/_site/view_full.html +++ b/examples/_site/view_full.html @@ -106,6 +106,7 @@ + diff --git a/examples/_site/view_lite.html b/examples/_site/view_lite.html index ee999754..0134e8ef 100644 --- a/examples/_site/view_lite.html +++ b/examples/_site/view_lite.html @@ -106,6 +106,7 @@ + diff --git a/examples/assets/tilemaps/maps/depthsort.json b/examples/assets/tilemaps/maps/depthsort.json new file mode 100644 index 00000000..b807e39d --- /dev/null +++ b/examples/assets/tilemaps/maps/depthsort.json @@ -0,0 +1,65 @@ +{ "height":19, + "layers":[ + { + "data":[1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 11, 1, 1, 9, 13, 1, 1, 1, 1, 11, 1, 1, 1, 1, 1, 1, 5, 12, 1, 1, 1, 2, 1, 3, 1, 1, 8, 1, 1, 1, 1, 1, 8, 1, 1, 1, 1, 9, 1, 13, 1, 1, 8, 1, 1, 1, 5, 1, 1, 6, 1, 1, 1, 9, 1, 4, 1, 1, 1, 3, 1, 13, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 6, 1, 1, 1, 8, 1, 1, 1, 7, 1, 4, 1, 1, 9, 1, 12, 12, 1, 6, 1, 9, 1, 1, 11, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1, 3, 1, 1, 1, 1, 1, 5, 1, 1, 1, 2, 1, 1, 1, 1, 11, 7, 1, 1, 4, 1, 1, 1, 1, 1, 13, 1, 1, 1, 3, 1, 1, 1, 1, 9, 1, 9, 1, 2, 1, 1, 2, 1, 12, 1, 9, 1, 1, 9, 1, 1, 1, 8, 1, 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 3, 1, 1, 3, 1, 1, 1, 3, 1, 7, 1, 1, 2, 1, 3, 1, 13, 2, 10, 1, 3, 1, 1, 1, 9, 1, 4, 1, 1, 1, 11, 1, 1, 1, 1, 1, 7, 1, 1, 3, 1, 1, 1, 1, 1, 1, 6, 1, 8, 1, 1, 2, 1, 12, 1, 1, 1, 11, 12, 8, 1, 1, 1, 1, 11, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 6, 1, 1, 3, 1, 1, 1, 7, 1, 1, 1, 6, 1, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 10, 1, 1, 9, 1, 2, 1, 1, 1, 1, 7, 1, 1, 1, 5, 1, 3, 1, 1, 11, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 2, 1, 1, 3, 1, 1, 8, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 8, 1, 1, 3, 1, 1, 3, 1, 8, 6, 1, 1, 1, 11, 1, 1, 1, 1, 1, 11, 1, 1, 1, 1, 3, 1, 1, 1, 1, 12, 1, 1, 9, 1, 1, 2, 5, 3, 1, 1, 2, 3, 1, 8, 4, 6, 1, 3, 1, 9, 6, 1, 4, 1, 5, 9, 1, 8, 1], + "height":19, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":25, + "x":0, + "y":0 + }, + { + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 33, 0, 0, 31, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 30, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 31, 0, 0, 0, 31, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 33, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":19, + "name":"Tile Layer 2", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":25, + "x":0, + "y":0 + }], + "orientation":"orthogonal", + "properties": + { + + }, + "tileheight":32, + "tilesets":[ + { + "firstgid":1, + "image":"ground_1x1.png", + "imageheight":32, + "imagewidth":800, + "margin":0, + "name":"ground_1x1", + "properties": + { + + }, + "spacing":0, + "tileheight":32, + "tilewidth":32 + }, + { + "firstgid":26, + "image":"walls_1x2.png", + "imageheight":64, + "imagewidth":256, + "margin":0, + "name":"walls_1x2", + "properties": + { + + }, + "spacing":0, + "tileheight":64, + "tilewidth":32 + }], + "tilewidth":32, + "version":1, + "width":25 +} \ No newline at end of file diff --git a/examples/games/breakout.js b/examples/games/breakout.js index 79ac2961..70500aa0 100644 --- a/examples/games/breakout.js +++ b/examples/games/breakout.js @@ -25,8 +25,8 @@ var s; function create() { - // We do this so the ball can still rebound with the world bounds, but it will look like it has gone off the bottom of the screen - game.world.height = 620; + // This tells the world to include walls on the left, right and top, but not the bottom - so the ball can 'fall' away. + game.physics.setBoundsToWorld(true, true, true, false); s = game.add.tileSprite(0, 0, 800, 600, 'starfield'); @@ -54,6 +54,7 @@ function create() { ball.body.collideWorldBounds = true; ball.body.bounce.setTo(1, 1); ball.animations.add('spin', [ 'ball_1.png', 'ball_2.png', 'ball_3.png', 'ball_4.png', 'ball_5.png' ], 50, true, false); + ball.events.onOutOfBounds.add(ballLost, this); scoreText = game.add.text(32, 550, 'score: 0', { font: "20px Arial", fill: "#ffffff", align: "left" }); livesText = game.add.text(680, 550, 'lives: 3', { font: "20px Arial", fill: "#ffffff", align: "left" }); @@ -90,12 +91,6 @@ function update () { game.physics.collide(ball, bricks, ballHitBrick, null, this); } - // Out? - if (ball.y > 600 && ballOnPaddle == false) - { - ballLost(); - } - } function releaseBall () { @@ -115,7 +110,7 @@ function ballLost () { lives--; - if (lives == 0) + if (lives === 0) { gameOver(); } @@ -123,9 +118,9 @@ function ballLost () { { livesText.content = 'lives: ' + lives; ballOnPaddle = true; - ball.body.velocity.setTo(0, 0); ball.x = paddle.x + 16; ball.y = paddle.y - 16; + ball.body.reset(); ball.animations.stop(); } diff --git a/examples/games/invaders.js b/examples/games/invaders.js index d065df6a..a772859c 100644 --- a/examples/games/invaders.js +++ b/examples/games/invaders.js @@ -28,7 +28,7 @@ var lives; var enemyBullet; var firingTimer = 0; var stateText; -var livingEnemies=[]; +var livingEnemies = []; function create() { @@ -106,10 +106,10 @@ function createAliens () { aliens.y = 50; // All this does is basically start the invaders moving. Notice we're moving the Group they belong to, rather than the invaders directly. - var tween = game.add.tween(aliens).to( { x: 200 }, 2000, Phaser.Easing.Linear.None, true, 0, 1000, true); + // var tween = game.add.tween(aliens).to( { x: 200 }, 2000, Phaser.Easing.Linear.None, true, 0, 1000, true); // When the tween completes it calls descend, before looping again - tween.onComplete.add(descend, this); + // tween.onComplete.add(descend, this); } function setupInvader (invader) { @@ -155,8 +155,8 @@ function update() { } // Run collision - game.physics.collide(bullets, aliens, collisionHandler, null, this); - game.physics.collide(enemyBullets, player, enemyHitsPlayer, null, this); + // game.physics.collide(bullets, aliens, collisionHandler, null, this); + // game.physics.collide(enemyBullets, player, enemyHitsPlayer, null, this); } @@ -167,8 +167,8 @@ function collisionHandler (bullet, alien) { alien.kill(); // Increase the score - score+=20; - scoreText.content=scoreString+score; + score += 20; + scoreText.content = scoreString + score; // And create an explosion :) var explosion = explosions.getFirstDead(); diff --git a/examples/groups/call all.js b/examples/groups/call all.js index ac7d1418..250d6fa0 100644 --- a/examples/groups/call all.js +++ b/examples/groups/call all.js @@ -47,6 +47,7 @@ function reviveAll() { function render() { - game.debug.renderText('Tap or click an item to kill it, and press the revive button to revive them all.', 160, 500); + game.debug.renderText('Tap or click an item to kill it', 160, 500); + game.debug.renderText('Press the Revive button to revive them all.', 160, 520); } diff --git a/examples/groups/create group.js b/examples/groups/create group.js index 81af43d2..af17185f 100644 --- a/examples/groups/create group.js +++ b/examples/groups/create group.js @@ -7,30 +7,20 @@ var game = new Phaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { preload: p } -var firstGroup; +var yourGroup; function create() { // Here we'll create a new Group - firstGroup = game.add.group(); + yourGroup = game.add.group(); - // And add some sprites to it + // And add 10 sprites to it for (var i = 0; i < 10; i++) { - // Create a new sprite at a random screen location - var newSprite = new Phaser.Sprite(game, game.stage.randomX, game.stage.randomY, 'sonic'); - - // This set-ups a listener for the event, view your console.log output to see the result - newSprite.events.onAddedToGroup.add(logGroupAdd); - - // Add the sprite to the Group - firstGroup.add(newSprite); + // Create a new sprite at a random world location + yourGroup.create(game.world.randomX, game.world.randomY, 'sonic'); } -} - -function logGroupAdd(sprite, group) { - - console.log('Sprite added to Group', group.ID, 'at z-index:', group.getIndex(sprite)); + // Each sprite is now a member of yourGroup } diff --git a/examples/groups/depth sort.js b/examples/groups/depth sort.js index fc7f319f..05b74511 100644 --- a/examples/groups/depth sort.js +++ b/examples/groups/depth sort.js @@ -3,9 +3,9 @@ var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: function preload() { game.load.image('phaser', 'assets/sprites/phaser-dude.png'); - game.load.tilemap('desert', 'assets/maps/burd.json', null, Phaser.Tilemap.TILED_JSON); - game.load.tileset('tiles', 'assets/maps/ground_1x1.png', 32, 32); - game.load.spritesheet('trees', 'assets/maps/walls_1x2.png', 32, 64); + game.load.tilemap('desert', 'assets/tilemaps/maps/depthsort.json', null, Phaser.Tilemap.TILED_JSON); + game.load.image('ground_1x1', 'assets/tilemaps/tiles/ground_1x1.png'); + game.load.spritesheet('trees', 'assets/tilemaps/tiles/walls_1x2.png', 32, 64); } @@ -22,8 +22,12 @@ function create() { // Create our tilemap to walk around map = game.add.tilemap('desert'); - tileset = game.add.tileset('tiles'); - layer = game.add.tilemapLayer(0, 0, 800, 600, tileset, map, 0); + + map.addTilesetImage('ground_1x1'); + + layer = map.createLayer('Tile Layer 1'); + + layer.resizeWorld(); // This group will hold the main player + all the tree sprites to depth sort against group = game.add.group(); @@ -51,27 +55,27 @@ function update() { if (cursors.left.isDown) { - sprite.body.velocity.x = -200; + sprite.body.velocity.x = -150; } else if (cursors.right.isDown) { - sprite.body.velocity.x = 200; + sprite.body.velocity.x = 150; } if (cursors.up.isDown) { - sprite.body.velocity.y = -200; + sprite.body.velocity.y = -150; } else if (cursors.down.isDown) { - sprite.body.velocity.y = 200; + sprite.body.velocity.y = 150; } if (sprite.y !== oldY) { // Group.sort() is an expensive operation // You really want to minimise how often it is called as much as possible. - // So this little check helps at least, but if you can do it even less than this. + // So this little check helps at least, but if you can, do it even less than this. group.sort(); oldY = sprite.y; } diff --git a/examples/groups/display order.js b/examples/groups/display order.js index f9ae1c13..dddec864 100644 --- a/examples/groups/display order.js +++ b/examples/groups/display order.js @@ -20,7 +20,8 @@ function create() { card = items.create(240, 80, 'card'); items.create(280, 100, 'atari2'); - game.input.onTap.addOnce(removeCard, this);// obviously the event can be fired only once + // This event will be fired only once + game.input.onTap.addOnce(removeCard, this); } @@ -35,9 +36,9 @@ function removeCard() { function replaceCard() { - // And bring it back to life again - I assume it will render in the same place as before? - var bob = items.getFirstDead(); + // And bring it back to life again. It will render in the same place as before? + var deadCard = items.getFirstDead(); - bob.revive(); + deadCard.revive(); } diff --git a/examples/groups/group transform - rotate.js b/examples/groups/group transform - rotate.js index e310ee5c..27053725 100644 --- a/examples/groups/group transform - rotate.js +++ b/examples/groups/group transform - rotate.js @@ -39,7 +39,7 @@ function create() { function update() { // Change parent's rotation to change all the childs. - robot.angle += 2; + robot.rotation += 0.02; } diff --git a/examples/groups/group transform.js b/examples/groups/group transform.js index 07c3cec4..5860e4c9 100644 --- a/examples/groups/group transform.js +++ b/examples/groups/group transform.js @@ -2,12 +2,6 @@ var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create, render: render }); var robot; -var eye; -var body; -var leftArm; -var rightArm; -var leftLeg; -var rightLeg; function preload() { @@ -22,44 +16,31 @@ function preload() { function create() { + game.stage.backgroundColor = '#124184'; + // Use groups of sprites to create a big robot. // Robot itself, you can subclass group class in a real game. robot = game.add.group(); // Robot components. - leftArm = robot.create(90, 175, 'arm-l'); - rightArm = robot.create(549, 175, 'arm-r'); - leftLeg = robot.create(270, 325, 'leg-l'); - rightLeg = robot.create(410, 325, 'leg-r'); - body = robot.create(219, 32, 'body'); - eye = robot.create(335, 173,'eye'); + robot.create(90, 175, 'arm-l'); + robot.create(549, 175, 'arm-r'); + robot.create(270, 325, 'leg-l'); + robot.create(410, 325, 'leg-r'); + robot.create(219, 32, 'body'); + robot.create(335, 173,'eye'); - leftArm.input.start(0, false, true); - leftArm.input.enableDrag(); - rightArm.input.start(0, false, true); - rightArm.input.enableDrag(); - leftLeg.input.start(0, false, true); - leftLeg.input.enableDrag(); - rightLeg.input.start(0, false, true); - rightLeg.input.enableDrag(); - body.input.start(0, false, true); - body.input.enableDrag(); - eye.input.start(0, false, true); - eye.input.enableDrag(); + // Make them all input enabled + robot.setAll('inputEnabled', true); + + // And allow them all to be dragged + robot.callAll('input.enableDrag', 'input'); } function render() { - game.debug.renderSpriteInfo(leftArm, 32, 30); - game.debug.renderSpriteInfo(rightArm, 32, 180); - game.debug.renderSpriteInfo(leftLeg, 32, 325); - game.debug.renderSpriteInfo(rightLeg, 32, 470); - game.debug.renderSpriteInfo(rightLeg, 450, 30); - game.debug.renderSpriteInfo(rightLeg, 450, 180); - - game.debug.renderText('The robot is a group and every component is a sprite.', 240, 580); - game.debug.renderText('Drag each part to re-position them. ', 288, 592); + game.debug.renderText('The robot is a group and every component is a sprite.', 16, 20); + game.debug.renderText('Drag parts to re-position them. ', 16, 40); } - diff --git a/src/gameobjects/Sprite.js b/src/gameobjects/Sprite.js index abbef637..e7c5b72c 100644 --- a/src/gameobjects/Sprite.js +++ b/src/gameobjects/Sprite.js @@ -939,7 +939,7 @@ Phaser.Sprite.prototype.reset = function(x, y, health) { if (this.body) { - this.body.reset(); + this.body.reset(false); } return this; diff --git a/src/physics/arcade/Body.js b/src/physics/arcade/Body.js index bae8e05f..0330bac6 100644 --- a/src/physics/arcade/Body.js +++ b/src/physics/arcade/Body.js @@ -103,7 +103,7 @@ Phaser.Physics.Arcade.Body = function (sprite) { * @property {Phaser.Point} minVelocity - When a body rebounds off another body or a wall the minVelocity is checked. If the new velocity is lower than minVelocity the body is stopped. * @default */ - this.minVelocity = new Phaser.Point(5, 5); + this.minVelocity = new Phaser.Point(); /** * @property {Phaser.Point} maxVelocity - The maximum velocity that the Body can reach. @@ -145,7 +145,7 @@ Phaser.Physics.Arcade.Body = function (sprite) { * @property {number} friction - The amount of friction this body experiences during motion. * @default */ - this.friction = 0.1; + this.friction = 0.0; /** * Set the checkCollision properties to control which directions collision is processed for this Body. @@ -1322,9 +1322,9 @@ if (this.sprite.debug) if (this.allowRotation && this.deltaZ() !== 0) { - this.sprite.angle += this.deltaZ(); + // this.sprite.angle += this.deltaZ(); } - + if (this.sprite.scale.x !== this._sx || this.sprite.scale.y !== this._sy) { this.updateScale(); @@ -1336,25 +1336,32 @@ if (this.sprite.debug) /** * Resets the Body motion values: velocity, acceleration, angularVelocity and angularAcceleration. - * Also resets the forces to defaults: gravity, bounce, minVelocity,maxVelocity, angularDrag, maxAngular, mass, friction and checkCollision. + * Also resets the forces to defaults: gravity, bounce, minVelocity,maxVelocity, angularDrag, maxAngular, mass, friction and checkCollision if 'full' specified. * * @method Phaser.Physics.Arcade#reset + * @param {boolean} [full=false] - A full reset clears down settings you may have set, such as gravity, bounce and drag. A non-full reset just clears motion values. */ - reset: function () { + reset: function (full) { + + if (typeof full === 'undefined') { full = false; } + + if (full) + { + this.gravity.setTo(0, 0); + this.bounce.setTo(0, 0); + this.minVelocity.setTo(5, 5); + this.maxVelocity.setTo(1000, 1000); + this.angularDrag = 0; + this.maxAngular = 1000; + this.mass = 1; + this.friction = 0.0; + this.checkCollision = { none: false, any: true, up: true, down: true, left: true, right: true }; + } this.velocity.setTo(0, 0); this.acceleration.setTo(0, 0); this.angularVelocity = 0; this.angularAcceleration = 0; - this.gravity.setTo(0, 0); - this.bounce.setTo(0, 0); - this.minVelocity.setTo(5, 5); - this.maxVelocity.setTo(1000, 1000); - this.angularDrag = 0; - this.maxAngular = 1000; - this.mass = 1; - this.friction = 0.1; - this.checkCollision = { none: false, any: true, up: true, down: true, left: true, right: true }; this.blocked = { x: 0, y: 0, up: false, down: false, left: false, right: false }; this.x = (this.sprite.world.x - (this.sprite.anchor.x * this.sprite.width)) + this.offset.x; this.y = (this.sprite.world.y - (this.sprite.anchor.y * this.sprite.height)) + this.offset.y;