From c148bc2456c08abe65c50d4b8b8525085a1485ea Mon Sep 17 00:00:00 2001 From: cha0s Date: Sat, 4 May 2019 13:31:16 -0500 Subject: [PATCH] fix: physics apply stepTime as impulse --- packages/entity/traits/mobile.trait.js | 2 +- packages/physics/abstract/body.js | 3 ++- packages/physics/abstract/world.js | 1 + packages/physics/dummy/body.js | 8 ++++---- packages/physics/dummy/world.js | 2 +- packages/physics/matter/body.js | 8 ++++---- packages/physics/matter/world.js | 2 +- packages/physics/traits/physical.trait.js | 4 ++-- 8 files changed, 16 insertions(+), 14 deletions(-) diff --git a/packages/entity/traits/mobile.trait.js b/packages/entity/traits/mobile.trait.js index 568a568..d4e34a3 100644 --- a/packages/entity/traits/mobile.trait.js +++ b/packages/entity/traits/mobile.trait.js @@ -62,7 +62,7 @@ class MobileBase extends Trait { return; } if (this.entity.is('physical')) { - this.entity.applyImpulse(this.requestedMovement, elapsed); + this.entity.applyImpulse(this.requestedMovement); } else { const requestedMovement = Vector.scale( diff --git a/packages/physics/abstract/body.js b/packages/physics/abstract/body.js index 47ee177..9460b80 100644 --- a/packages/physics/abstract/body.js +++ b/packages/physics/abstract/body.js @@ -10,9 +10,10 @@ const decorate = compose( export class AbstractBody extends decorate(class {}) { - constructor(shape) { + constructor(world, shape) { super(); this.shape = shape; + this.world = world; } } diff --git a/packages/physics/abstract/world.js b/packages/physics/abstract/world.js index ff32211..43fef62 100644 --- a/packages/physics/abstract/world.js +++ b/packages/physics/abstract/world.js @@ -34,6 +34,7 @@ export class AbstractWorld extends decorate(class {}) { this.entitiesList.splice(index, 1); } } + body.world = null; } tick(elapsed) { diff --git a/packages/physics/dummy/body.js b/packages/physics/dummy/body.js index 3e1ef53..ce895c6 100644 --- a/packages/physics/dummy/body.js +++ b/packages/physics/dummy/body.js @@ -15,8 +15,8 @@ const decorate = compose( export class Body extends decorate(AbstractBody) { - constructor(shape) { - super(shape); + constructor(world, shape) { + super(world, shape); this.force = [0, 0]; this.impulse = [0, 0]; this.contacts = I.Set(); @@ -30,10 +30,10 @@ export class Body extends decorate(AbstractBody) { this.force = Vector.add(this.force, vector); } - applyImpulse(vector, elapsed) { + applyImpulse(vector) { this.impulse = Vector.add( this.impulse, - Vector.scale(vector, elapsed) + Vector.scale(vector, this.world.stepTime) ); } diff --git a/packages/physics/dummy/world.js b/packages/physics/dummy/world.js index 026c418..9091d69 100644 --- a/packages/physics/dummy/world.js +++ b/packages/physics/dummy/world.js @@ -37,7 +37,7 @@ export class World extends AbstractWorld { } createBody(shape) { - return new Body(shape); + return new Body(this, shape); } removeBody(body) { diff --git a/packages/physics/matter/body.js b/packages/physics/matter/body.js index c541d67..3186729 100644 --- a/packages/physics/matter/body.js +++ b/packages/physics/matter/body.js @@ -47,8 +47,8 @@ export class Body extends AbstractBody { this.bodies.set(matterBody, avocadoBody); } - constructor(shape) { - super(shape); + constructor(world, shape) { + super(world, shape); const [body, position, origin] = this.constructor.bodyFromShape(shape); // Set body first, then origin, then position. Order important. this.matterBody = body; @@ -73,9 +73,9 @@ export class Body extends AbstractBody { MatterBody.applyForce(this.matterBody, this.matterBody.position, {x, y}); } - applyImpulse(impulse, elapsed) { + applyImpulse(impulse) { impulse = Vector.scale(impulse, 1 / SCALE); - impulse = Vector.scale(impulse, elapsed); + impulse = Vector.scale(impulse, this.world.stepTime); const [x, y] = impulse; MatterBody.translate(this.matterBody, {x, y}); } diff --git a/packages/physics/matter/world.js b/packages/physics/matter/world.js index 8ca1779..048178e 100644 --- a/packages/physics/matter/world.js +++ b/packages/physics/matter/world.js @@ -27,7 +27,7 @@ export class World extends AbstractWorld { } createBody(shape) { - return new Body(shape); + return new Body(this, shape); } handleCollisions(eventName) { diff --git a/packages/physics/traits/physical.trait.js b/packages/physics/traits/physical.trait.js index 97baed7..1a234ec 100644 --- a/packages/physics/traits/physical.trait.js +++ b/packages/physics/traits/physical.trait.js @@ -115,9 +115,9 @@ export class Physical extends decorate(Trait) { } }, - applyImpulse: (impulse, elapsed) => { + applyImpulse: (impulse) => { if (this._world && this._body) { - this._body.applyImpulse(impulse, elapsed); + this._body.applyImpulse(impulse); } },