class PhysicsSystem { constructor() { this.gravity = new Vector2(0, 0); this.airResistance = 0.99; this.collisionIterations = 3; } update(entities, deltaTime) { entities.forEach(entity => { this.updateEntity(entity, deltaTime); }); for (let i = 0; i < this.collisionIterations; i++) { this.resolveCollisions(entities); } } updateEntity(entity, deltaTime) { if (!entity.velocity || !entity.position) return; entity.velocity = entity.velocity.add(this.gravity.multiply(deltaTime)); entity.velocity = entity.velocity.multiply(this.airResistance); entity.position = entity.position.add(entity.velocity.multiply(deltaTime)); } resolveCollisions(entities) { for (let i = 0; i < entities.length; i++) { for (let j = i + 1; j < entities.length; j++) { const entityA = entities[i]; const entityB = entities[j]; if (this.checkCollision(entityA, entityB)) { this.resolveCollision(entityA, entityB); } } } } checkCollision(entityA, entityB) { if (!entityA.radius || !entityB.radius) return false; const distance = entityA.position.distance(entityB.position); return distance < (entityA.radius + entityB.radius); } resolveCollision(entityA, entityB) { Physics.resolveCircleCollision(entityA, entityB); } applyForce(entity, force) { if (!entity.velocity) return; const acceleration = force.divide(entity.mass || 1); entity.velocity = entity.velocity.add(acceleration); } setGravity(gravity) { this.gravity = gravity; } setAirResistance(resistance) { this.airResistance = Math.max(0, Math.min(1, resistance)); } }