2d-physics-engine
Version:
A lightweight, flexible 2D physics engine with ECS architecture, built with TypeScript
46 lines • 1.94 kB
JavaScript
import { CircleCollider } from '../../components/ColliderComponents/CircleCollider.component';
import { Vector2 } from '../../math/Vector2';
export class CollisionDetector {
constructor() {
Object.defineProperty(this, "collisionMatrix", {
enumerable: true,
configurable: true,
writable: true,
value: new Map()
});
// Register circle vs circle collision
this.registerCollisionDetector(CircleCollider.COLLIDER_ID, CircleCollider.COLLIDER_ID, this.circleVsCircleDetector);
}
registerCollisionDetector(typeA, typeB, detector) {
if (!this.collisionMatrix.has(typeA)) {
this.collisionMatrix.set(typeA, new Map());
}
this.collisionMatrix.get(typeA).set(typeB, detector);
}
detectCollision(transformA, transformB, colliderA, colliderB) {
const handlersForA = this.collisionMatrix.get(colliderA.colliderId);
if (!handlersForA)
return null;
const detector = handlersForA.get(colliderB.colliderId);
if (!detector)
return null;
return detector(transformA, transformB, colliderA, colliderB);
}
circleVsCircleDetector(transformA, transformB, colliderA, colliderB) {
const posA = transformA.getPosition();
const posB = transformB.getPosition();
const diff = posB.subtract(posA);
const distance = diff.getMagnitude();
const radiusSum = colliderA.getRadius() + colliderB.getRadius();
if (radiusSum >= distance) {
return {
// Handle perfectly overlapping circles
normal: distance === 0 ? new Vector2(1, 0) : diff.getNormal(),
penetration: radiusSum - distance,
point: posA.add(diff.getNormal().scale(colliderA.getRadius())),
};
}
return null;
}
}
//# sourceMappingURL=CollisionDetector.js.map