|
105 | 105 | let lastPointerPosition = { x: 0, y: 0 }; |
106 | 106 | let pointerDownPosition = { x: 0, y: 0 }; |
107 | 107 | let hasDragged = false; |
| 108 | + const wheelPointerPosition = new Point(); |
108 | 109 |
|
109 | 110 | let isBuilding: BuildingType = 'None'; |
110 | 111 | let isMovingThief = false; |
|
554 | 555 |
|
555 | 556 | // Zoom handler |
556 | 557 | wheelHandler = (event: WheelEvent) => { |
| 558 | + if (!app) { |
| 559 | + return; |
| 560 | + } |
557 | 561 | event.preventDefault(); |
558 | 562 | 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)); |
561 | 569 |
|
562 | 570 | // 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; |
566 | 579 |
|
567 | 580 | // Zoom towards mouse position |
568 | 581 | const worldPosBefore = toWorld({ x: mouseX, y: mouseY }); |
569 | 582 | 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; |
574 | 585 |
|
575 | 586 | updateWorldTransform(); |
576 | 587 | } |
|
0 commit comments