diff --git a/build/config.php b/build/config.php index b192f137..66c2300b 100644 --- a/build/config.php +++ b/build/config.php @@ -179,6 +179,7 @@ + diff --git a/examples/wip/p22.js b/examples/wip/p22.js index 58d063c1..aebb0a5c 100644 --- a/examples/wip/p22.js +++ b/examples/wip/p22.js @@ -9,6 +9,7 @@ function preload() { var box; var box2; +var cursors; function p2px(v) { return v *= -20; @@ -24,7 +25,13 @@ function create() { box2 = game.add.sprite(400, 0, 'box'); box2.physicsEnabled = true; - box2.body.mass = 2; + + box2.body.setZeroDamping(); + + cursors = game.input.keyboard.createCursorKeys(); + + + // box2.body.mass = 2; /* // Add a plane @@ -39,10 +46,33 @@ function create() { function update() { + box2.body.setZeroVelocity(); + + if (cursors.left.isDown) + { + box2.body.moveLeft(200); + } + else if (cursors.right.isDown) + { + box2.body.moveRight(200); + } + + if (cursors.up.isDown) + { + box2.body.moveUp(200); + } + else if (cursors.down.isDown) + { + box2.body.moveDown(200); + } + } function render() { + game.debug.renderText('x: ' + box2.body.velocity.x, 32, 32); + game.debug.renderText('y: ' + box2.body.velocity.y, 32, 64); + // game.debug.renderText('x: ' + p2px(boxBody.position[0]), 32, 32); // game.debug.renderText('y: ' + p2px(boxBody.position[1]), 32, 64); // game.debug.renderText('r: ' + boxBody.angle, 32, 96); diff --git a/examples/wip/p23.js b/examples/wip/p23.js new file mode 100644 index 00000000..1eb264b7 --- /dev/null +++ b/examples/wip/p23.js @@ -0,0 +1,59 @@ + +var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create, update: update, render: render }); + +function preload() { + + game.load.image('box', 'assets/sprites/block.png'); + +} + +var box; +var move = false; +var start = 0; +var end = 0; + +function create() { + + box = game.add.sprite(200, 200, 'box'); + box.physicsEnabled = true; + + box.body.setZeroDamping(); + + game.input.onDown.addOnce(startTiming, this); + +} + +function startTiming() { + + start = game.time.now; + end = start + 1000; + move = true; + +} + +function update() { + + if (move) + { + box.body.moveLeft(100); + + if (game.time.now >= end) + { + move = false; + var duration = game.time.now - start; + console.log('Test over. Distance: ', box.x, 'duration', duration); + } + } + else + { + box.body.setZeroVelocity(); + } + +} + +function render() { + + game.debug.renderText('x: ' + box.body.velocity.x, 32, 32); + game.debug.renderText('y: ' + box.body.velocity.y, 32, 64); + +} diff --git a/examples/wip/p24.js b/examples/wip/p24.js new file mode 100644 index 00000000..8c08ff2f --- /dev/null +++ b/examples/wip/p24.js @@ -0,0 +1,136 @@ + +var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create, update: update, render: render }); + +function preload() { + + game.load.image('box', 'assets/sprites/block.png'); + +} + +var box; +var box2; +var cursors; + +function p2px(v) { + return v *= -20; +} + +function px2p(v) { + return v * -0.05; +} + +function create() { + + box = game.add.sprite(200, 200, 'box'); + box.anchor.set(0.5); + box.physicsEnabled = true; + + box2 = game.add.sprite(400, 100, 'box'); + box2.anchor.set(0.5); + box2.physicsEnabled = true; + + box2.body.setZeroDamping(); + box2.body.fixedRotation = true; + + cursors = game.input.keyboard.createCursorKeys(); + + game.physics.defaultRestitution = 0.8; + + var top = new p2.Body({ mass: 0, position:[0, 0], angle: game.math.degToRad(-180) }); + top.addShape(new p2.Plane()); + game.physics.addBody(top); + + var bottom = new p2.Body({ mass: 0, position:[0, px2p(600)] }); + bottom.addShape(new p2.Plane()); + game.physics.addBody(bottom); + + var left = new p2.Body({ mass: 0, position:[0, 0], angle: game.math.degToRad(90) }); + left.addShape(new p2.Plane()); + game.physics.addBody(left); + + var right = new p2.Body({ mass: 0, position:[px2p(800), 0], angle: game.math.degToRad(-90) }); + right.addShape(new p2.Plane()); + game.physics.addBody(right); + +} + +function update() { + + box2.body.setZeroVelocity(); + + if (cursors.left.isDown) + { + box2.body.moveLeft(400); + } + else if (cursors.right.isDown) + { + box2.body.moveRight(400); + } + + if (cursors.up.isDown) + { + box2.body.moveUp(400); + } + else if (cursors.down.isDown) + { + box2.body.moveDown(400); + } + +} + +function render() { + + game.debug.renderText('x: ' + box2.body.velocity.x, 32, 32); + game.debug.renderText('y: ' + box2.body.velocity.y, 32, 64); + + // game.debug.renderText('x: ' + p2px(boxBody.position[0]), 32, 32); + // game.debug.renderText('y: ' + p2px(boxBody.position[1]), 32, 64); + // game.debug.renderText('r: ' + boxBody.angle, 32, 96); + + // drawbox(); + +} + +function drawbox() { + + // var ctx = game.context; + +/* + ctx.save(); + ctx.translate(game.width/2, game.height/2); // Translate to the center + ctx.scale(50, -50); // Zoom in and flip y axis + + ctx.lineWidth = 0.05; + ctx.strokeStyle = 'rgb(255,255,255)'; + + + ctx.beginPath(); + var x = boxBody.position[0], + y = boxBody.position[1]; + ctx.save(); + ctx.translate(x, y); // Translate to the center of the box + ctx.rotate(boxBody.angle); // Rotate to the box body frame + ctx.rect(-boxShape.width/2, -boxShape.height/2, boxShape.width, boxShape.height); + ctx.stroke(); + ctx.closePath(); + // ctx.restore(); +*/ + + // ctx.save(); + // ctx.translate(game.width/2, game.height/2); // Translate to the center + // ctx.scale(20, -20); // Zoom in and flip y axis + + // ctx.lineWidth = 0.05; + // ctx.strokeStyle = 'rgb(255,255,255)'; + // ctx.beginPath(); + + // var y = planeBody.position[1]; + // ctx.rotate(0); // Rotate to the box body frame + // ctx.moveTo(-game.width, y); + // ctx.lineTo( game.width, y); + // ctx.stroke(); + + // ctx.closePath(); + // ctx.restore(); +} + diff --git a/src/core/Game.js b/src/core/Game.js index dfdfe869..69d17eec 100644 --- a/src/core/Game.js +++ b/src/core/Game.js @@ -447,7 +447,6 @@ Phaser.Game.prototype = { this.tweens = new Phaser.TweenManager(this); this.input = new Phaser.Input(this); this.sound = new Phaser.SoundManager(this); - // this.physics = new Phaser.Physics.Arcade(this); this.physics = new Phaser.Physics.World(this); this.particles = new Phaser.Particles(this); this.plugins = new Phaser.PluginManager(this, this); @@ -616,11 +615,11 @@ Phaser.Game.prototype = { this.tweens.update(); this.sound.update(); this.input.update(); - this.physics.update(); this.state.update(); - this.world.update(); + this.physics.update(); this.particles.update(); this.plugins.update(); + this.world.update(); this.world.postUpdate(); this.plugins.postUpdate(); diff --git a/src/physics/Body.js b/src/physics/Body.js index f6a07d27..df7cf350 100644 --- a/src/physics/Body.js +++ b/src/physics/Body.js @@ -31,10 +31,16 @@ Phaser.Physics.Body = function (sprite) { */ this.offset = new Phaser.Point(); +// force + this.shape = null; - // this.data = new p2.Body({ mass: 0, position:[this.px2p(sprite.x), this.px2p(sprite.y)], angularVelocity: 1 }); - this.data = new p2.Body({ position:[this.px2p(sprite.x), this.px2p(sprite.y)] }); + this.data = new p2.Body({ position:[this.px2p(sprite.x), this.px2p(sprite.y)], mass: 1 }); + + /** + * @property {Phaser.PointProxy} velocity - The velocity of the body. Set velocity.x to a negative value to move to the left, position to the right. velocity.y negative values move up, positive move down. + */ + this.velocity = new Phaser.Physics.PointProxy(this.data.velocity); /** * @property {number} _sx - Internal cache var. @@ -118,6 +124,82 @@ Phaser.Physics.Body.prototype = { // toLocalFrame // toWorldFrame + /** + * If this Body is dynamic then this will zero its velocity on both axis. + * + * @method Phaser.Physics.Body#setZeroVelocity + */ + setZeroVelocity: function () { + + this.data.velocity[0] = 0; + this.data.velocity[1] = 0; + + }, + + /** + * Sets the Body damping and angularDamping to zero. + * + * @method Phaser.Physics.Body#setZeroDamping + */ + setZeroDamping: function () { + + this.data.damping = 0; + this.data.angularDamping = 0; + + }, + + /** + * If this Body is dynamic then this will move it to the left by setting its x velocity to the given speed. + * The speed is represented in pixels per second. So a value of 100 would move 100 pixels in 1 second (1000ms). + * + * @method Phaser.Physics.Body#moveLeft + * @param {number} speed - The speed at which it should move to the left, in pixels per second. + */ + moveLeft: function (speed) { + + this.data.velocity[0] = this.px2p(-speed); + + }, + + /** + * If this Body is dynamic then this will move it to the right by setting its x velocity to the given speed. + * The speed is represented in pixels per second. So a value of 100 would move 100 pixels in 1 second (1000ms). + * + * @method Phaser.Physics.Body#moveRight + * @param {number} speed - The speed at which it should move to the right, in pixels per second. + */ + moveRight: function (speed) { + + this.data.velocity[0] = this.px2p(speed); + + }, + + /** + * If this Body is dynamic then this will move it up by setting its y velocity to the given speed. + * The speed is represented in pixels per second. So a value of 100 would move 100 pixels in 1 second (1000ms). + * + * @method Phaser.Physics.Body#moveUp + * @param {number} speed - The speed at which it should move up, in pixels per second. + */ + moveUp: function (speed) { + + this.data.velocity[1] = this.px2p(-speed); + + }, + + /** + * If this Body is dynamic then this will move it down by setting its y velocity to the given speed. + * The speed is represented in pixels per second. So a value of 100 would move 100 pixels in 1 second (1000ms). + * + * @method Phaser.Physics.Body#moveDown + * @param {number} speed - The speed at which it should move down, in pixels per second. + */ + moveDown: function (speed) { + + this.data.velocity[1] = this.px2p(speed); + + }, + /** * Internal method that updates the Body scale in relation to the parent Sprite. * @@ -401,6 +483,87 @@ Phaser.Physics.Body.prototype = { Phaser.Physics.Body.prototype.constructor = Phaser.Physics.Body; +/** +* @name Phaser.Physics.Body#static +* @property {boolean} static - Returns true if the Body is static. Setting Body.static to 'false' will make it dynamic. +*/ +Object.defineProperty(Phaser.Physics.Body.prototype, "static", { + + get: function () { + + return (this.data.motionState === Phaser.STATIC); + + }, + + set: function (value) { + + if (value && this.data.motionState !== Phaser.STATIC) + { + this.data.motionState = Phaser.STATIC; + } + else if (!value && this.data.motionState === Phaser.STATIC) + { + this.data.motionState = Phaser.DYNAMIC; + } + + } + +}); + +/** +* @name Phaser.Physics.Body#dynamic +* @property {boolean} dynamic - Returns true if the Body is dynamic. Setting Body.dynamic to 'false' will make it static. +*/ +Object.defineProperty(Phaser.Physics.Body.prototype, "dynamic", { + + get: function () { + + return (this.data.motionState === Phaser.DYNAMIC); + + }, + + set: function (value) { + + if (value && this.data.motionState !== Phaser.DYNAMIC) + { + this.data.motionState = Phaser.DYNAMIC; + } + else if (!value && this.data.motionState === Phaser.DYNAMIC) + { + this.data.motionState = Phaser.STATIC; + } + + } + +}); + +/** +* @name Phaser.Physics.Body#kinematic +* @property {boolean} kinematic - Returns true if the Body is kinematic. Setting Body.kinematic to 'false' will make it static. +*/ +Object.defineProperty(Phaser.Physics.Body.prototype, "kinematic", { + + get: function () { + + return (this.data.motionState === Phaser.KINEMATIC); + + }, + + set: function (value) { + + if (value && this.data.motionState !== Phaser.KINEMATIC) + { + this.data.motionState = Phaser.KINEMATIC; + } + else if (!value && this.data.motionState === Phaser.KINEMATIC) + { + this.data.motionState = Phaser.STATIC; + } + + } + +}); + /** * @name Phaser.Physics.Body#allowSleep * @property {boolean} allowSleep - @@ -554,8 +717,6 @@ Object.defineProperty(Phaser.Physics.Body.prototype, "fixedRotation", { }); -// force - /** * @name Phaser.Physics.Body#inertia * @property {number} inertia - The inertia of the body around the Z axis.. @@ -667,8 +828,6 @@ Object.defineProperty(Phaser.Physics.Body.prototype, "sleepSpeedLimit", { }); -// velocity - /** * @name Phaser.Physics.Body#x * @property {number} x - The x coordinate of this Body. @@ -708,39 +867,3 @@ Object.defineProperty(Phaser.Physics.Body.prototype, "y", { } }); - -Object.defineProperties(Phaser.Physics.Body.prototype, { - - "bob": { - - get: function () { - - return { x: 1, y: 2 }; - - }, - - set: function (value) { - - console.log(arguments); - - } - - }, - - "ben": { - - get: function () { - - return { x: 4, y: 5 }; - - }, - - set: function (value) { - - console.log(arguments); - - } - - } - -}); diff --git a/src/physics/PointProxy.js b/src/physics/PointProxy.js new file mode 100644 index 00000000..57b43083 --- /dev/null +++ b/src/physics/PointProxy.js @@ -0,0 +1,61 @@ +/** +* @author Richard Davey +* @copyright 2014 Photon Storm Ltd. +* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License} +*/ + +/** +* A PointProxy is an internal class that allows for direct getter/setter style property access to Arrays and TypedArrays. +* +* @class Phaser.Physics.PointProxy +* @classdesc PointProxy +* @constructor +* @param {any} destination - The object to bind to. +*/ +Phaser.Physics.PointProxy = function (destination) { + + this.destination = destination; + +}; + +Phaser.Physics.PointProxy.prototype.constructor = Phaser.Physics.PointProxy; + +/** +* @name Phaser.Physics.PointProxy#x +* @property {number} x - The x property of this PointProxy. +*/ +Object.defineProperty(Phaser.Physics.PointProxy.prototype, "x", { + + get: function () { + + return this.destination[0]; + + }, + + set: function (value) { + + this.destination[0] = value; + + } + +}); + +/** +* @name Phaser.Physics.PointProxy#y +* @property {number} y - The y property of this PointProxy. +*/ +Object.defineProperty(Phaser.Physics.PointProxy.prototype, "y", { + + get: function () { + + return this.destination[1]; + + }, + + set: function (value) { + + this.destination[1] = value; + + } + +}); diff --git a/src/physics/World.js b/src/physics/World.js index a710c4cd..07cc5c7b 100644 --- a/src/physics/World.js +++ b/src/physics/World.js @@ -22,7 +22,7 @@ Phaser.Physics.World = function (game) { */ this.game = game; - p2.World.call(this); + p2.World.call(this, { gravity: [0, 0] }); };