diff --git a/Gruntfile.js b/Gruntfile.js index 42d62b78..17b86ec4 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -105,7 +105,6 @@ module.exports = function (grunt) { 'src/math/Math.js', 'src/math/RandomDataGenerator.js', - 'src/math/QuadTree.js', 'src/net/Net.js', diff --git a/README.md b/README.md index e80a93e1..3ecb7eb0 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,7 @@ Significant API changes: * World preUpdate, update and postUpdate have all been moved to Stage. So all children are updated regardless where on the display list they live. * Cache.getImageKeys and similar has been removed, please use Cache.getKeys(Phaser.Cache.IMAGE) instead, this now supports all 10 Cache data types. * After defining tiles that collide on a Tilemap, you need to call Tilemap.generateCollisionData(layer) to populate the physics world with the data required. +* Phaser.QuadTree has been removed from core and moved to a plugin. It's no longer required, nor works with the physics system. New features: diff --git a/build/config.php b/build/config.php index fb00fa88..de9615d2 100644 --- a/build/config.php +++ b/build/config.php @@ -151,7 +151,6 @@ - diff --git a/examples/wip/cannon.js b/examples/wip/cannon.js index 0ed68d25..b2c5fac7 100644 --- a/examples/wip/cannon.js +++ b/examples/wip/cannon.js @@ -17,9 +17,6 @@ var angle = 0; var fireRate = 100; var nextFire = 0; var cursors; -// var PLAYER; -// var BULLET; -// var WORLD; var boxes; var playerGroup; var bulletGroup; @@ -44,31 +41,21 @@ function create() { bulletGroup = game.physics.createCollisionGroup(); boxGroup = game.physics.createCollisionGroup(); - // cannon.body.data.shapes[0].collisionGroup = PLAYER.mask; - // cannon.body.data.shapes[0].collisionMask = game.physics.WORLD.mask; - cannon.body.setCollisionGroup(playerGroup); cannon.body.collides(boxGroup); - boxes = game.add.group(); - for (var i = 0; i < 10; i++) + for (var i = 0; i < 30; i++) { var box = boxes.create(game.rnd.integerInRange(100, 700), game.rnd.integerInRange(100, 500), 'box'); box.name = 'box' + i; - box.scale.set(0.5); - // box.scale.set(game.rnd.realInRange(0.2, 0.7)); + box.scale.set(game.rnd.realInRange(0.2, 0.7)); box.physicsEnabled = true; box.body.setCollisionGroup(boxGroup); - box.body.collides(playerGroup); - box.body.collides(bulletGroup); - // box.body.mass = 10; - // box.body.setMaterial(boxMaterial); - // box.body.fixedRotation = true; + box.body.collides( [ playerGroup, bulletGroup, boxGroup ]); } - cursors = game.input.keyboard.createCursorKeys(); } @@ -87,7 +74,7 @@ function fire() { bullet.exists = true; bullet.position.set(cannon.x, cannon.y); bullet.physicsEnabled = true; - + bullet.body.collideWorldBounds = false; bullet.body.rotation = cannon.rotation + game.math.degToRad(90); var magnitude = game.math.px2p(-500); @@ -98,9 +85,6 @@ function fire() { bullet.body.setCollisionGroup(bulletGroup); bullet.body.collides(boxGroup); - - // bullet.body.data.shapes[0].collisionGroup = BULLET; - // bullet.body.data.shapes[0].collisionMask = WORLD | BULLET; } } diff --git a/src/math/QuadTree.js b/plugins/QuadTree.js similarity index 100% rename from src/math/QuadTree.js rename to plugins/QuadTree.js diff --git a/src/physics/Body.js b/src/physics/Body.js index 9e1faf87..19043272 100644 --- a/src/physics/Body.js +++ b/src/physics/Body.js @@ -90,6 +90,13 @@ Phaser.Physics.Body = function (game, sprite, x, y, mass) { Phaser.Physics.Body.prototype = { + /** + * Sets the given CollisionGroup to be the collision group for all shapes in this Body, unless a shape is specified. + * + * @method Phaser.Physics.Body#setCollisionGroup + * @param {Phaser.Physics.CollisionGroup|array} group - The Collision Group that this Bodies shapes will use. + * @param {p2.Shape} [shape] - An optional Shape. If not provided the collision group will be added to all Shapes in this Body. + */ setCollisionGroup: function (group, shape) { if (typeof shape === 'undefined') @@ -107,19 +114,70 @@ Phaser.Physics.Body.prototype = { }, /** - * Adds the given CollisionGroup to the list of groups that this body will collide with and updates the collision mask. + * Clears the collision data from the shapes in this Body. Optionally clears Group and/or Mask. + * + * @method Phaser.Physics.Body#clearCollision + * @param {boolean} [clearGroup=true] - Clear the collisionGroup value from the shape/s? + * @param {boolean} [clearMask=true] - Clear the collisionMask value from the shape/s? + * @param {p2.Shape} [shape] - An optional Shape. If not provided the collision data will be cleared from all Shapes in this Body. + */ + clearCollision: function (clearGroup, clearMask, shape) { + + if (typeof shape === 'undefined') + { + for (var i = this.data.shapes.length - 1; i >= 0; i--) + { + if (clearGroup) + { + this.data.shapes[i].collisionGroup = null; + } + + if (clearMask) + { + this.data.shapes[i].collisionMask = null; + } + } + } + else + { + if (clearGroup) + { + shapes.collisionGroup = null; + } + + if (clearMask) + { + shapes.collisionMask = null; + } + } + + }, + + /** + * Adds the given CollisionGroup, or array of CollisionGroups, to the list of groups that this body will collide with and updates the collision masks. * * @method Phaser.Physics.Body#collides - * @param {Phaser.Physics.CollisionGroup} group - The Collision Group that this Bodies shapes will collide with. + * @param {Phaser.Physics.CollisionGroup|array} group - The Collision Group or Array of Collision Groups that this Bodies shapes will collide with. * @param {p2.Shape} [shape] - An optional Shape. If not provided the collision mask will be added to all Shapes in this Body. */ collides: function (group, shape) { - // TODO: group can be an array - - if (this.collidesWith.indexOf(group) === -1) + if (Array.isArray(group)) { - this.collidesWith.push(group); + for (var i = 0; i < group.length; i++) + { + if (this.collidesWith.indexOf(group[i]) === -1) + { + this.collidesWith.push(group[i]); + } + } + } + else + { + if (this.collidesWith.indexOf(group) === -1) + { + this.collidesWith.push(group); + } } var mask = 0; @@ -146,8 +204,6 @@ Phaser.Physics.Body.prototype = { shape.collisionMask = mask; } - console.log('collides', this.sprite.name, group, mask); - }, /**