diff --git a/README.md b/README.md index 32808ed09..0da1b606d 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,8 @@ Significant API changes: * Body.maxVelocity defaults have been removed from 10,000 to 2000. * Body.friction is new and has a default value of 0.1 - you may need to set this to zero depending on the type of game you're making. * Body.customSeparateCallback allows you to set your own callback when two Bodies need to separate rather than using the built-in method. +* Body.collideCallback allows you to set a callback that is fired whenever the Body is hit on any of its active faces. +* Body.allowCollision has been renamed to Body.checkCollision. New features: diff --git a/examples/wip/index.php b/examples/wip/index.php index 58a4a658a..a8cac4ac9 100644 --- a/examples/wip/index.php +++ b/examples/wip/index.php @@ -77,6 +77,7 @@ phaser + 0 && body.allowCollision.right && tile.tile.faceLeft) + else if (body.deltaX() > 0 && body.checkCollision.right && tile.tile.faceLeft) { // RIGHT localOverlapX = body.right - tile.x; @@ -700,7 +701,7 @@ Phaser.Physics.Arcade.prototype = { } } - if (body.deltaY() < 0 && body.allowCollision.up && tile.tile.faceBottom) + if (body.deltaY() < 0 && body.checkCollision.up && tile.tile.faceBottom) { // UP localOverlapY = body.y - tile.bottom; @@ -713,7 +714,7 @@ Phaser.Physics.Arcade.prototype = { body.touching.none = false; } } - else if (body.deltaY() > 0 && body.allowCollision.down && tile.tile.faceTop) + else if (body.deltaY() > 0 && body.checkCollision.down && tile.tile.faceTop) { // DOWN localOverlapY = body.bottom - tile.y; @@ -778,7 +779,7 @@ Phaser.Physics.Arcade.prototype = { body.overlapY = 0; // Remember - this happens AFTER the body has been moved by the motion update, so it needs moving back again - if (body.deltaX() < 0 && body.allowCollision.left && tile.tile.faceRight) + if (body.deltaX() < 0 && body.checkCollision.left && tile.tile.faceRight) { // LEFT body.overlapX = body.x - tile.right; @@ -791,7 +792,7 @@ Phaser.Physics.Arcade.prototype = { body.touching.none = false; } } - else if (body.deltaX() > 0 && body.allowCollision.right && tile.tile.faceLeft) + else if (body.deltaX() > 0 && body.checkCollision.right && tile.tile.faceLeft) { // RIGHT body.overlapX = body.right - tile.x; @@ -805,7 +806,7 @@ Phaser.Physics.Arcade.prototype = { } } - if (body.deltaY() < 0 && body.allowCollision.up && tile.tile.faceBottom) + if (body.deltaY() < 0 && body.checkCollision.up && tile.tile.faceBottom) { // UP body.overlapY = body.y - tile.bottom; @@ -818,7 +819,7 @@ Phaser.Physics.Arcade.prototype = { body.touching.none = false; } } - else if (body.deltaY() > 0 && body.allowCollision.down && tile.tile.faceTop) + else if (body.deltaY() > 0 && body.checkCollision.down && tile.tile.faceTop) { // DOWN body.overlapY = body.bottom - tile.y; diff --git a/src/physics/arcade/Body.js b/src/physics/arcade/Body.js index 2ff13017a..93d972dd6 100644 --- a/src/physics/arcade/Body.js +++ b/src/physics/arcade/Body.js @@ -192,11 +192,11 @@ Phaser.Physics.Arcade.Body = function (sprite) { this.mass = 1; /** - * Set the allowCollision properties to control which directions collision is processed for this Body. - * For example allowCollision.up = false means it won't collide when the collision happened while moving up. - * @property {object} allowCollision - An object containing allowed collision. + * Set the checkCollision properties to control which directions collision is processed for this Body. + * For example checkCollision.up = false means it won't collide when the collision happened while moving up. + * @property {object} checkCollision - An object containing allowed collision. */ - this.allowCollision = { none: false, any: true, up: true, down: true, left: true, right: true }; + this.checkCollision = { none: false, any: true, up: true, down: true, left: true, right: true }; /** * This object is populated with boolean values when the Body collides with another. @@ -343,6 +343,12 @@ Phaser.Physics.Arcade.Body = function (sprite) { */ this._average = 0; + this.polygons = new SAT.Box(new SAT.Vector(this.x, this.y), this.width, this.height).toPolygon(); + this.response = new SAT.Response(); + + // this.vx; + // this.vy; + this._debug = 0; }; @@ -363,6 +369,10 @@ Phaser.Physics.Arcade.Body.prototype = { this.height = this.sourceHeight * scaleY; this.halfWidth = Math.floor(this.width / 2); this.halfHeight = Math.floor(this.height / 2); + + // Scale by the difference between this and what it was previously + this.polygons.scale(scaleX / this._sx, scaleY / this._sy); + this._sx = scaleX; this._sy = scaleY; this.center.setTo(this.x + this.halfWidth, this.y + this.halfHeight); @@ -390,11 +400,11 @@ Phaser.Physics.Arcade.Body.prototype = { this.blocked.left = false; this.blocked.right = false; - this.touching.none = true; - this.touching.up = false; - this.touching.down = false; - this.touching.left = false; - this.touching.right = false; + // this.touching.none = true; + // this.touching.up = false; + // this.touching.down = false; + // this.touching.left = false; + // this.touching.right = false; this.x = this.preX; this.y = this.preY; @@ -411,10 +421,13 @@ Phaser.Physics.Arcade.Body.prototype = { } this.game.physics.updateMotion(this); - + this.applyMotion(); } + this.polygons.pos.x = this.x; + this.polygons.pos.y = this.y; + }, /** @@ -455,6 +468,89 @@ Phaser.Physics.Arcade.Body.prototype = { }, + /** + * Internal method used to check the Body against the World Bounds. + * + * @method Phaser.Physics.Arcade#checkWorldBounds + * @protected + */ + NEWcheckWorldBounds: function () { + + this.blockedPoint.setTo(0, 0); + + if (this.x < this.game.world.bounds.x) + { + this.blockedPoint.x = this.game.world.bounds.x - this.x; + this.blocked.left = true; + this.touching.left = true; + } + else if (this.right > this.game.world.bounds.right) + { + this.blockedPoint.x = this.right - this.game.world.bounds.right; + this.blocked.right = true; + this.touching.right = true; + } + + if (this.y < this.game.world.bounds.y) + { + this.blockedPoint.y = this.game.world.bounds.y - this.y; + this.blocked.up = true; + this.touching.up = true; + } + else if (this.bottom > this.game.world.bounds.bottom) + { + this.blockedPoint.y = this.bottom - this.game.world.bounds.bottom; + this.blocked.down = true; + this.touching.down = true; + } + + // overlapX/Y values at this point will be penetration into the bounds and DELTA WILL BE ZERO + if (this.blocked.left && this.blockedPoint.x > 0) + { + // Separate + this.x += this.blockedPoint.x; + this.velocity.x *= -this.bounce.x; + // this.reboundCheck(true, false); + } + else if (this.blocked.right && this.blockedPoint.x > 0) + { + // Separate + this.x -= this.blockedPoint.x; + this.velocity.x *= -this.bounce.x; + // this.reboundCheck(true, false); + } + else + { + this.x += this.game.time.physicsElapsed * (this.velocity.x + this.motionVelocity.x / 2); + this.velocity.x += this.motionVelocity.x; + } + + // overlapX/Y values at this point will be penetration into the bounds and DELTA WILL BE ZERO + if (this.blocked.up && this.blockedPoint.y > 0) + { + // Separate + this.y += this.blockedPoint.y; + this.velocity.y *= -this.bounce.y; + // this.reboundCheck(false, true); + } + else if (this.blocked.down && this.blockedPoint.y > 0) + { + // Separate + this.y -= this.blockedPoint.y; + this.velocity.y *= -this.bounce.y; + // this.reboundCheck(false, true); + } + else + { + this.y += this.game.time.physicsElapsed * (this.velocity.y + this.motionVelocity.y / 2); + this.velocity.y += this.motionVelocity.y; + } + + this.polygons.pos.x = this.x; + this.polygons.pos.y = this.y; + + }, + /** * Internal method. * @@ -590,10 +686,13 @@ Phaser.Physics.Arcade.Body.prototype = { this.velocity.y = -this.maxVelocity.y; } + this.polygons.pos.x = this.x; + this.polygons.pos.y = this.y; + }, /** - * Checks for an overlap between this Body and the given Body, taking into account the allowCollision flags on both bodies. + * Checks for an overlap between this Body and the given Body, taking into account the checkCollision flags on both bodies. * If an overlap occurs the Body.touching flags are set and the results are stored in overlapX and overlapY. * * @method Phaser.Physics.Arcade#overlap @@ -602,36 +701,138 @@ Phaser.Physics.Arcade.Body.prototype = { */ overlap: function (body) { + // var r = new Phaser.Rectangle(); + + // This gives us our area of intersection (width / height) + // Phaser.Rectangle.intersection(this, body, r); + +/* this.overlapX = 0; this.overlapY = 0; - if (this.x < body.x && this.allowCollision.right && body.allowCollision.left) + if (this.x < body.x && this.checkCollision.right && body.checkCollision.left) { // Negative = body touched this one on the right face + console.log('Negative = body touched this one on the right face'); this.overlapX = body.x - this.right; this.touching.right = true; } - else if (this.x > body.x && this.allowCollision.left && body.allowCollision.right) + else if (this.x > body.x && this.checkCollision.left && body.checkCollision.right) { // Positive means body touched this one on the left face + console.log('Positive means body touched this one on the left face'); this.overlapX = body.right - this.x; this.touching.left = true; } - if (this.y < body.y && this.allowCollision.down && body.allowCollision.up) + if (this.y < body.y && this.checkCollision.down && body.checkCollision.up) { // Negative = body touched this one on the bottom face this.overlapY = body.y - this.bottom; this.touching.down = true; } - else if (this.y > body.y && this.allowCollision.up && body.allowCollision.down) + else if (this.y > body.y && this.checkCollision.up && body.checkCollision.down) { // Positive means body touched this one on the top face this.overlapY = body.bottom - this.y; this.touching.up = true; } +*/ + +/* + var ax = this.deltaX(); + var bx = body.deltaX(); + var check = Phaser.NONE; + + // if (ax <= 0 && bx < 0) + // { + // check = Phaser.RIGHT; + // } + + if (ax <= 0 && bx < 0) + { + // This is stationary (or moving left) and Body is moving left + if (this.x <= body.x) + { + // Body entering right side of This + if (this.checkCollision.right) + { + this.overlapX = -r.width; + this.touching.right = true; + } + + if (body.checkCollision.left) + { + body.touching.left = true; + } + } + } + else if (ax <= 0 && bx > 0) + { + // This is stationary (or moving left) and Body is moving right + if (this.x >= body.x) + { + // Body entering left side of This + if (this.checkCollision.left) + { + this.overlapX = r.width; + this.touching.left = true; + } + + if (body.checkCollision.right) + { + body.touching.right = true; + } + } + } + else if (ax > 0 && bx < 0) + { + // This is moving right and Body is moving left + if (this.x <= body.x) + { + // Body entering right side of This + if (this.checkCollision.right) + { + this.overlapX = -r.width; + this.touching.right = true; + } + + if (body.checkCollision.left) + { + body.touching.left = true; + } + } + } + else if (ax > 0 && bx > 0) + { + // This is moving right and Body is moving right + if (this.x >= body.x) + { + // Body entering left side of This + if (this.checkCollision.left) + { + this.overlapX = r.width; + this.touching.left = true; + } + + if (body.checkCollision.right) + { + body.touching.right = true; + } + } + } +*/ + + this.response.clear(); + + return SAT.testPolygonPolygon(this.polygons, body.polygons, this.response); + + + // console.log(this.overlapX, r.width); + // console.log(r); // Which is the largest? + /* if (this.overlapX !== 0 && this.overlapY !== 0) { // Crudely find out which is the largest penetration side @@ -653,10 +854,18 @@ Phaser.Physics.Arcade.Body.prototype = { // overlapX/Y now contains either zero or a positive value containing the overlapping area return (this.overlapX !== 0 || this.overlapY !== 0); + */ }, - // Check if we're below minVelocity and gravity isn't trying to drag us in the opposite direction + /** + * Check if we're below minVelocity and gravity isn't trying to drag us in the opposite direction. + * + * @method Phaser.Physics.Arcade#reboundCheck + * @protected + * @param {boolean} x - Check the X axis? + * @param {boolean} y - Check the Y axis? + */ reboundCheck: function (x, y) { if (x) @@ -681,6 +890,13 @@ Phaser.Physics.Arcade.Body.prototype = { }, + /** + * Gets the total gravity to be applied on the X axis. + * + * @method Phaser.Physics.Arcade#getTotalGravityX + * @protected + * @return {number} The total gravity to be applied on the X axis. + */ getTotalGravityX: function () { if (this.allowGravity) @@ -694,6 +910,13 @@ Phaser.Physics.Arcade.Body.prototype = { }, + /** + * Gets the total gravity to be applied on the Y axis. + * + * @method Phaser.Physics.Arcade#getTotalGravityY + * @protected + * @return {number} The total gravity to be applied on the Y axis. + */ getTotalGravityY: function () { if (this.allowGravity) @@ -707,6 +930,114 @@ Phaser.Physics.Arcade.Body.prototype = { }, + hitLeft: function (body, response) { + + // This body isn't moving horizontally, so it was hit by something moving right + if (this.immovable || this.blocked.right) + { + body.add(response.overlapV); + body.velocity.x = this.velocity.x - body.velocity.x * body.bounce.x; + body.velocity.y = this.velocity.y - body.velocity.y * body.bounce.y; + body.reboundCheck(true, true); + } + else + { + if (body.immovable || body.blocked.left) + { + // We take the full separation as what hit is isn't moveable + this.sub(response.overlapV); + this.velocity.x = body.velocity.x - this.velocity.x * this.bounce.x; + this.velocity.y = body.velocity.y - this.velocity.y * this.bounce.y; + this.reboundCheck(true, true); + } + else + { + response.overlapV.scale(0.5); + this.sub(response.overlapV); + body.add(response.overlapV); + // this.reboundCheck(true, false); + // body.reboundCheck(true, false); + var tempVX = body.velocity.x; + var tempVY = body.velocity.y; + body.velocity.x = this.velocity.x * body.bounce.x; + body.velocity.y = this.velocity.y * body.bounce.x; + this.velocity.x = tempVX * this.bounce.x; + this.velocity.y = tempVY * this.bounce.y; + this.reboundCheck(true, true); + body.reboundCheck(true, false); + this.acceleration.setTo(0, 0); + body.acceleration.setTo(0, 0); + } + } + + // Bounds check + if (this.checkWorldBounds && this.right >= this.game.world.bounds.right) + { + this.blocked.right = true; + this.x -= this.right - this.game.world.bounds.right; + } + + if (this.collideCallback) + { + this.collideCallback.call(this.collideCallbackContext, Phaser.LEFT, this, body); + } + + }, + + hitRight: function (body, response) { + + // This body isn't moving horizontally, so it was hit by something moving right + if (this.immovable || this.blocked.left) + { + body.add(response.overlapV); + body.velocity.x = this.velocity.x - body.velocity.x * body.bounce.x; + body.velocity.y = this.velocity.y - body.velocity.y * body.bounce.y; + body.reboundCheck(true, true); + } + else + { + if (body.immovable || body.blocked.right) + { + // We take the full separation as what hit is isn't moveable + this.sub(response.overlapV); + this.velocity.x = body.velocity.x - this.velocity.x * this.bounce.x; + this.velocity.y = body.velocity.y - this.velocity.y * this.bounce.y; + this.reboundCheck(true, true); + } + else + { + response.overlapV.scale(0.5); + this.sub(response.overlapV); + body.add(response.overlapV); + // this.reboundCheck(true, false); + // body.reboundCheck(true, false); + var tempVX = body.velocity.x; + var tempVY = body.velocity.y; + body.velocity.x = this.velocity.x * body.bounce.x; + body.velocity.y = this.velocity.y * body.bounce.x; + this.velocity.x = tempVX * this.bounce.x; + this.velocity.y = tempVY * this.bounce.y; + this.reboundCheck(true, true); + body.reboundCheck(true, false); + this.acceleration.setTo(0, 0); + body.acceleration.setTo(0, 0); + } + } + + // Bounds check + if (this.checkWorldBounds && this.x <= this.game.world.bounds.x) + { + this.blocked.left = true; + this.x += this.game.world.bounds.x - this.x; + } + + if (this.collideCallback) + { + this.collideCallback.call(this.collideCallbackContext, Phaser.RIGHT, this, body); + } + + }, + /** * Process a collision with the left face of this Body. If possible the Body will be moved right. * Uses overlayX which will be positive. @@ -719,7 +1050,7 @@ Phaser.Physics.Arcade.Body.prototype = { * @param {number} nv2 - The new velocity for the colliding Body. * @param {number} avg - The new average velocity between the two Bodies. */ - hitLeft: function (x, body, nv1, nv2, avg) { + XhitLeft: function (x, body, nv1, nv2, avg) { // This body isn't moving horizontally, so it was hit by something moving right if (this.immovable || this.blocked.right) @@ -777,7 +1108,7 @@ Phaser.Physics.Arcade.Body.prototype = { * @param {number} nv2 - The new velocity for the colliding Body. * @param {number} avg - The new average velocity between the two Bodies. */ - hitRight: function (x, body, nv1, nv2, avg) { + XhitRight: function (x, body, nv1, nv2, avg) { // This body isn't moving horizontally, so it was hit by something moving right if (this.immovable || this.blocked.left) @@ -835,7 +1166,7 @@ Phaser.Physics.Arcade.Body.prototype = { * @param {number} nv2 - The new velocity for the colliding Body. * @param {number} avg - The new average velocity between the two Bodies. */ - hitUp: function (y, body, nv1, nv2, avg) { + XhitUp: function (y, body, nv1, nv2, avg) { // This body isn't moving horizontally, so it was hit by something moving right if (this.immovable || this.blocked.down) @@ -893,7 +1224,7 @@ Phaser.Physics.Arcade.Body.prototype = { * @param {number} nv2 - The new velocity for the colliding Body. * @param {number} avg - The new average velocity between the two Bodies. */ - hitDown: function (y, body, nv1, nv2, avg) { + XhitDown: function (y, body, nv1, nv2, avg) { // This body isn't moving horizontally, so it was hit by something moving right if (this.immovable || this.blocked.up) @@ -938,6 +1269,21 @@ Phaser.Physics.Arcade.Body.prototype = { }, + sub: function (v) { + + this.x -= v.x; + this.y -= v.y; + + }, + + add: function (v) { + + this.x += v.x; + this.y += v.y; + + }, + + /** * This separates this Body from the given Body unless a customSeparateCallback is set. * It assumes they have already been overlap checked and the resulting overlap is stored in overlapX and overlapY. @@ -954,6 +1300,147 @@ Phaser.Physics.Arcade.Body.prototype = { return this.customSeparateCallback.call(this.customSeparateContext, this, this.overlapX, this.overlapY); } + // if (this.immovable && body.immovable) + // { + // this.response.overlapV.scale(0.5); + // this.sub(this.response.overlapV); + // body.add(this.response.overlapV); + // } + + // Move equally out of each other + + // console.log(this.response); + + // angle of collision + // var dx = this.x - body.x; + // var dy = this.y - body.y; + // var collision_angle = Math.atan2(dy, dx); + // var sin = Math.sin(collision_angle); + // var cos = Math.sin(collision_angle); + // var sin2 = Math.sin(collision_angle + Math.PI / 2); + // var cos2 = Math.sin(collision_angle + Math.PI / 2); + + var distances = [ + (body.right - this.x), // distance of box 'b' to face on 'left' side of 'a'. + (this.right - body.x), // distance of box 'b' to face on 'right' side of 'a'. + (body.bottom - this.y), // distance of box 'b' to face on 'bottom' side of 'a'. + (this.bottom - body.y) // distance of box 'b' to face on 'top' side of 'a'. + ]; + + // console.log('angle of collision', collision_angle, this.game.math.radToDeg(collision_angle), this.response); + // console.log(distances); + + if (this.response.overlapN.x) + { + // Which is smaller? Left or Right? + if (distances[0] < distances[1]) + { + console.log(this.sprite.name, 'collided on the LEFT with', body.sprite.name); + this.hitLeft(body, this.response); + } + else if (distances[1] < distances[0]) + { + console.log(this.sprite.name, 'collided on the RIGHT with', body.sprite.name); + this.hitRight(body, this.response); + } + } + else if (this.response.overlapN.y) + { + // Which is smaller? Top or Bottom? + if (distances[2] < distances[3]) + { + console.log(this.sprite.name, 'collided on the TOP with', body.sprite.name); + this.touching.up = true; + body.touching.down = true; + } + else if (distances[3] < distances[2]) + { + console.log(this.sprite.name, 'collided on the BOTTOM with', body.sprite.name); + this.touching.down = true; + body.touching.up = true; + } + } + + return true; + + // this.response.overlapV.scale(0.5); + + // this.x -= this.response.overlapV.x; + // this.y -= this.response.overlapV.y; + // body.x += this.response.overlapV.x; + // body.y += this.response.overlapV.y; + + // this.polygons.pos.x = this.x; + // this.polygons.pos.y = this.y; + // body.polygons.pos.x = body.x; + // body.polygons.pos.y = body.y; + + // var tempVX = body.velocity.x; + // var tempVY = body.velocity.y; + + // body.velocity.x = this.velocity.x * body.bounce.x; + // body.velocity.y = this.velocity.y * body.bounce.x; + // this.velocity.x = tempVX * this.bounce.x; + // this.velocity.y = tempVY * this.bounce.y; + + // this.reboundCheck(true, true); + + // this.acceleration.setTo(0, 0); + // body.acceleration.setTo(0, 0); + + +/* + +Find the positions right before the collision. You are already approximating this by: "finding the shortest penetration vector and adding it to the AABB's position." +Find the velocities right after the collision using Newtonian physics: +For the case where mass is hard-coded as 1, simply swap the velocities (this does not apply to static objects which must have infinite mass): +A.v = B.u +B.v = A.u +If objects A and B have different masses: +A.v = (A.u * (A.m - B.m) + (2 * B.m * B.u)) / (A.m + B.m) +B.v = (B.u * (B.m - A.m) + (2 * A.m * A.u)) / (A.m + B.m) +where: +v: velocity after collision +u: velocity before collision +m: mass (use the largest number possible for the mass of a fixed, static object) +Set acceleration to 0: The acceleration from the collision was accounted for above by the velocity calculations in step number 2. + +*/ + + /* + + var vx_1 = this.speed * Math.cos(this.angle - collision_angle); + var vy_1 = this.speed * Math.sin(this.angle - collision_angle); + var vx_2 = body.speed * Math.cos(body.angle - collision_angle); + var vy_2 = body.speed * Math.sin(body.angle - collision_angle); + + var final_vx_1 = ((this.mass - body.mass) * vx_1 + (body.mass + body.mass) * vx_2)/(this.mass + body.mass); + var final_vx_2 = ((this.mass + this.mass) * vx_1 + (body.mass - this.mass) * vx_2)/(this.mass + body.mass); + + var final_vy_1 = vy_1; + var final_vy_2 = vy_2 + + this.velocity.x = (cos * final_vx_1 + cos2 * final_vy_1); + this.velocity.y = (sin * final_vx_1 + sin2 * final_vy_1); + body.velocity.x = (cos * final_vx_2 + cos2 * final_vy_2); + body.velocity.y = (sin * final_vx_2 + sin2 * final_vy_2); + + // this.velocity.x = (cos * final_vx_1 + cos2 * final_vy_1) * this.bounce.x; + // this.velocity.y = (sin * final_vx_1 + sin2 * final_vy_1) * this.bounce.y; + // body.velocity.x = (cos * final_vx_2 + cos2 * final_vy_2) * body.bounce.x; + // body.velocity.y = (sin * final_vx_2 + sin2 * final_vy_2) * body.bounce.y; + + // this.velocity.x = (Math.cos(collision_angle) * final_vx_1 + Math.cos(collision_angle + Math.PI/2) * final_vy_1) * this.bounce.x; + // this.velocity.y = (Math.sin(collision_angle) * final_vx_1 + Math.sin(collision_angle + Math.PI/2) * final_vy_1) * this.bounce.y; + // body.velocity.x = (Math.cos(collision_angle) * final_vx_2 + Math.cos(collision_angle + Math.PI/2) * final_vy_2) * body.bounce.x; + // body.velocity.y = (Math.sin(collision_angle) * final_vx_2 + Math.sin(collision_angle + Math.PI/2) * final_vy_2) * body.bounce.y; + + // this.sub(response.overlapV); + // body.add(response.overlapV); + + */ + + /* if (this.overlapX !== 0) { this._newVelocity1 = Math.sqrt((body.velocity.x * body.velocity.x * body.mass) / this.mass) * ((body.velocity.x > 0) ? 1 : -1); @@ -989,6 +1476,7 @@ Phaser.Physics.Arcade.Body.prototype = { this.hitUp(this.overlapY, body, this._newVelocity1, this._newVelocity2, this._average); } } + */ return true; @@ -1022,6 +1510,8 @@ Phaser.Physics.Arcade.Body.prototype = { this.facing = Phaser.DOWN; } + // this.applyMotion(); + if ((this.deltaX() < 0 && !this.blocked.left) || (this.deltaX() > 0 && !this.blocked.right)) { this.sprite.x += this.deltaX(); diff --git a/src/utils/Debug.js b/src/utils/Debug.js index c5a9e0b3a..4cb4ca370 100644 --- a/src/utils/Debug.js +++ b/src/utils/Debug.js @@ -923,7 +923,7 @@ Phaser.Utils.Debug.prototype = { }, /** - * Renders the corners and point information of the given Sprite. + * * @method Phaser.Utils.Debug#renderPolygon * @param {array} polygon * @param {string} [color='rgb(255,255,255)'] - The color the polygon is stroked in. @@ -937,14 +937,18 @@ Phaser.Utils.Debug.prototype = { color = color || 'rgb(255,255,255)'; + var points = polygon.points; + var x = polygon.pos.x; + var y = polygon.pos.y; + this.start(0, 0, color); this.context.beginPath(); - this.context.moveTo(polygon[0].x, polygon[0].y); + this.context.moveTo(x + points[0].x, y + points[0].y); - for (var i = 1; i < polygon.length; i++) + for (var i = 1; i < points.length; i++) { - this.context.lineTo(polygon[i].x, polygon[i].y); + this.context.lineTo(x + points[i].x, y + points[i].y); } this.context.closePath();