refactor: better physics simulation
This commit is contained in:
parent
6be4668da5
commit
4fc201d392
|
@ -11,7 +11,7 @@ import CircleShape from '../shape/circle';
|
|||
import RectangleShape from '../shape/rectangle';
|
||||
|
||||
// Translate "real" coordinates to physics coordinates.
|
||||
const SCALE = 1;
|
||||
const SCALE = 1 / 12;
|
||||
|
||||
export default class Body extends AbstractBody {
|
||||
|
||||
|
@ -106,6 +106,10 @@ export default class Body extends AbstractBody {
|
|||
return this.filterCategories[group];
|
||||
}
|
||||
|
||||
set friction(friction) {
|
||||
MatterBody.set(this.matterBody, 'frictionAir', friction);
|
||||
}
|
||||
|
||||
static lookupBody(matterBody) {
|
||||
return this.bodies
|
||||
? this.bodies.get(matterBody)
|
||||
|
|
|
@ -76,8 +76,10 @@ export default class World extends AbstractWorld {
|
|||
const it = this.entities.entries();
|
||||
for (let value = it.next(); value.done !== true; value = it.next()) {
|
||||
const [body] = value.value;
|
||||
const [x, y] = Vector.scale(body.impulse, stepTime);
|
||||
MatterBody.translate(body.matterBody, {x, y});
|
||||
const [x, y] = Vector.scale(body.impulse, stepTime / (1 - body.matterBody.frictionAir));
|
||||
if (x || y) {
|
||||
MatterBody.setVelocity(body.matterBody, {x, y});
|
||||
}
|
||||
}
|
||||
Engine.update(this.engine, stepTimeInMs);
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
|
|
|
@ -1,9 +1,16 @@
|
|||
import {Vector} from '@avocado/math';
|
||||
import {Trait} from '@avocado/traits';
|
||||
import {StateProperty, Trait} from '@avocado/traits';
|
||||
import {compose} from '@latus/core';
|
||||
|
||||
import BodyView from '../body-view';
|
||||
|
||||
export default () => class Physical extends Trait {
|
||||
const decorate = compose(
|
||||
StateProperty('friction', {
|
||||
track: true,
|
||||
}),
|
||||
);
|
||||
|
||||
export default () => class Physical extends decorate(Trait) {
|
||||
|
||||
#body;
|
||||
|
||||
|
@ -15,6 +22,7 @@ export default () => class Physical extends Trait {
|
|||
const world = this.#world;
|
||||
if (world) {
|
||||
const body = world.createBody(this.entity.shape);
|
||||
body.friction = this.entity.friction;
|
||||
world.associateBodyWithEntity(body, this.entity);
|
||||
body.setCollisionForEntity(this.entity);
|
||||
world.addBody(body);
|
||||
|
@ -64,6 +72,12 @@ export default () => class Physical extends Trait {
|
|||
};
|
||||
}
|
||||
|
||||
static defaultState() {
|
||||
return {
|
||||
friction: 0.5,
|
||||
};
|
||||
}
|
||||
|
||||
static dependencies() {
|
||||
return [
|
||||
'Shaped',
|
||||
|
@ -86,10 +100,15 @@ export default () => class Physical extends Trait {
|
|||
this.removeFromWorld();
|
||||
},
|
||||
|
||||
frictionChanged: () => {
|
||||
if (this.#body) {
|
||||
this.#body.friction = this.entity.friction;
|
||||
}
|
||||
},
|
||||
|
||||
positionChanged: () => {
|
||||
if (this.#body) {
|
||||
const {position} = this.entity;
|
||||
this.#body.position = position;
|
||||
this.#body.position = this.entity.position;
|
||||
}
|
||||
},
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user