From b5130169bd45a58b5221a2b0aabb843eca5d9cf0 Mon Sep 17 00:00:00 2001 From: tekki mariani Date: Fri, 20 Mar 2026 19:39:15 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix=20zoom:=20center=20world=20p?= =?UTF-8?q?oint=20under=20mouse,=20then=20zoom=20to=20center?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/systems/CameraSystem.ts | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/systems/CameraSystem.ts b/src/systems/CameraSystem.ts index 2b765c9..3c079f8 100644 --- a/src/systems/CameraSystem.ts +++ b/src/systems/CameraSystem.ts @@ -52,22 +52,16 @@ export class CameraSystem { d: kb.addKey(Phaser.Input.Keyboard.KeyCodes.D), } - // Scroll wheel zoom — zoom toward mouse pointer position + // Scroll wheel zoom — centers the world point under the mouse, then zooms this.scene.input.on('wheel', (ptr: Phaser.Input.Pointer, _objs: unknown, _dx: number, dy: number) => { const newZoom = Phaser.Math.Clamp(cam.zoom - Math.sign(dy) * ZOOM_STEP, MIN_ZOOM, MAX_ZOOM) if (newZoom === cam.zoom) return - // Sample the world point under the mouse BEFORE the zoom change - const before = cam.getWorldPoint(ptr.x, ptr.y) - + // Move the world point under the mouse to the viewport center, then zoom toward it + const wp = cam.getWorldPoint(ptr.x, ptr.y) + cam.scrollX = wp.x - cam.width / (2 * newZoom) + cam.scrollY = wp.y - cam.height / (2 * newZoom) cam.setZoom(newZoom) - - // Sample the same screen position AFTER zoom — it now maps to a different world point - const after = cam.getWorldPoint(ptr.x, ptr.y) - - // Shift scroll by the difference so the original world point snaps back under the mouse - cam.scrollX -= after.x - before.x - cam.scrollY -= after.y - before.y }) // Middle-click pan: start on button down