diff --git a/src/components/sprites/Character.vue b/src/components/sprites/Character.vue
index 9f50363..6754e7b 100644
--- a/src/components/sprites/Character.vue
+++ b/src/components/sprites/Character.vue
@@ -1,7 +1,7 @@
-
-
+
+
-
+
diff --git a/src/components/utilities/Controls.vue b/src/components/utilities/Controls.vue
index fab14f7..b605c2e 100644
--- a/src/components/utilities/Controls.vue
+++ b/src/components/utilities/Controls.vue
@@ -11,9 +11,11 @@ import { getTile, tileToWorldXY } from '@/services/zone'
import { useZoneEditorStore } from '@/stores/zoneEditor'
import { useGameStore } from '@/stores/game'
-const props = defineProps<{
+interface Props {
layer: Phaser.Tilemaps.TilemapLayer
-}>()
+}
+
+const props = defineProps()
const scene = useScene()
const zoneEditorStore = useZoneEditorStore()
@@ -27,10 +29,16 @@ const waypoint = ref({
})
const cam = ref(scene.cameras.main)
+const isDragging = ref(false)
+let pointerDownTimer: number | null = null
+let pointerUpTimer: number | null = null
+
+const DRAG_DELAY = 150
+const MOVE_RESET_DELAY = 100
function updateWaypoint(pointer: Phaser.Input.Pointer) {
const { x: px, y: py } = scene.cameras.main.getWorldPoint(pointer.x, pointer.y)
- const pointerTile = getTile(px, py, props.layer) as Phaser.Tilemaps.Tile
+ const pointerTile = getTile(px, py, props.layer)
if (!pointerTile) {
waypoint.value.visible = false
@@ -46,42 +54,68 @@ function updateWaypoint(pointer: Phaser.Input.Pointer) {
}
function dragZone(pointer: Phaser.Input.Pointer) {
- if (!pointer.isDown) return
+ if (!isDragging.value) return
const { x, y, prevPosition } = pointer
cam.value.scrollX -= (x - prevPosition.x) / cam.value.zoom
cam.value.scrollY -= (y - prevPosition.y) / cam.value.zoom
}
-function handleZoom(pointer: Phaser.Input.Pointer, _: any, __: any, deltaY: number) {
- if (pointer.event.altKey) {
+function handleZoom(pointer: Phaser.Input.Pointer, _: unknown, __: unknown, deltaY: number) {
+ if (pointer.event instanceof WheelEvent && pointer.event.altKey) {
scene.scale.setZoom(scene.scale.zoom - deltaY * 0.01)
cam.value = scene.cameras.main
}
}
+function onPointerDown(pointer: Phaser.Input.Pointer) {
+ if (pointer.event instanceof MouseEvent && (pointer.event.altKey || tool.value === 'move')) {
+ pointerDownTimer = setTimeout(() => {
+ isDragging.value = true
+ gameStore.setMovingCamera(true)
+ scene.input.on(Phaser.Input.Events.POINTER_MOVE, dragZone)
+ }, DRAG_DELAY)
+ }
+}
+
+function onPointerUp() {
+ if (pointerDownTimer) {
+ clearTimeout(pointerDownTimer)
+ pointerDownTimer = null
+ }
+ isDragging.value = false
+ scene.input.off(Phaser.Input.Events.POINTER_MOVE, dragZone)
+
+ if (pointerUpTimer) {
+ clearTimeout(pointerUpTimer)
+ }
+
+ pointerUpTimer = setTimeout(() => {
+ gameStore.setMovingCamera(false)
+ }, MOVE_RESET_DELAY)
+}
+
function setupEventListeners() {
scene.input.on(Phaser.Input.Events.POINTER_MOVE, updateWaypoint)
scene.input.on(Phaser.Input.Events.POINTER_WHEEL, handleZoom)
-
- scene.input.on(Phaser.Input.Events.POINTER_DOWN, (pointer: Phaser.Input.Pointer) => {
- if (pointer.event.altKey || tool.value === 'move') {
- gameStore.setMovingCamera(true)
- scene.input.on(Phaser.Input.Events.POINTER_MOVE, dragZone)
- }
- })
-
- scene.input.on(Phaser.Input.Events.POINTER_UP, () => {
- gameStore.setMovingCamera(false)
- scene.input.off(Phaser.Input.Events.POINTER_MOVE, dragZone)
- })
+ scene.input.on(Phaser.Input.Events.POINTER_DOWN, onPointerDown)
+ scene.input.on(Phaser.Input.Events.POINTER_UP, onPointerUp)
}
function cleanupEventListeners() {
scene.input.off(Phaser.Input.Events.POINTER_MOVE, updateWaypoint)
scene.input.off(Phaser.Input.Events.POINTER_MOVE, dragZone)
- scene.input.off(Phaser.Input.Events.POINTER_DOWN)
- scene.input.off(Phaser.Input.Events.POINTER_UP)
+ scene.input.off(Phaser.Input.Events.POINTER_DOWN, onPointerDown)
+ scene.input.off(Phaser.Input.Events.POINTER_UP, onPointerUp)
scene.input.off(Phaser.Input.Events.POINTER_WHEEL, handleZoom)
+
+ if (pointerDownTimer) {
+ clearTimeout(pointerDownTimer)
+ pointerDownTimer = null
+ }
+ if (pointerUpTimer) {
+ clearTimeout(pointerUpTimer)
+ pointerUpTimer = null
+ }
}
setupEventListeners()
diff --git a/src/stores/zoneEditor.ts b/src/stores/zoneEditor.ts
index 113c860..1b800a6 100644
--- a/src/stores/zoneEditor.ts
+++ b/src/stores/zoneEditor.ts
@@ -1,5 +1,5 @@
import { defineStore } from 'pinia'
-import { useGameStore } from '@/stores/game';
+import { useGameStore } from '@/stores/game'
import type { Zone, Object, Tile, ZoneObject } from '@/types'
export const useZoneEditorStore = defineStore('zoneEditor', {
@@ -63,9 +63,9 @@ export const useZoneEditorStore = defineStore('zoneEditor', {
this.selectedObject = object
},
setSelectedZoneObject(zoneObject: ZoneObject) {
- const gameStore = useGameStore(); // Access the gameStore
- if (gameStore.isMovingCamera) return; // Step 2: Check isMovingCamera before proceeding
-
+ const gameStore = useGameStore() // Access the gameStore
+ if (gameStore.isMovingCamera) return // Step 2: Check isMovingCamera before proceeding
+
this.selectedZoneObject = zoneObject
},
setObjectDepth(depth: number) {