Skip to content

Commit 82c32bc

Browse files
Fix map zoom
1 parent defe796 commit 82c32bc

1 file changed

Lines changed: 20 additions & 9 deletions

File tree

islanders-client/src/lib/components/Map.svelte

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
let lastPointerPosition = { x: 0, y: 0 };
106106
let pointerDownPosition = { x: 0, y: 0 };
107107
let hasDragged = false;
108+
const wheelPointerPosition = new Point();
108109
109110
let isBuilding: BuildingType = 'None';
110111
let isMovingThief = false;
@@ -554,23 +555,33 @@
554555
555556
// Zoom handler
556557
wheelHandler = (event: WheelEvent) => {
558+
if (!app) {
559+
return;
560+
}
557561
event.preventDefault();
558562
const delta = -event.deltaY;
559-
const zoomFactor = delta > 0 ? 1.1 : 0.9;
560-
const newScale = scale * zoomFactor;
563+
const zoomIntensity = 0.0005;
564+
const zoomFactor = Math.exp(delta * zoomIntensity);
565+
const minScale = 0.1;
566+
const maxScale = 5;
567+
const targetScale = scale * zoomFactor;
568+
const newScale = Math.min(maxScale, Math.max(minScale, targetScale));
561569
562570
// Limit zoom levels
563-
if (newScale >= 0.1 && newScale <= 5) {
564-
const mouseX = event.clientX;
565-
const mouseY = event.clientY;
571+
if (newScale !== scale) {
572+
app.renderer.events.mapPositionToPoint(
573+
wheelPointerPosition,
574+
event.clientX,
575+
event.clientY
576+
);
577+
const mouseX = wheelPointerPosition.x;
578+
const mouseY = wheelPointerPosition.y;
566579
567580
// Zoom towards mouse position
568581
const worldPosBefore = toWorld({ x: mouseX, y: mouseY });
569582
scale = newScale;
570-
const worldPosAfter = toWorld({ x: mouseX, y: mouseY });
571-
572-
panX += (worldPosAfter.x - worldPosBefore.x) * scale;
573-
panY += (worldPosAfter.y - worldPosBefore.y) * scale;
583+
panX = mouseX - worldPosBefore.x * scale;
584+
panY = mouseY - worldPosBefore.y * scale;
574585
575586
updateWorldTransform();
576587
}

0 commit comments

Comments
 (0)