diff --git a/README.md b/README.md index ec1a052b..30359761 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,10 @@ New features: * Input.setMoveCallback allows you to set a callback that will be fired each time the activePointer receives a DOM move event. * Math.distancePow(x1,y1,x2,y2,power) returns the distance between two coordinates at the given power. * Physics.collideArray(obj, array) for when you want to collide an object against a number of sprites that aren't all in the same Group. +* Math.reverseAngle - reverses an angle (in radians). +* Math.normalizeAngle - normalises an angle, now in radians only. +* Math.normalizeLatitude - Normalizes a latitude to the [-90,90] range. +* Math.normalizeLongitude - Normalizes a longitude to the [-180,180] range. New Examples: diff --git a/examples/wip/2ball.js b/examples/wip/2ball.js index ee60ee69..e34ed4cf 100644 --- a/examples/wip/2ball.js +++ b/examples/wip/2ball.js @@ -15,6 +15,7 @@ var sprite; var sprite2; var sprite3; var group; +var flag = false; var bmd; @@ -27,10 +28,94 @@ function create() { var bg = game.add.sprite(0, 0, bmd); bg.body.moves = false; - test3(); + test7(); } +function test7() { + + game.physics.gravity.x = 200; + + sprite = game.add.sprite(300, 300, 'gameboy', 0); + sprite.name = 'red'; + sprite.body.collideWorldBounds = true; + sprite.body.bounce.setTo(0.8, 0.8); + // sprite.body.velocity.y = 100; + + // sprite.body.gravity.y = 200; + + // sprite.body.friction = 0.2; + + game.input.onDown.add(launch7, this); + +} + +function launch7() { + + sprite.body.velocity.x = -200; + sprite.body.velocity.y = 200; + +} + + + + +function test6() { + + game.physics.gravity.y = 100; + + sprite = game.add.sprite(300, 200, 'gameboy', 0); + sprite.name = 'red'; + sprite.body.collideWorldBounds = true; + sprite.body.bounce.setTo(0.5, 0.5); + + game.input.onDown.add(launch6, this); + +} + +function launch6() { + + sprite.body.velocity.x = 200; + sprite.body.velocity.y = -200; + +} + + + + +function test5() { + + sprite = game.add.sprite(0, 600, 'gameboy', 0); + sprite.name = 'red'; + sprite.body.collideWorldBounds = true; + // sprite.body.bounce.setTo(0.9, 0.9); + + game.input.onDown.add(launch5, this); + +} + +function launch5() { + + sprite.body.velocity.x = 100; + sprite.body.velocity.y = -100; + game.time.events.add(Phaser.Timer.SECOND * 4, stop5, this); + +} + +function stop5() { + + sprite.body.velocity.x = -100; + // sprite.body.velocity.y = 100; + console.log(sprite.x, sprite.body.x); + +} + + + + + + + function test4() { game.physics.gravity.y = 50; @@ -156,15 +241,15 @@ function update() { // game.physics.collide(group, group); - if (sprite3) - { - game.physics.collideArray(sprite, [sprite2, sprite3]); - game.physics.collide(sprite2, sprite3); - } - else - { - game.physics.collide(sprite, sprite2); - } + // if (sprite3) + // { + // game.physics.collideArray(sprite, [sprite2, sprite3]); + // game.physics.collide(sprite2, sprite3); + // } + // else + // { + // game.physics.collide(sprite, sprite2); + // } if (sprite) @@ -192,7 +277,8 @@ function render() { if (sprite) { game.debug.renderBodyInfo(sprite, 16, 24); - game.debug.renderText(sprite.name + ' x: ' + sprite.x, 16, 500); + game.debug.renderText(sprite.name + ' x: ' + sprite.x.toFixed(2) + ' dx: ' + sprite.body._dx.toFixed(2), 16, 500); + game.debug.renderText(sprite.name + ' y: ' + sprite.y.toFixed(2) + ' dy: ' + sprite.body._dy.toFixed(2), 16, 520); } if (sprite2) diff --git a/examples/wip/multiball.js b/examples/wip/multiball.js index 314d31c2..d311ff27 100644 --- a/examples/wip/multiball.js +++ b/examples/wip/multiball.js @@ -26,7 +26,7 @@ function create() { sprites = game.add.group(); - for (var i = 0; i < 100; i++) + for (var i = 0; i < 40; i++) { var s = sprites.create(game.rnd.integerInRange(100, 700), game.rnd.integerInRange(32, 200), 'ball'); s.body.velocity.x = game.rnd.integerInRange(-400, 400); @@ -39,8 +39,6 @@ function create() { sprites.setAll('body.bounce.y', 0.9); sprites.setAll('body.minBounceVelocity', 0.8); - console.log(sprites._container.children); - gameboy = game.add.sprite(300, 50, 'gameboy', 0); gameboy.name = 'gameboy'; gameboy.body.collideWorldBounds = true; @@ -52,7 +50,7 @@ function create() { function update() { - // game.physics.collide(gameboy, sprites); + game.physics.collide(gameboy, sprites); game.physics.collide(sprites); // sprite.rotation = sprite.body.angle; diff --git a/src/math/Math.js b/src/math/Math.js index c74a8620..cefc0045 100644 --- a/src/math/Math.js +++ b/src/math/Math.js @@ -340,24 +340,58 @@ Phaser.Math = { }, /** - * Set an angle within the bounds of -π to π. - * @method Phaser.Math#normalizeAngle - * @param {number} angle - * @param {boolean} radians - True if angle size is expressed in radians. - * @return {number} + * Reverses an angle. + * @method Phaser.Math#reverseAngle + * @param {number} angleRad - The angle to reverse, in radians. + * @return {number} Returns the reverse angle, in radians. */ - normalizeAngle: function (angle, radians) { + reverseAngle: function (angleRad) { + return this.normalizeAngle(angleRad + Math.PI, true); + }, - if (typeof radians === "undefined") { radians = true; } + /** + * Normalizes an angle to the [0,2pi) range. + * @method Phaser.Math#normalizeAngle + * @param {number} angleRad - The angle to normalize, in radians. + * @return {number} Returns the angle, fit within the [0,2pi] range, in radians. + */ + normalizeAngle: function (angleRad) { - var rd = (radians) ? Math.PI : 180; - return this.wrap(angle, -rd, rd); + angleRad = angleRad % (2 * Math.PI); + return angleRad >= 0 ? angleRad : angleRad + 2 * Math.PI; }, /** - * Closest angle between two angles from a1 to a2 - * absolute value the return for exact angle + * Normalizes a latitude to the [-90,90] range. Latitudes above 90 or below -90 are capped, not wrapped. + * @method Phaser.Math#normalizeLatitude + * @param {number} lat - The latitude to normalize, in degrees. + * @return {number} Returns the latitude, fit within the [-90,90] range. + */ + normalizeLatitude: function (lat) { + return Math.max(-90, Math.min(90, lat)); + }, + + /** + * Normalizes a longitude to the [-180,180] range. Longitudes above 180 or below -180 are wrapped. + * @method Phaser.Math#normalizeLongitude + * @param {number} lng - The longitude to normalize, in degrees. + * @return {number} Returns the longitude, fit within the [-180,180] range. + */ + normalizeLongitude: function (lng) { + + if (lng % 360 == 180) + { + return 180; + } + + lng = lng % 360; + return lng < -180 ? lng + 360 : lng > 180 ? lng - 360 : lng; + + }, + + /** + * Closest angle between two angles from a1 to a2 absolute value the return for exact angle * @method Phaser.Math#nearestAngleBetween * @param {number} a1 * @param {number} a2 @@ -511,13 +545,13 @@ Phaser.Math = { /** * Ensures that the value always stays between min and max, by wrapping the value around. - *

