From 558e91a4420bb52e9b8dad624cff3859ec64ea43 Mon Sep 17 00:00:00 2001 From: Logan Hunt Date: Tue, 5 Apr 2022 19:45:09 -0600 Subject: Added collision system, added changedId's which doesn't do anything rn --- src/systems/collision.js | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/systems/collision.js (limited to 'src/systems/collision.js') diff --git a/src/systems/collision.js b/src/systems/collision.js new file mode 100644 index 0000000..7739bae --- /dev/null +++ b/src/systems/collision.js @@ -0,0 +1,49 @@ +game.system.Collision = (entitiesGrid) => { + const update = (elapsedTime, entities, changedIds) => { + for (let entity of Object.keys(entities).map((id) => entities[id])) { + if (entity.hasComponent("controllable") && entity.hasComponent("gridPosition") && entity.hasComponent("momentum")) { + const momentum = unitize(entity.components.momentum); + + let found; + const proposed = {x: entity.components.gridPosition.x + momentum.dx, y: entity.components.gridPosition.y + momentum.dy}; + const entitiesToPush = []; + let wall = false; + do { + const proposedClampedInBounds = clamp(proposed, game.config.xDim-1, game.config.yDim-1); + if (!equivalence(proposed, proposedClampedInBounds)) { + break; + } + + found = false; + + const entitiesInCell = entitiesGrid[proposed.y][proposed.x]; + + for (let next of entitiesInCell.values()) { + if (next.hasComponent("stop")) { + console.log("WALL FOUND") + wall = next; + found = false; + break; + } + if (next.hasComponent("pushable")) { + entitiesToPush.push(next); + found = true; + } + } + + proposed.x += momentum.dx; + proposed.y += momentum.dy; + } while(found); + + if (wall) { + console.log("WALL") + entity.removeComponent("momentum"); + } else { + entitiesToPush.map((e) => e.addComponent(game.components.Momentum({...momentum}))); + } + } + } + return new Set(); + }; + return { update }; +}; -- cgit v1.2.3-70-g09d2