fix: physics apply stepTime as impulse
This commit is contained in:
parent
dc3eeb4e7d
commit
c148bc2456
|
@ -62,7 +62,7 @@ class MobileBase extends Trait {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (this.entity.is('physical')) {
|
if (this.entity.is('physical')) {
|
||||||
this.entity.applyImpulse(this.requestedMovement, elapsed);
|
this.entity.applyImpulse(this.requestedMovement);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const requestedMovement = Vector.scale(
|
const requestedMovement = Vector.scale(
|
||||||
|
|
|
@ -10,9 +10,10 @@ const decorate = compose(
|
||||||
|
|
||||||
export class AbstractBody extends decorate(class {}) {
|
export class AbstractBody extends decorate(class {}) {
|
||||||
|
|
||||||
constructor(shape) {
|
constructor(world, shape) {
|
||||||
super();
|
super();
|
||||||
this.shape = shape;
|
this.shape = shape;
|
||||||
|
this.world = world;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ export class AbstractWorld extends decorate(class {}) {
|
||||||
this.entitiesList.splice(index, 1);
|
this.entitiesList.splice(index, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
body.world = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
tick(elapsed) {
|
tick(elapsed) {
|
||||||
|
|
|
@ -15,8 +15,8 @@ const decorate = compose(
|
||||||
|
|
||||||
export class Body extends decorate(AbstractBody) {
|
export class Body extends decorate(AbstractBody) {
|
||||||
|
|
||||||
constructor(shape) {
|
constructor(world, shape) {
|
||||||
super(shape);
|
super(world, shape);
|
||||||
this.force = [0, 0];
|
this.force = [0, 0];
|
||||||
this.impulse = [0, 0];
|
this.impulse = [0, 0];
|
||||||
this.contacts = I.Set();
|
this.contacts = I.Set();
|
||||||
|
@ -30,10 +30,10 @@ export class Body extends decorate(AbstractBody) {
|
||||||
this.force = Vector.add(this.force, vector);
|
this.force = Vector.add(this.force, vector);
|
||||||
}
|
}
|
||||||
|
|
||||||
applyImpulse(vector, elapsed) {
|
applyImpulse(vector) {
|
||||||
this.impulse = Vector.add(
|
this.impulse = Vector.add(
|
||||||
this.impulse,
|
this.impulse,
|
||||||
Vector.scale(vector, elapsed)
|
Vector.scale(vector, this.world.stepTime)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ export class World extends AbstractWorld {
|
||||||
}
|
}
|
||||||
|
|
||||||
createBody(shape) {
|
createBody(shape) {
|
||||||
return new Body(shape);
|
return new Body(this, shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
removeBody(body) {
|
removeBody(body) {
|
||||||
|
|
|
@ -47,8 +47,8 @@ export class Body extends AbstractBody {
|
||||||
this.bodies.set(matterBody, avocadoBody);
|
this.bodies.set(matterBody, avocadoBody);
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(shape) {
|
constructor(world, shape) {
|
||||||
super(shape);
|
super(world, shape);
|
||||||
const [body, position, origin] = this.constructor.bodyFromShape(shape);
|
const [body, position, origin] = this.constructor.bodyFromShape(shape);
|
||||||
// Set body first, then origin, then position. Order important.
|
// Set body first, then origin, then position. Order important.
|
||||||
this.matterBody = body;
|
this.matterBody = body;
|
||||||
|
@ -73,9 +73,9 @@ export class Body extends AbstractBody {
|
||||||
MatterBody.applyForce(this.matterBody, this.matterBody.position, {x, y});
|
MatterBody.applyForce(this.matterBody, this.matterBody.position, {x, y});
|
||||||
}
|
}
|
||||||
|
|
||||||
applyImpulse(impulse, elapsed) {
|
applyImpulse(impulse) {
|
||||||
impulse = Vector.scale(impulse, 1 / SCALE);
|
impulse = Vector.scale(impulse, 1 / SCALE);
|
||||||
impulse = Vector.scale(impulse, elapsed);
|
impulse = Vector.scale(impulse, this.world.stepTime);
|
||||||
const [x, y] = impulse;
|
const [x, y] = impulse;
|
||||||
MatterBody.translate(this.matterBody, {x, y});
|
MatterBody.translate(this.matterBody, {x, y});
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ export class World extends AbstractWorld {
|
||||||
}
|
}
|
||||||
|
|
||||||
createBody(shape) {
|
createBody(shape) {
|
||||||
return new Body(shape);
|
return new Body(this, shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
handleCollisions(eventName) {
|
handleCollisions(eventName) {
|
||||||
|
|
|
@ -115,9 +115,9 @@ export class Physical extends decorate(Trait) {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
applyImpulse: (impulse, elapsed) => {
|
applyImpulse: (impulse) => {
|
||||||
if (this._world && this._body) {
|
if (this._world && this._body) {
|
||||||
this._body.applyImpulse(impulse, elapsed);
|
this._body.applyImpulse(impulse);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user