max should be larger than min, or the function will return 0

+ * max should be larger than min, or the function will return 0. * * @method Phaser.Math#wrap - * @param value The value to wrap - * @param min The minimum the value is allowed to be - * @param max The maximum the value is allowed to be - * @return {number} The wrapped value + * @param {number} value - The value to wrap. + * @param {number} min - The minimum the value is allowed to be. + * @param {number} max - The maximum the value is allowed to be. + * @return {number} The wrapped value. */ wrap: function (value, min, max) { diff --git a/src/physics/arcade/Body.js b/src/physics/arcade/Body.js index 077d60dc..dd2d472f 100644 --- a/src/physics/arcade/Body.js +++ b/src/physics/arcade/Body.js @@ -125,10 +125,16 @@ Phaser.Physics.Arcade.Body = function (sprite) { this.acceleration = new Phaser.Point(); /** - * @property {number} speed - The speed in pixels per second sq. of the Body. + * @property {number} speed - The speed the Body is traveling. */ this.speed = 0; + /** + * @property {number} minDelta - When a body bounces (off a wall or another body) if the resulting delta is less than minDelta, the velocity is cancelled. + * @default + */ + this.minDelta = 0.09; + /** * @property {number} angle - The angle of the Body in radians. */ @@ -137,7 +143,7 @@ Phaser.Physics.Arcade.Body = function (sprite) { /** * @property {number} minBounceVelocity - The minimum bounce velocity (could just be the bounce value?). */ - this.minBounceVelocity = 0.5; + // this.minBounceVelocity = 0.2; this._debug = 0; @@ -155,7 +161,7 @@ Phaser.Physics.Arcade.Body = function (sprite) { * @property {Phaser.Point} minVelocity - When a body rebounds off another the minVelocity is checked, if the new velocity is lower than the minVelocity the body is stopped. * @default */ - this.minVelocity = new Phaser.Point(10, 10); + this.minVelocity = new Phaser.Point(2, 2); /** * @property {Phaser.Point} maxVelocity - The maximum velocity that the Body can reach. @@ -278,10 +284,10 @@ Phaser.Physics.Arcade.Body = function (sprite) { this.overlapY = 0; /** - * @property {number} friction - The amount of friction this body experiences during motion. + * @property {number} friction - The amount of friction this body experiences during motion. Friction reduces velocity until the body comes to a stand-still. * @default */ - this.friction = 0; + this.friction = 0.1; /** * If a body is overlapping with another body, but neither of them are moving (maybe they spawned on-top of each other?) this is set to true. @@ -365,13 +371,6 @@ Phaser.Physics.Arcade.Body.prototype = { */ preUpdate: function () { - // Store and reset collision flags - // this.wasTouching.none = this.touching.none; - // this.wasTouching.up = this.touching.up; - // this.wasTouching.down = this.touching.down; - // this.wasTouching.left = this.touching.left; - // this.wasTouching.right = this.touching.right; - this.screenX = (this.sprite.worldTransform[2] - (this.sprite.anchor.x * this.width)) + this.offset.x; this.screenY = (this.sprite.worldTransform[5] - (this.sprite.anchor.y * this.height)) + this.offset.y; @@ -379,6 +378,10 @@ Phaser.Physics.Arcade.Body.prototype = { this.preY = (this.sprite.world.y - (this.sprite.anchor.y * this.height)) + this.offset.y; this.preRotation = this.sprite.angle; + this.x = this.preX; + this.y = this.preY; + this.rotation = this.preRotation; + this.blocked.up = false; this.blocked.down = false; this.blocked.left = false; @@ -386,37 +389,24 @@ Phaser.Physics.Arcade.Body.prototype = { // this.embedded = false; - this.x = this.preX; - this.y = this.preY; - this.rotation = this.preRotation; - - this.speed = Math.sqrt(this.velocity.x * this.velocity.x + this.velocity.y * this.velocity.y); - this.angle = Math.atan2(this.velocity.y, this.velocity.x); - this._debug++; if (this.moves) { if (this.collideWorldBounds) { - this.checkWorldBounds(); + this.checkWorldBounds(true); } + this.speed = Math.sqrt(this.velocity.x * this.velocity.x + this.velocity.y * this.velocity.y); + this.angle = Math.atan2(this.velocity.y, this.velocity.x); + this.game.physics.updateMotion(this); - - this.applyMotion(); - } - if (this.deltaX() != 0) - { - this.touching.left = false; - this.touching.right = false; - } + this.applyFriction(); + + this.limitVelocity(); - if (this.deltaY() != 0) - { - this.touching.up = false; - this.touching.down = false; } }, @@ -427,7 +417,7 @@ Phaser.Physics.Arcade.Body.prototype = { * @method Phaser.Physics.Arcade#checkWorldBounds * @protected */ - checkWorldBounds: function () { + ORIGINALcheckWorldBounds: function () { this.blockedPoint.setTo(0, 0); @@ -464,12 +454,64 @@ Phaser.Physics.Arcade.Body.prototype = { }, /** - * Internal method. + * Internal method used to check the Body against the World Bounds and move it back into the bounds again. * - * @method Phaser.Physics.Arcade#applyMotion + * @method Phaser.Physics.Arcade#checkWorldBounds * @protected */ - applyMotion: function () { + checkWorldBounds: function (rebound) { + + if (this.x <= this.game.world.bounds.x) + { + this.x += (this.game.world.bounds.x - this.x); + this.blocked.left = true; + // console.log(this._debug, 'cwl', this.overlapX, this.x, this.game.world.bounds.x); + } + else if (this.right >= this.game.world.bounds.right) + { + this.x -= this.right - this.game.world.bounds.right; + this.blocked.right = true; + // console.log(this._debug, 'cwr', this.overlapX, this.x, this.game.world.bounds.x); + } + + if (this.y <= this.game.world.bounds.y) + { + this.y += this.game.world.bounds.y - this.y; + this.blocked.up = true; + // console.log(this._debug, 'cwu', this.overlapY, this.y, this.height, this.bottom, this.game.world.bounds.bottom); + } + else if (this.bottom >= this.game.world.bounds.bottom) + { + this.y -= this.bottom - this.game.world.bounds.bottom; + this.blocked.down = true; + // console.log(this._debug, 'cwd', this.overlapY, this.y, this.height, this.bottom, this.game.world.bounds.bottom); + } + + // Rebound? + if (rebound && this.speed > 0) + { + var angle = this.game.math.reverseAngle(this.angle); + + if ((this.blocked.left || this.blocked.right) && this.bounce.x > 0) + { + this.velocity.x = (Math.cos(angle) * this.speed) * this.bounce.x; + } + + if ((this.blocked.up || this.blocked.down) && this.bounce.y > 0) + { + this.velocity.y = (Math.sin(angle) * this.speed) * this.bounce.y; + } + } + + }, + + /** + * Internal method. + * + * @method Phaser.Physics.Arcade#applyFriction + * @protected + */ + applyFriction: function () { if (this.friction > 0 && this.acceleration.isZero()) { @@ -486,15 +528,14 @@ Phaser.Physics.Arcade.Body.prototype = { this.velocity.y = Math.sin(this.angle) * this.speed; } + }, + + /* + worldBounce: function () { + // 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) + if (this.blocked.left) { - // Separate - // this.x += this.overlapX; - this.x += this.blockedPoint.x; - - // console.log(this._debug, 'blocked left', this.x, this.overlapX); - this.velocity.x *= -this.bounce.x; this._dx = this.game.time.physicsElapsed * (this.velocity.x + this.motionVelocity.x / 2); @@ -515,7 +556,7 @@ Phaser.Physics.Arcade.Body.prototype = { // console.log(this._debug, 'blocked left KILL', this._dx, 'overlap', this.overlapX, 'delta', this.deltaX(), 'newy', this.x); } } - else if (this.blocked.right && this.blockedPoint.x > 0) + else if (this.blocked.right) { // Separate this.x -= this.blockedPoint.x; @@ -547,7 +588,7 @@ Phaser.Physics.Arcade.Body.prototype = { } // 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) + if (this.blocked.up) { // Separate // this.y += this.overlapY; @@ -572,7 +613,255 @@ Phaser.Physics.Arcade.Body.prototype = { // console.log(this._debug, 'void1', this.velocity.y, 'delta', this.deltaY()); } } - else if (this.blocked.down && this.blockedPoint.y > 0) + else if (this.blocked.down) + { + // Separate + // this.y -= this.overlapY; + this.y -= this.blockedPoint.y; + + this.velocity.y *= -this.bounce.y; + + this._dy = this.game.time.physicsElapsed * (this.velocity.y + this.motionVelocity.y / 2); + + if (this._dy < -this.minBounceVelocity) + // if (Math.abs(this.velocity.y) > this.minVelocity.y) + { + this.y += this._dy; + this.velocity.y += this.motionVelocity.y; + // console.log(this._debug, 'rb', this._dy, 'delta', this.deltaY(), 'newy', this.y); + } + else + { + // Kill it dead :) + this.preY = this.y; // because we don't want any delta from a separation + this.velocity.y = 0; + this.motionVelocity.y = 0; + // console.log(this._debug, 'void1', this.velocity.y, 'delta', this.deltaY()); + } + } + else + { + this.y += this.game.time.physicsElapsed * (this.velocity.y + this.motionVelocity.y / 2); + this.velocity.y += this.motionVelocity.y; + } + + + }, + */ + + limitVelocity: function (dx, dy) { + + if (this.velocity.x > this.maxVelocity.x) + { + this.velocity.x = this.maxVelocity.x; + } + else if (this.velocity.x < -this.maxVelocity.x) + { + this.velocity.x = -this.maxVelocity.x; + } + + if (this.velocity.y > this.maxVelocity.y) + { + this.velocity.y = this.maxVelocity.y; + } + else if (this.velocity.y < -this.maxVelocity.y) + { + this.velocity.y = -this.maxVelocity.y; + } + + var gx = this.gravity.x + this.game.physics.gravity.x; + var gy = this.gravity.y + this.game.physics.gravity.y; + var stopX = false; + var stopY = false; + + if (dx) + { + if (gx > 0 && this.blocked.down && Math.abs(dx) < this.minDelta) + { + // Left pulling gravity + console.log('gx killed 1', dx, gx); + stopX = true; + } + else if (gx < 0 && this.blocked.up && Math.abs(dx) < this.minDelta) + { + // Right pulling gravity + console.log('gx killed 2', dx, gx); + stopX = true; + } + else if (gx === 0 && this.velocity.x !== 0 && Math.abs(this.velocity.x) < this.minVelocity.x) + { + console.log('gx killed 3', this.velocity.x); + stopX = true; + } + + if (stopX) + { + this.preX = this.x; + this.velocity.x = 0; + } + } + + if (dy) + { + if (gy > 0 && this.blocked.down && Math.abs(dy) < this.minDelta) + { + // Downward gravity + console.log('gy killed 1', dy, gy); + stopY = true; + } + else if (gy < 0 && this.blocked.up && Math.abs(dy) < this.minDelta) + { + // Upward gravity + console.log('gy killed 2', dy, gy); + stopY = true; + } + else if (gy === 0 && this.velocity.y !== 0 && Math.abs(this.velocity.y) < this.minVelocity.y) + { + console.log('gy killed 3', this.velocity.y); + stopY = true; + } + + if (stopY) + { + this.preY = this.y; + this.velocity.y = 0; + } + } + + if (!stopX && !stopY) + { + return 0; + } + else if (stopX && !stopY) + { + return 1; + } + else if (!stopX && stopY) + { + return 2; + } + else + { + return 3; + } + + }, + + /** + * Internal method. + * + * @method Phaser.Physics.Arcade#applyMotion + * @protected + */ + ORIGINALapplyMotion: function () { + + if (this.friction > 0 && this.acceleration.isZero()) + { + if (this.speed > this.friction) + { + this.speed -= this.friction; + } + else + { + this.speed = 0; + } + + this.velocity.x = Math.cos(this.angle) * this.speed; + this.velocity.y = Math.sin(this.angle) * this.speed; + } + + if (this.blocked.isZero()) + { + return; + } + + // overlapX/Y values at this point will be penetration into the bounds and DELTA WILL BE ZERO + if (this.blocked.left) + { + // Separate + // this.x += this.overlapX; + this.x += this.blockedPoint.x; + + // console.log(this._debug, 'blocked left', this.x, this.overlapX); + + this.velocity.x *= -this.bounce.x; + + this._dx = this.game.time.physicsElapsed * (this.velocity.x + this.motionVelocity.x / 2); + + if (this._dx > this.minBounceVelocity) + // if (Math.abs(this.velocity.x) > this.minVelocity.x) + { + this.x += this._dx; + this.velocity.x += this.motionVelocity.x; + // console.log(this._debug, 'blocked left', this._dx, 'overlap', this.overlapX, 'delta', this.deltaX(), 'newy', this.x); + } + else + { + // Kill it dead :) + this.preX = this.x; // because we don't want any delta from a separation + this.velocity.x = 0; + this.motionVelocity.x = 0; + // console.log(this._debug, 'blocked left KILL', this._dx, 'overlap', this.overlapX, 'delta', this.deltaX(), 'newy', this.x); + } + } + else if (this.blocked.right) + { + // Separate + this.x -= this.blockedPoint.x; + // this.x -= this.overlapX; + + this.velocity.x *= -this.bounce.x; + + this._dx = this.game.time.physicsElapsed * (this.velocity.x + this.motionVelocity.x / 2); + + if (this._dx < -this.minBounceVelocity) + { + this.x += this._dx; + this.velocity.x += this.motionVelocity.x; + // console.log(this._debug, 'blocked right', this._dx, 'overlap', this.overlapX, 'delta', this.deltaX(), 'newy', this.x); + } + else + { + // Kill it dead :) + this.preX = this.x; // because we don't want any delta from a separation + this.velocity.x = 0; + this.motionVelocity.x = 0; + // console.log(this._debug, 'blocked right KILL', this._dx, 'overlap', this.overlapX, 'delta', this.deltaX(), 'newy', this.x); + } + } + 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) + { + // Separate + // this.y += this.overlapY; + this.y += this.blockedPoint.y; + + this.velocity.y *= -this.bounce.y; + + this._dy = this.game.time.physicsElapsed * (this.velocity.y + this.motionVelocity.y / 2); + + if (this._dy > this.minBounceVelocity) + // if (Math.abs(this.velocity.y) > this.minVelocity.y) + { + this.y += this._dy; + this.velocity.y += this.motionVelocity.y; + } + else + { + // Kill it dead :) + this.preY = this.y; // because we don't want any delta from a separation + this.velocity.y = 0; + this.motionVelocity.y = 0; + // console.log(this._debug, 'void1', this.velocity.y, 'delta', this.deltaY()); + } + } + else if (this.blocked.down) { // Separate // this.y -= this.overlapY; @@ -668,13 +957,18 @@ Phaser.Physics.Arcade.Body.prototype = { this.touching.left = false; this.touching.right = false; } - else + else if (Math.abs(this.overlapX) < Math.abs(this.overlapY)) { // Horizontal penetration (as y is larger than x) this.overlapY = 0; this.touching.up = false; this.touching.down = false; } + else + { + // They are identical, so let's revert to checking the delta? + console.log('They are identical, so let\'s revert to checking the delta?'); + } } // overlapX/Y now contains either zero or a positive value containing the overlapping area @@ -682,6 +976,57 @@ Phaser.Physics.Arcade.Body.prototype = { }, + // Ensure Body is within world limits + worldLimit: function () { + + if (!this.collideWorldBounds) + { + return; + } + + this.checkWorldBounds(); + + if (this.blocked.left && this.blockedPoint.x > 0) + { + this.x += this.blockedPoint.x; + this.preX += this.blockedPoint.x; + } + else if (this.blocked.right && this.blockedPoint.x > 0) + { + this.x -= this.blockedPoint.x; + this.preX -= this.blockedPoint.x; + } + + if (this.blocked.up && this.blockedPoint.y > 0) + { + this.y += this.blockedPoint.y; + this.preY += this.blockedPoint.y; + } + else if (this.blocked.down && this.blockedPoint.y > 0) + { + this.y -= this.blockedPoint.y; + this.preY -= this.blockedPoint.y; + } + + }, + + separateX: function (x, body, nv1, nv2, avg) { + + if (this.immovable || (x < 0 && this.blocked.right) || (x > 0 && this.blocked.left)) + { + body.x -= x; + body.velocity.x = this.velocity.x - body.velocity.x * body.bounce.x; + body.worldLimit(); + } + + // else if (x > 0) + // { + // // right + // } + + + }, + // The left-hand face of this Body was hit // overlapX will be a positive value hitLeft: function (x, body, nv1, nv2, avg) { @@ -691,6 +1036,7 @@ Phaser.Physics.Arcade.Body.prototype = { { // console.log(this.sprite.name, 'hitLeft', 'immovable'); body.x -= x; + if (!body.immovable) body.velocity.x = this.velocity.x - body.velocity.x * body.bounce.x; } else @@ -858,6 +1204,27 @@ Phaser.Physics.Arcade.Body.prototype = { } } + if (this.velocity.x > this.maxVelocity.x) + { + this.velocity.x = this.maxVelocity.x; + } + else if (this.velocity.x < -this.maxVelocity.x) + { + this.velocity.x = -this.maxVelocity.x; + } + + if (this.velocity.y > this.maxVelocity.y) + { + this.velocity.y = this.maxVelocity.y; + } + else if (this.velocity.y < -this.maxVelocity.y) + { + this.velocity.y = -this.maxVelocity.y; + } + + // this.worldLimit(); + // body.worldLimit(); + }, /** @@ -870,6 +1237,43 @@ Phaser.Physics.Arcade.Body.prototype = { if (this.moves) { + this._dx = this.game.time.physicsElapsed * (this.velocity.x + this.motionVelocity.x / 2); + this._dy = this.game.time.physicsElapsed * (this.velocity.y + this.motionVelocity.y / 2); + + var result = this.limitVelocity(this._dx, this._dy); + + if (result === 0) + { + // Nothing was stopped + this.x += this._dx; + this.velocity.x += this.motionVelocity.x; + + this.y += this._dy; + this.velocity.y += this.motionVelocity.y; + } + else if (result === 1) + { + // X was stopped + this.y += this._dy; + this.velocity.y += this.motionVelocity.y; + } + else if (result === 2) + { + // Y was stopped + this.x += this._dx; + this.velocity.x += this.motionVelocity.x; + } + else + { + // Both stopped + } + + if (this.collideWorldBounds) + { + this.checkWorldBounds(false); + } + +/* if (this.deltaX() < 0) { this.facing = Phaser.LEFT; @@ -887,6 +1291,9 @@ Phaser.Physics.Arcade.Body.prototype = { { this.facing = Phaser.DOWN; } +*/ + + console.log(this._debug, this._dx, this.motionVelocity.x); this.sprite.x += this.deltaX(); this.sprite.y += this.deltaY(); @@ -904,7 +1311,6 @@ Phaser.Physics.Arcade.Body.prototype = { }, - /** * You can modify the size of the physics Body to be any dimension you need. * So it could be smaller or larger than the parent Sprite. You can also control the x and y offset, which