Hierarchical pointer handling logic

This commit is contained in:
Andrei 2025-01-26 21:21:24 -06:00
parent 9618e07bc6
commit 35f0dcca64
4 changed files with 37 additions and 41 deletions

View File

@ -11,16 +11,21 @@ import MapEventTiles from '@/components/gameMaster/mapEditor/mapPartials/MapEven
import MapTiles from '@/components/gameMaster/mapEditor/mapPartials/MapTiles.vue' import MapTiles from '@/components/gameMaster/mapEditor/mapPartials/MapTiles.vue'
import PlacedMapObjects from '@/components/gameMaster/mapEditor/mapPartials/PlacedMapObjects.vue' import PlacedMapObjects from '@/components/gameMaster/mapEditor/mapPartials/PlacedMapObjects.vue'
import { useMapEditorComposable } from '@/composables/useMapEditorComposable' import { useMapEditorComposable } from '@/composables/useMapEditorComposable'
import { onUnmounted, shallowRef, useTemplateRef} from 'vue' import { onMounted, onUnmounted, shallowRef, useTemplateRef } from 'vue'
import { useScene } from 'phavuer'
const tileMap = shallowRef<Phaser.Tilemaps.Tilemap>() const tileMap = shallowRef<Phaser.Tilemaps.Tilemap>()
const mapEditor = useMapEditorComposable() const mapEditor = useMapEditorComposable()
const scene = useScene()
const mapTiles = useTemplateRef('mapTiles') const mapTiles = useTemplateRef('mapTiles')
const mapObjects = useTemplateRef('mapObjects') const mapObjects = useTemplateRef('mapObjects')
const eventTiles = useTemplateRef('eventTiles') const eventTiles = useTemplateRef('eventTiles')
function handlePointer(pointer: Phaser.Input.Pointer) { function handlePointer(pointer: Phaser.Input.Pointer) {
if (!mapTiles.value || !mapObjects.value || !eventTiles.value) return
// Check if left mouse button is pressed // Check if left mouse button is pressed
if (!pointer.isDown) return if (!pointer.isDown) return
@ -28,20 +33,28 @@ function handlePointer(pointer: Phaser.Input.Pointer) {
if (pointer.event.shiftKey) return if (pointer.event.shiftKey) return
// Check if alt is pressed // Check if alt is pressed
if (!pointer.event.altKey) return if (pointer.event.altKey) return
// Check if draw mode is tile // Check if draw mode is tile
switch (mapEditor.drawMode.value) { switch (mapEditor.drawMode.value) {
case 'tile': case 'tile':
mapTiles.value?.handlePointer(pointer) mapTiles.value.handlePointer(pointer)
// case 'map_object': case 'object':
// mapObjects.value.handlePointer(pointer) mapObjects.value.handlePointer(pointer)
case 'event tile': case 'teleport':
eventTiles.value?.handlePointer(pointer) eventTiles.value.handlePointer(pointer)
} }
} }
onMounted(() => {
scene.input.on(Phaser.Input.Events.POINTER_MOVE, handlePointer)
scene.input.on(Phaser.Input.Events.POINTER_DOWN, handlePointer)
})
onUnmounted(() => { onUnmounted(() => {
scene.input.off(Phaser.Input.Events.POINTER_MOVE, handlePointer)
scene.input.off(Phaser.Input.Events.POINTER_DOWN, handlePointer)
mapEditor.reset() mapEditor.reset()
}) })
</script> </script>

View File

@ -9,9 +9,8 @@ import { getTile, tileToWorldX, tileToWorldY } from '@/composables/mapComposable
import { Image, useScene } from 'phavuer' import { Image, useScene } from 'phavuer'
import { type Map as MapT } from "@/application/types" import { type Map as MapT } from "@/application/types"
import { useMapEditorComposable } from '@/composables/useMapEditorComposable' import { useMapEditorComposable } from '@/composables/useMapEditorComposable'
import { onMounted, onUnmounted, shallowRef, watch } from 'vue' import { shallowRef} from 'vue'
const scene = useScene()
const mapEditor = useMapEditorComposable() const mapEditor = useMapEditorComposable()
defineExpose({handlePointer}) defineExpose({handlePointer})
@ -93,20 +92,8 @@ function handlePointer(pointer: Phaser.Input.Pointer) {
if (mapEditor.drawMode.value !== 'blocking tile' && mapEditor.drawMode.value !== 'teleport') return if (mapEditor.drawMode.value !== 'blocking tile' && mapEditor.drawMode.value !== 'teleport') return
switch (mapEditor.tool.value) { switch (mapEditor.tool.value) {
case 'pencil': pencil(pointer, map) case 'pencil': pencil(pointer, map) ; break
case 'eraser': erase(pointer, map) case 'eraser': erase(pointer, map) ; break
} }
} }
onMounted(() => {
scene.input.on(Phaser.Input.Events.POINTER_MOVE, handlePointer)
scene.input.on(Phaser.Input.Events.POINTER_DOWN, handlePointer)
})
onUnmounted(() => {
scene.input.off(Phaser.Input.Events.POINTER_MOVE, handlePointer)
scene.input.off(Phaser.Input.Events.POINTER_DOWN, handlePointer)
})
</script> </script>

