diff --git a/src/components/game/gui/Minimap.vue b/src/components/game/gui/Minimap.vue index d3cefb4..35c8ecd 100644 --- a/src/components/game/gui/Minimap.vue +++ b/src/components/game/gui/Minimap.vue @@ -5,12 +5,12 @@
diff --git a/src/components/game/map/Map.vue b/src/components/game/map/Map.vue index a9a6df7..fb95343 100644 --- a/src/components/game/map/Map.vue +++ b/src/components/game/map/Map.vue @@ -34,6 +34,12 @@ gameStore.connection?.on('map:character:leave', (characterId: UUID) => { gameStore.connection?.on('map:character:move', (data: { characterId: UUID; positionX: number; positionY: number; rotation: number; isMoving: boolean }) => { mapStore.updateCharacterPosition(data) + // @TODO: Replace with universal class, composable or store + if (data.characterId === gameStore.character?.id) { + gameStore.character!.positionX = data.positionX + gameStore.character!.positionY = data.positionY + gameStore.character!.rotation = data.rotation + } }) onUnmounted(() => { diff --git a/src/components/gameMaster/assetManager/partials/sprite/SpriteDetails.vue b/src/components/gameMaster/assetManager/partials/sprite/SpriteDetails.vue index 705af93..bffd251 100644 --- a/src/components/gameMaster/assetManager/partials/sprite/SpriteDetails.vue +++ b/src/components/gameMaster/assetManager/partials/sprite/SpriteDetails.vue @@ -48,23 +48,20 @@
- +
- @@ -199,9 +196,9 @@ function updateFrameRate(value: number) { } } -const tempOffsetData = ref<{ index: number | undefined; offset: { x: number; y: number } | undefined }>({ - index: undefined, - offset: undefined +const tempOffsetData = ref<{ index: number | undefined; offset: { x: number; y: number } | undefined }>({ + index: undefined, + offset: undefined }) function handleTempOffsetChange(action: SpriteAction, index: number, offset: { x: number; y: number }) { diff --git a/src/components/gameMaster/assetManager/partials/sprite/partials/SpriteImagesInput.vue b/src/components/gameMaster/assetManager/partials/sprite/partials/SpriteImagesInput.vue index 96b6061..00d047c 100644 --- a/src/components/gameMaster/assetManager/partials/sprite/partials/SpriteImagesInput.vue +++ b/src/components/gameMaster/assetManager/partials/sprite/partials/SpriteImagesInput.vue @@ -2,9 +2,7 @@
Uploaded image -
- {{ image.dimensions.width }}x{{ image.dimensions.height }} -
+
{{ image.dimensions.width }}x{{ image.dimensions.height }}
- +
@@ -69,7 +61,7 @@ const props = defineProps<{ frameRate: number isModalOpen?: boolean tempOffsetIndex?: number - tempOffset?: { x: number, y: number } + tempOffset?: { x: number; y: number } }>() const emit = defineEmits<{ diff --git a/src/components/gameMaster/mapEditor/partials/TileList.vue b/src/components/gameMaster/mapEditor/partials/TileList.vue index 0183035..7386666 100644 --- a/src/components/gameMaster/mapEditor/partials/TileList.vue +++ b/src/components/gameMaster/mapEditor/partials/TileList.vue @@ -31,14 +31,14 @@ @click="openGroup(group)" @load="() => processTile(group.parent)" :class="{ - 'border-cyan shadow-lg': isActiveTile(group.parent), - 'border-transparent hover:border-gray-300': !isActiveTile(group.parent) - }" + 'border-cyan shadow-lg': isActiveTile(group.parent), + 'border-transparent hover:border-gray-300': !isActiveTile(group.parent) + }" /> {{ getTileCategory(group.parent) }} - {{ group.children.length + 1 }} - + {{ group.children.length + 1 }} +
@@ -56,9 +56,9 @@ :alt="selectedGroup.parent.name" @click="selectTile(selectedGroup.parent.id)" :class="{ - 'border-cyan shadow-lg': isActiveTile(selectedGroup.parent), - 'border-transparent hover:border-gray-300': !isActiveTile(selectedGroup.parent) - }" + 'border-cyan shadow-lg': isActiveTile(selectedGroup.parent), + 'border-transparent hover:border-gray-300': !isActiveTile(selectedGroup.parent) + }" /> {{ getTileCategory(selectedGroup.parent) }} @@ -69,9 +69,9 @@ :alt="childTile.name" @click="selectTile(childTile.id)" :class="{ - 'border-cyan shadow-lg': isActiveTile(childTile), - 'border-transparent hover:border-gray-300': !isActiveTile(childTile) - }" + 'border-cyan shadow-lg': isActiveTile(childTile), + 'border-transparent hover:border-gray-300': !isActiveTile(childTile) + }" /> {{ getTileCategory(childTile) }} diff --git a/src/components/screens/MapEditor.vue b/src/components/screens/MapEditor.vue index 1599663..1c1eaac 100644 --- a/src/components/screens/MapEditor.vue +++ b/src/components/screens/MapEditor.vue @@ -19,7 +19,7 @@ /> - + diff --git a/src/composables/controls/useBaseControlsComposable.ts b/src/composables/controls/useBaseControlsComposable.ts index 5651152..dce4312 100644 --- a/src/composables/controls/useBaseControlsComposable.ts +++ b/src/composables/controls/useBaseControlsComposable.ts @@ -32,8 +32,8 @@ export function useBaseControlsComposable(scene: Phaser.Scene, layer: Phaser.Til if (Math.abs(deltaX) <= dragThreshold && Math.abs(deltaY) <= dragThreshold) return - const scrollX = camera.scrollX - (deltaX / camera.zoom) - const scrollY = camera.scrollY - (deltaY / camera.zoom) + const scrollX = camera.scrollX - deltaX / camera.zoom + const scrollY = camera.scrollY - deltaY / camera.zoom camera.setScroll(scrollX, scrollY) pointerStartPosition.value = { x: pointer.x, y: pointer.y } @@ -66,4 +66,4 @@ export function useBaseControlsComposable(scene: Phaser.Scene, layer: Phaser.Til handleZoom, pointerStartPosition } -} \ No newline at end of file +} diff --git a/src/composables/controls/useGameControlsComposable.ts b/src/composables/controls/useGameControlsComposable.ts index 79e26d3..6fff96f 100644 --- a/src/composables/controls/useGameControlsComposable.ts +++ b/src/composables/controls/useGameControlsComposable.ts @@ -1,7 +1,7 @@ import { getTile } from '@/composables/mapComposable' import { useGameStore } from '@/stores/gameStore' -import { useBaseControlsComposable } from './useBaseControlsComposable' import type { Ref } from 'vue' +import { useBaseControlsComposable } from './useBaseControlsComposable' export function useGameControlsComposable(scene: Phaser.Scene, layer: Phaser.Tilemaps.TilemapLayer, waypoint: Ref<{ visible: boolean; x: number; y: number }>, camera: Phaser.Cameras.Scene2D.Camera) { const gameStore = useGameStore() @@ -28,11 +28,70 @@ export function useGameControlsComposable(scene: Phaser.Scene, layer: Phaser.Til }) } + const pressedKeys = new Set() + let moveInterval: number | null = null + + function handleKeyDown(event: KeyboardEvent) { + if (!gameStore.character) return + + if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(event.key)) { + pressedKeys.add(event.key) + + // Start movement loop if not already running + if (!moveInterval) { + moveInterval = window.setInterval(moveCharacter, 250) // Adjust timing as needed + moveCharacter() // Move immediately on first press + } + } + } + + function handleKeyUp(event: KeyboardEvent) { + pressedKeys.delete(event.key) + + // If no movement keys are pressed, clear the interval + if (pressedKeys.size === 0 && moveInterval) { + clearInterval(moveInterval) + moveInterval = null + } + } + + function moveCharacter() { + if (!gameStore.character) return + const { positionX, positionY } = gameStore.character + + if (pressedKeys.has('ArrowLeft')) { + gameStore.connection?.emit('map:character:move', { + positionX: positionX - 1, + positionY: positionY + }) + } + if (pressedKeys.has('ArrowRight')) { + gameStore.connection?.emit('map:character:move', { + positionX: positionX + 1, + positionY: positionY + }) + } + if (pressedKeys.has('ArrowUp')) { + gameStore.connection?.emit('map:character:move', { + positionX: positionX, + positionY: positionY - 1 + }) + } + if (pressedKeys.has('ArrowDown')) { + gameStore.connection?.emit('map:character:move', { + positionX: positionX, + positionY: positionY + 1 + }) + } + } + const setupControls = () => { scene.input.on(Phaser.Input.Events.POINTER_DOWN, handlePointerDown) scene.input.on(Phaser.Input.Events.POINTER_MOVE, handlePointerMove) scene.input.on(Phaser.Input.Events.POINTER_UP, handlePointerUp) scene.input.on(Phaser.Input.Events.POINTER_WHEEL, baseHandlers.handleZoom) + scene.input.keyboard!.on('keydown', handleKeyDown) + scene.input.keyboard!.on('keyup', handleKeyUp) } const cleanupControls = () => { @@ -40,6 +99,8 @@ export function useGameControlsComposable(scene: Phaser.Scene, layer: Phaser.Til scene.input.off(Phaser.Input.Events.POINTER_MOVE, handlePointerMove) scene.input.off(Phaser.Input.Events.POINTER_UP, handlePointerUp) scene.input.off(Phaser.Input.Events.POINTER_WHEEL, baseHandlers.handleZoom) + scene.input.keyboard!.off('keydown', handleKeyDown) + scene.input.keyboard!.off('keyup', handleKeyUp) } return { setupControls, cleanupControls } diff --git a/src/composables/controls/useMapEditorControlsComposable.ts b/src/composables/controls/useMapEditorControlsComposable.ts index 8c3afa4..c0db832 100644 --- a/src/composables/controls/useMapEditorControlsComposable.ts +++ b/src/composables/controls/useMapEditorControlsComposable.ts @@ -1,6 +1,6 @@ import { useMapEditorComposable } from '@/composables/useMapEditorComposable' -import { useBaseControlsComposable } from './useBaseControlsComposable' import { computed, type Ref } from 'vue' +import { useBaseControlsComposable } from './useBaseControlsComposable' export function useMapEditorControlsComposable(scene: Phaser.Scene, layer: Phaser.Tilemaps.TilemapLayer, waypoint: Ref<{ visible: boolean; x: number; y: number }>, camera: Phaser.Cameras.Scene2D.Camera) { const mapEditor = useMapEditorComposable() diff --git a/src/composables/useControlsComposable.ts b/src/composables/useControlsComposable.ts index 92cab72..2ce48fb 100644 --- a/src/composables/useControlsComposable.ts +++ b/src/composables/useControlsComposable.ts @@ -1,15 +1,14 @@ -import { useMapEditorComposable } from '@/composables/useMapEditorComposable' -import { computed, watch, type Ref } from 'vue' import { useGameControlsComposable } from '@/composables/controls/useGameControlsComposable' import { useMapEditorControlsComposable } from '@/composables/controls/useMapEditorControlsComposable' -import { useGameStore } from '@/stores/gameStore' +import { useMapEditorComposable } from '@/composables/useMapEditorComposable' +import { computed, type Ref } from 'vue' export function useControlsComposable(scene: Phaser.Scene, layer: Phaser.Tilemaps.TilemapLayer, waypoint: Ref<{ visible: boolean; x: number; y: number }>) { const camera = scene.cameras.main - const mapEditor = useMapEditorComposable() const gameHandlers = useGameControlsComposable(scene, layer, waypoint, camera) const mapEditorHandlers = useMapEditorControlsComposable(scene, layer, waypoint, camera) + const mapEditor = useMapEditorComposable() const currentHandlers = computed(() => (mapEditor.active.value ? mapEditorHandlers : gameHandlers)) const setupControls = () => currentHandlers.value.setupControls()