diff --git a/app/ecs/systems/colliders.js b/app/ecs/systems/colliders.js index 0485640..4c96a68 100644 --- a/app/ecs/systems/colliders.js +++ b/app/ecs/systems/colliders.js @@ -39,32 +39,31 @@ export default class Colliders extends System { } tick() { - const seen = {}; + const collisions = new Map(); + for (const entity of this.ecs.changed(['Position'])) { + this.updateHash(entity); + } for (const entity of this.ecs.changed(['Position'])) { - if (seen[entity.id]) { - continue; - } - seen[entity.id] = true; if (!entity.Collider) { continue; } - const {collidingWith: wasCollidingWith} = entity.Collider; - entity.Collider.collidingWith = {}; - this.updateHash(entity); + collisions.set(entity, new Set()); for (const other of this.within(entity.Collider.aabb)) { - if (seen[other.id]) { + if (entity === other) { continue; } - seen[other.id] = true; - if (!other.Collider) { + if (!collisions.has(other)) { + collisions.set(other, new Set()); + } + if (!other.Collider || collisions.get(other).has(entity)) { continue; } - delete other.Collider.collidingWith[entity.id]; const intersections = entity.Collider.isCollidingWith(other.Collider); if (intersections.length > 0) { - entity.Collider.collidingWith[other.id] = true; - other.Collider.collidingWith[entity.id] = true; - if (!wasCollidingWith[other.id]) { + collisions.get(entity).add(other); + if (!entity.Collider.collidingWith[other.id]) { + entity.Collider.collidingWith[other.id] = true; + other.Collider.collidingWith[entity.id] = true; if (entity.Collider.collisionStartScriptInstance) { const script = entity.Collider.collisionStartScriptInstance.clone(); script.context.intersections = intersections; @@ -117,22 +116,20 @@ export default class Colliders extends System { } } } - } - for (const otherId in wasCollidingWith) { - if (!entity.Collider.collidingWith[otherId]) { - const other = this.ecs.get(otherId); - if (!other || !other.Collider) { - continue; - } - if (entity.Collider.collisionEndScriptInstance) { - const script = entity.Collider.collisionEndScriptInstance.clone(); - script.context.other = other; - entity.Ticking.add(script.ticker()); - } - if (other.Collider.collisionEndScriptInstance) { - const script = other.Collider.collisionEndScriptInstance.clone(); - script.context.other = entity; - other.Ticking.add(script.ticker()); + else { + if (entity.Collider.collidingWith[other.id]) { + if (entity.Collider.collisionEndScriptInstance) { + const script = entity.Collider.collisionEndScriptInstance.clone(); + script.context.other = other; + entity.Ticking.add(script.ticker()); + } + if (other.Collider.collisionEndScriptInstance) { + const script = other.Collider.collisionEndScriptInstance.clone(); + script.context.other = entity; + other.Ticking.add(script.ticker()); + } + delete entity.Collider.collidingWith[other.id]; + delete other.Collider.collidingWith[entity.id]; } } }