50 lines
1.6 KiB
JavaScript
Raw Normal View History

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 };
};