This commit is contained in:
schmelczerandras 2020-11-04 22:05:21 +01:00
commit 57d7009342
6 changed files with 204 additions and 251 deletions

View file

@ -1,12 +1,14 @@
import { BoundingBoxBase } from '../bounding-boxes/bounding-box-base';
import { BoundingBoxList } from './bounding-box-list';
import { BoundingBoxTree } from './bounding-box-tree';
import { Physical } from '../physicals/physical';
import { StaticPhysical } from '../physicals/static-physical';
import { DynamicPhysical } from '../physicals/dynamic-physical';
import { GeneratesPoints, generatesPoints } from '../../objects/generates-points';
import {
GeneratesPoints,
generatesPoints,
} from '../../objects/capabilities/generates-points';
import { timeDependent } from '../../objects/capabilities/time-dependent';
export class PhysicalContainer {
private isTreeInitialized = false;
@ -40,7 +42,7 @@ export class PhysicalContainer {
}
public stepObjects(deltaTime: number) {
this.objects.forEach((o) => o.step(deltaTime));
this.objects.forEach((o) => timeDependent(o) && o.step(deltaTime));
}
public resetRemoteCalls() {

View file

@ -1,9 +1,10 @@
import { vec2 } from 'gl-matrix';
import { exertsForce } from '../../objects/capabilities/exerts-force';
import { Physical } from '../physicals/physical';
export const forceAtPosition = (position: vec2, objects: Array<Physical>) =>
objects.reduce(
(sum: vec2, o: Physical) =>
!o.canMove ? vec2.add(sum, sum, o.getForce(position)) : sum,
exertsForce(o) ? vec2.add(sum, sum, o.getForce(position)) : sum,
vec2.create(),
);

View file

@ -1,7 +1,7 @@
import { vec2 } from 'gl-matrix';
import { Circle, GameObject, rotate90Deg } from 'shared';
import { CirclePhysical } from '../../objects/circle-physical';
import { reactsToCollision } from './reacts-to-collision';
import { reactsToCollision } from '../../objects/capabilities/reacts-to-collision';
import { evaluateSdf } from './evaluate-sdf';
import { Physical } from '../physicals/physical';
@ -11,10 +11,8 @@ export const moveCircle = (
possibleIntersectors: Array<Physical>,
ignoreCollision = false,
): {
realDelta: vec2;
hitSurface: boolean;
normal?: vec2;
tangent?: vec2;
hitObject?: GameObject;
} => {
const direction = vec2.clone(delta);
@ -78,16 +76,10 @@ export const moveCircle = (
]);
const normal = vec2.fromValues(dx, dy);
vec2.normalize(normal, normal);
const rotatedNormal = rotate90Deg(normal);
return {
realDelta: delta,
hitSurface: true,
normal,
hitObject: intersecting?.gameObject,
tangent:
vec2.dot(rotatedNormal, delta) < 0
? vec2.scale(rotatedNormal, rotatedNormal, -1)
: rotatedNormal,
};
}
@ -97,7 +89,6 @@ export const moveCircle = (
vec2.add(circle.center, circle.center, delta);
return {
realDelta: delta,
hitSurface: false,
};
};

View file

@ -1,8 +0,0 @@
import { GameObject } from 'shared';
export interface ReactsToCollision {
onCollision(other: GameObject): void;
}
export const reactsToCollision = (a: any): a is ReactsToCollision =>
a && 'onCollision' in a;

View file

@ -9,5 +9,4 @@ export interface PhysicalBase {
readonly gameObject: GameObject;
distance(target: vec2): number;
step(deltaTime: number): void;
}

View file

@ -1,10 +1,7 @@
import { PhysicalBase } from './physical-base';
import { ImmutableBoundingBox } from '../bounding-boxes/immutable-bounding-box';
import { vec2 } from 'gl-matrix';
export interface StaticPhysical extends PhysicalBase {
readonly canMove: false;
readonly boundingBox: ImmutableBoundingBox;
getForce(target: vec2): vec2;
}