View File

@ -64,8 +64,6 @@ function pencil(pointer: Phaser.Input.Pointer) {
// Check if there is a selected tile // Check if there is a selected tile
if (!mapEditor.selectedTile.value) return if (!mapEditor.selectedTile.value) return
console.log(tileMap.value, tileLayer.value)
if (!tileMap.value || !tileLayer.value) return if (!tileMap.value || !tileLayer.value) return
// Check if there is a tile // Check if there is a tile
@ -185,15 +183,9 @@ onMounted(async () => {
} }
setLayerTiles(tileMap.value, tileLayer.value, blankTiles) setLayerTiles(tileMap.value, tileLayer.value, blankTiles)
scene.input.on(Phaser.Input.Events.POINTER_MOVE, handlePointer)
scene.input.on(Phaser.Input.Events.POINTER_DOWN, handlePointer)
}) })
onUnmounted(() => { onUnmounted(() => {
scene.input.off(Phaser.Input.Events.POINTER_MOVE, handlePointer)
scene.input.off(Phaser.Input.Events.POINTER_DOWN, handlePointer)
if (tileMap.value) { if (tileMap.value) {
tileMap.value.destroyLayer('tiles') tileMap.value.destroyLayer('tiles')
tileMap.value.removeAllLayers() tileMap.value.removeAllLayers()

View File

@ -9,7 +9,6 @@ import { uuidv4 } from '@/application/utilities'
import PlacedMapObject from '@/components/gameMaster/mapEditor/mapPartials/PlacedMapObject.vue' import PlacedMapObject from '@/components/gameMaster/mapEditor/mapPartials/PlacedMapObject.vue'
import SelectedPlacedMapObjectComponent from '@/components/gameMaster/mapEditor/partials/SelectedPlacedMapObject.vue' import SelectedPlacedMapObjectComponent from '@/components/gameMaster/mapEditor/partials/SelectedPlacedMapObject.vue'
import { getTile } from '@/composables/mapComposable' import { getTile } from '@/composables/mapComposable'
import { useMapEditorStore } from '@/stores/mapEditorStore'
import { useScene } from 'phavuer' import { useScene } from 'phavuer'
import { ref, watch } from 'vue' import { ref, watch } from 'vue'
import { useMapEditorComposable } from '@/composables/useMapEditorComposable' import { useMapEditorComposable } from '@/composables/useMapEditorComposable'
@ -19,15 +18,17 @@ const mapEditor = useMapEditorComposable()
const selectedPlacedMapObject = ref<PlacedMapObjectT | null>(null) const selectedPlacedMapObject = ref<PlacedMapObjectT | null>(null)
const movingPlacedMapObject = ref<PlacedMapObjectT | null>(null) const movingPlacedMapObject = ref<PlacedMapObjectT | null>(null)
const tileLayer = ref<Phaser.Tilemaps.TilemapLayer>()
const props = defineProps<{ const props = defineProps<{
tileMap: Phaser.Tilemaps.Tilemap tileMap: Phaser.Tilemaps.Tilemap
}>() }>()
defineExpose({handlePointer}) defineExpose({handlePointer})
function pencil(pointer: Phaser.Input.Pointer, tileMapLayer: Phaser.Tilemaps.TilemapLayer, map: MapT) { function pencil(pointer: Phaser.Input.Pointer, map: MapT) {
// Check if there is a tile // Check if there is a tile
const tile = getTile(tileMapLayer, pointer.worldX, pointer.worldY) const tile = getTile(tileLayer, pointer.worldX, pointer.worldY)
if (!tile) return if (!tile) return
// Check if object already exists on position // Check if object already exists on position
@ -48,7 +49,7 @@ function pencil(pointer: Phaser.Input.Pointer, tileMapLayer: Phaser.Tilemaps.Til
map.placedMapObjects.concat(newPlacedMapObject) map.placedMapObjects.concat(newPlacedMapObject)
} }
function eraser(pointer: Phaser.Input.Pointer, tileMapLayer: Phaser.Tilemaps.TilemapLayer, map: MapT) { function eraser(pointer: Phaser.Input.Pointer, map: MapT) {
// Check if there is a tile // Check if there is a tile
const tile = getTile(tileMapLayer, pointer.worldX, pointer.worldY) const tile = getTile(tileMapLayer, pointer.worldX, pointer.worldY)
if (!tile) return if (!tile) return
@ -61,7 +62,7 @@ function eraser(pointer: Phaser.Input.Pointer, tileMapLayer: Phaser.Tilemaps.Til
map.placedMapObjects = map.placedMapObjects.filter((placedMapObject) => placedMapObject.id !== existingPlacedMapObject.id) map.placedMapObjects = map.placedMapObjects.filter((placedMapObject) => placedMapObject.id !== existingPlacedMapObject.id)
} }
function objectPicker(pointer: Phaser.Input.Pointer, tileMapLayer: Phaser.Tilemaps.TilemapLayer, map: MapT) { function objectPicker(pointer: Phaser.Input.Pointer, map: MapT) {
// Check if there is a tile // Check if there is a tile
const tile = getTile(tileMapLayer, pointer.worldX, pointer.worldY) const tile = getTile(tileMapLayer, pointer.worldX, pointer.worldY)
if (!tile) return if (!tile) return
@ -74,7 +75,7 @@ function objectPicker(pointer: Phaser.Input.Pointer, tileMapLayer: Phaser.Tilema
mapEditor.setSelectedMapObject(existingPlacedMapObject.mapObject) mapEditor.setSelectedMapObject(existingPlacedMapObject.mapObject)
} }
function moveMapObject(id: string, tileMapLayer: Phaser.Tilemaps.TilemapLayer, map: MapT) { function moveMapObject(id: string, map: MapT) {
movingPlacedMapObject.value = map.placedMapObjects.find((object) => object.id === id) as PlacedMapObjectT movingPlacedMapObject.value = map.placedMapObjects.find((object) => object.id === id) as PlacedMapObjectT
function handlePointerMove(pointer: Phaser.Input.Pointer) { function handlePointerMove(pointer: Phaser.Input.Pointer) {
@ -123,7 +124,7 @@ function clickPlacedMapObject(placedMapObject: PlacedMapObjectT) {
} }
} }
function handlePointer(pointer: Phaser.Input.Pointer, tileMapLayer: Phaser.Tilemaps.TilemapLayer) { function handlePointer(pointer: Phaser.Input.Pointer) {
const map = mapEditor.currentMap.value const map = mapEditor.currentMap.value
if (!map) return if (!map) return
@ -141,11 +142,14 @@ function handlePointer(pointer: Phaser.Input.Pointer, tileMapLayer: Phaser.Tilem
// Check if tool is pencil // Check if tool is pencil
switch (mapEditor.tool.value) { switch (mapEditor.tool.value) {
case 'pencil': case 'pencil':
if (mapEditor.selectedMapObject.value) pencil(pointer, tileMapLayer, map) if (mapEditor.selectedMapObject.value) pencil(pointer, map)
break
case 'eraser': case 'eraser':
eraser(pointer, tileMapLayer, map) eraser(pointer, map)
break
case 'object picker': case 'object picker':
objectPicker(pointer, tileMapLayer, map) objectPicker(pointer, map)
break
} }
} }