collisions()

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