in libs/game/physics.ts [75:120]
collisions() {
// 1: clear obstacles
for (let i = 0; i < this.sprites.length; ++i)
this.sprites[i].clearObstacles();
// 2: refresh non-ghost collision map
const colliders = this.sprites.filter(sprite => !(sprite.flags & sprites.Flag.Ghost));
if (colliders.length < 10) {
// not enough sprite, just brute force it
this.map = undefined;
} else {
if (!this.map) this.map = new sprites.SpriteMap();
this.map.update(colliders);
}
// 3: go through sprite and handle collisions
const scene = game.currentScene();
const tm = scene.tileMap;
for (const sprite of colliders) {
const overSprites = scene.physicsEngine.overlaps(sprite);
for (const overlapper of overSprites) {
// overlap handler
const tmpsprite = sprite;
const tmp = overlapper;
const oh = sprite.overlapHandler;
if (oh)
control.runInParallel(() => oh(tmp))
scene.overlapHandlers
.filter(h => h.type == sprite.type && h.otherType == overlapper.type)
.forEach(h => control.runInParallel(() => h.handler(tmpsprite, tmp)));
}
const xDiff = sprite.x - sprite._lastX;
const yDiff = sprite.y - sprite._lastY;
if ((xDiff !== 0 || yDiff !== 0) && Math.abs(xDiff) < MAX_DISTANCE && Math.abs(yDiff) < MAX_DISTANCE) {
// Undo the move
sprite.x = sprite._lastX;
sprite.y = sprite._lastY;
// Now move it with the tilemap in mind
this.moveSprite(sprite, tm, xDiff, yDiff);
}
}
}