UNPKG

2d-physics-engine

Version:

A lightweight, flexible 2D physics engine with ECS architecture, built with TypeScript

46 lines 1.94 kB
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