diff --git a/src/App.vue b/src/App.vue
index b2a2de4..b948b35 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -2,7 +2,7 @@
-
+
@@ -22,21 +22,20 @@ import { computed, ref, useTemplateRef, watch } from 'vue'
import { useMapEditorComposable } from '@/composables/useMapEditorComposable'
const gameStore = useGameStore()
-
-const isEditorShown = ref(false)
+const mapEditor = useMapEditorComposable()
const currentScreen = computed(() => {
if (!gameStore.game.isLoaded) return Loading
if (!gameStore.connection) return Login
if (!gameStore.token) return Login
if (!gameStore.character) return Characters
- if (isEditorShown.value) return MapEditor
+ if (mapEditor.active.value) return MapEditor
return Game
})
// Watch mapEditor.active and empty gameStore.game.loadedAssets
watch(
- () => isEditorShown.value,
+ () => mapEditor.active.value,
() => {
gameStore.game.loadedTextures = []
}
diff --git a/src/components/gameMaster/mapEditor/Map.vue b/src/components/gameMaster/mapEditor/Map.vue
index 8bd81f7..3485224 100644
--- a/src/components/gameMaster/mapEditor/Map.vue
+++ b/src/components/gameMaster/mapEditor/Map.vue
@@ -1,5 +1,5 @@
-
+
@@ -11,25 +11,16 @@ import MapEventTiles from '@/components/gameMaster/mapEditor/mapPartials/MapEven
import MapTiles from '@/components/gameMaster/mapEditor/mapPartials/MapTiles.vue'
import PlacedMapObjects from '@/components/gameMaster/mapEditor/mapPartials/PlacedMapObjects.vue'
import { useMapEditorComposable } from '@/composables/useMapEditorComposable'
-import { onMounted, onUnmounted, shallowRef } from 'vue'
+import { onUnmounted, shallowRef, useTemplateRef} from 'vue'
-const mapEditor = useMapEditorComposable()
const tileMap = shallowRef()
-
-const selectedMap = ref()
-const mapEditorStore = useMapEditorStore()
const mapEditor = useMapEditorComposable()
const mapTiles = useTemplateRef('mapTiles')
const mapObjects = useTemplateRef('mapObjects')
const eventTiles = useTemplateRef('eventTiles')
-const scene = useScene()
-
-
-
function handlePointer(pointer: Phaser.Input.Pointer) {
- if (!mapTiles.value || !mapObjects.value || !eventTiles.value) return
// Check if left mouse button is pressed
if (!pointer.isDown) return
@@ -40,26 +31,16 @@ function handlePointer(pointer: Phaser.Input.Pointer) {
if (!pointer.event.altKey) return
// Check if draw mode is tile
- switch (mapEditorStore.drawMode) {
+ switch (mapEditor.drawMode.value) {
case 'tile':
- mapTiles.value.handlePointer(pointer)
+ mapTiles.value?.handlePointer(pointer)
// case 'map_object':
// mapObjects.value.handlePointer(pointer)
case 'event tile':
- eventTiles.value.handlePointer(pointer)
+ eventTiles.value?.handlePointer(pointer)
}
}
-watch(() => mapEditor.currentMap, async (map) => {
- if (!map.value) return
- selectedMap.value = map.value
-})
-
-onMounted(() => {
- scene.input.on(Phaser.Input.Events.POINTER_MOVE, handlePointer)
- scene.input.on(Phaser.Input.Events.POINTER_DOWN, handlePointer)
-})
-
onUnmounted(() => {
mapEditor.reset()
})
diff --git a/src/components/gameMaster/mapEditor/mapPartials/MapEventTiles.vue b/src/components/gameMaster/mapEditor/mapPartials/MapEventTiles.vue
index 2eb24f7..d63d711 100644
--- a/src/components/gameMaster/mapEditor/mapPartials/MapEventTiles.vue
+++ b/src/components/gameMaster/mapEditor/mapPartials/MapEventTiles.vue
@@ -6,13 +6,12 @@
import { MapEventTileType, type MapEventTile } from '@/application/types'
import { uuidv4 } from '@/application/utilities'
import { getTile, tileToWorldX, tileToWorldY } from '@/composables/mapComposable'
-import { useMapEditorStore } from '@/stores/mapEditorStore'
import { Image, useScene } from 'phavuer'
import { type Map as MapT } from "@/application/types"
import { useMapEditorComposable } from '@/composables/useMapEditorComposable'
-import { shallowRef, watch } from 'vue'
+import { onMounted, onUnmounted, shallowRef, watch } from 'vue'
-const mapEditorStore = useMapEditorStore()
+const scene = useScene()
const mapEditor = useMapEditorComposable()
defineExpose({handlePointer})
@@ -44,22 +43,22 @@ function pencil(pointer: Phaser.Input.Pointer, map: MapT) {
if (existingEventTile) return
// If teleport, check if there is a selected map
- if (mapEditorStore.drawMode === 'teleport' && !mapEditorStore.teleportSettings.toMapId) return
+ if (mapEditor.drawMode.value === 'teleport' && !mapEditor.teleportSettings.value.toMapId) return
const newEventTile = {
id: uuidv4(),
mapId: map?.id,
map: map?.id,
- type: mapEditorStore.drawMode === 'blocking tile' ? MapEventTileType.BLOCK : MapEventTileType.TELEPORT,
+ type: mapEditor.drawMode.value === 'blocking tile' ? MapEventTileType.BLOCK : MapEventTileType.TELEPORT,
positionX: tile.x,
positionY: tile.y,
teleport:
- mapEditorStore.drawMode === 'teleport'
+ mapEditor.drawMode.value === 'teleport'
? {
- toMap: mapEditorStore.teleportSettings.toMapId,
- toPositionX: mapEditorStore.teleportSettings.toPositionX,
- toPositionY: mapEditorStore.teleportSettings.toPositionY,
- toRotation: mapEditorStore.teleportSettings.toRotation
+ toMap: mapEditor.teleportSettings.value.toMapId,
+ toPositionX: mapEditor.teleportSettings.value.toPositionX,
+ toPositionY: mapEditor.teleportSettings.value.toPositionY,
+ toRotation: mapEditor.teleportSettings.value.toRotation
}
: undefined
}
@@ -91,12 +90,23 @@ function handlePointer(pointer: Phaser.Input.Pointer) {
// Check if shift is not pressed, this means we are moving the camera
if (pointer.event.shiftKey) return
- if (mapEditorStore.drawMode !== 'blocking tile' && mapEditorStore.drawMode !== 'teleport') return
+ if (mapEditor.drawMode.value !== 'blocking tile' && mapEditor.drawMode.value !== 'teleport') return
- switch (mapEditorStore.tool) {
+ switch (mapEditor.tool.value) {
case 'pencil': pencil(pointer, map)
case 'eraser': erase(pointer, map)
}
}
+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)
+})
+
+
diff --git a/src/components/gameMaster/mapEditor/mapPartials/MapTiles.vue b/src/components/gameMaster/mapEditor/mapPartials/MapTiles.vue
index 6ac5493..347222a 100644
--- a/src/components/gameMaster/mapEditor/mapPartials/MapTiles.vue
+++ b/src/components/gameMaster/mapEditor/mapPartials/MapTiles.vue
@@ -34,7 +34,9 @@ function createTileMap() {
format: Phaser.Tilemaps.Formats.ARRAY_2D
})
- return new Phaser.Tilemaps.Tilemap(scene, mapData)
+ const newTileMap = new Phaser.Tilemaps.Tilemap(scene, mapData)
+ emit('tileMap:create', newTileMap)
+ return newTileMap
}
async function createTileLayer(currentTileMap: Phaser.Tilemaps.Tilemap) {
@@ -55,81 +57,88 @@ async function createTileLayer(currentTileMap: Phaser.Tilemaps.Tilemap) {
return layer
}
-function pencil(pointer: Phaser.Input.Pointer, tileMap: Phaser.Tilemaps.Tilemap, tileLayer: Phaser.Tilemaps.TilemapLayer) {
- var map = mapEditor.currentMap.value
- if (!map) return
-
- // Check if there is a tile
- const tile = tileLayer.getTileAtWorldXY(pointer.worldX, pointer.worldY)
- if (!tile) return
-
- // Place tile
- placeTile(tileMap, tileLayer, tile.x, tile.y, mapEditorStore.selectedTile)
-
- // Adjust mapEditorStore.map.tiles
- tileMap.tiles[tile.y][tile.x] = map.tiles[tile.y][tile.x]
-}
-
-function eraser(pointer: Phaser.Input.Pointer, tileMap: Phaser.Tilemaps.Tilemap, tileLayer: Phaser.Tilemaps.TilemapLayer) {
+function pencil(pointer: Phaser.Input.Pointer) {
let map = mapEditor.currentMap.value
if (!map) return
+ // Check if there is a selected tile
+ if (!mapEditor.selectedTile.value) return
+
+ console.log(tileMap.value, tileLayer.value)
+
+ if (!tileMap.value || !tileLayer.value) return
+
// Check if there is a tile
- const tile = getTile(tileLayer, pointer.worldX, pointer.worldY)
+ const tile = getTile(tileLayer.value, pointer.worldX, pointer.worldY)
if (!tile) return
// Place tile
- placeTile(tileMap, tileLayer, tile.x, tile.y, 'blank_tile')
+ placeTile(tileMap.value, tileLayer.value, tile.x, tile.y, mapEditor.selectedTile.value)
+
+ // Adjust mapEditorStore.map.tiles
+ map.tiles[tile.y][tile.x] = map.tiles[tile.y][tile.x]
+}
+
+function eraser(pointer: Phaser.Input.Pointer) {
+ let map = mapEditor.currentMap.value
+ if (!map) return
+
+ if (!tileMap.value || !tileLayer.value) return
+
+ // Check if there is a tile
+ const tile = getTile(tileLayer.value, pointer.worldX, pointer.worldY)
+ if (!tile) return
+
+ // Place tile
+ placeTile(tileMap.value, tileLayer.value, tile.x, tile.y, 'blank_tile')
// Adjust mapEditorStore.map.tiles
map.tiles[tile.y][tile.x] = 'blank_tile'
}
-function paint(pointer: Phaser.Input.Pointer, tileMap: Phaser.Tilemaps.Tilemap, tileLayer: Phaser.Tilemaps.TilemapLayer) {
+function paint(pointer: Phaser.Input.Pointer) {
+ if (!tileMap.value || !tileLayer.value) return
// Set new tileArray with selected tile
- setLayerTiles(tileMap, tileLayer, createTileArray(tileMap.width, tileMap.height, mapEditorStore.selectedTile))
+ const tileArray = createTileArray(tileMap.value.width, tileMap.value.height, mapEditor.selectedTile.value)
+ setLayerTiles(tileMap.value, tileLayer.value, tileArray)
// Adjust mapEditorStore.map.tiles
if (mapEditor.currentMap.value) {
- mapEditor.currentMap.value.tiles = createTileArray(tileMap.width, tileMap.height, mapEditorStore.selectedTile)
+ mapEditor.currentMap.value.tiles = tileArray
}
}
// When alt is pressed, and the pointer is down, select the tile that the pointer is over
-function tilePicker(pointer: Phaser.Input.Pointer, tileLayer: Phaser.Tilemaps.TilemapLayer) {
+function tilePicker(pointer: Phaser.Input.Pointer) {
let map = mapEditor.currentMap.value
if (!map) return
// Check if there is a tile
- const tile = getTile(tileLayer, pointer.worldX, pointer.worldY)
+ const tile = getTile(tileLayer.value!, pointer.worldX, pointer.worldY)
if (!tile) return
// Select the tile
- mapEditorStore.setSelectedTile(map.tiles[tile.y][tile.x])
+ mapEditor.setSelectedTile(map.tiles[tile.y][tile.x])
}
watch(
- () => mapEditorStore.shouldClearTiles,
+ () => mapEditor.shouldClearTiles,
(shouldClear) => {
if (shouldClear && mapEditor.currentMap.value && tileMap.value && tileLayer.value) {
const blankTiles = createTileArray(tileLayer.value.width, tileLayer.value.height, 'blank_tile')
setLayerTiles(tileMap.value, tileLayer.value, blankTiles)
mapEditor.currentMap.value.tiles = blankTiles
- mapEditorStore.resetClearTilesFlag()
+ mapEditor.resetClearTilesFlag()
}
}
)
function handlePointer(pointer: Phaser.Input.Pointer) {
- if (!mapEditor.currentMap.value) return
if (!tileMap.value || !tileLayer.value) return
// Check if tool is pencil
- if (mapEditorStore.drawMode !== 'tile') return
-
- // Check if there is a selected tile
- if (!mapEditorStore.selectedTile) return
+ if (mapEditor.drawMode.value !== 'tile') return
// Check if left mouse button is pressed
if (!pointer.isDown) return
@@ -138,24 +147,26 @@ function handlePointer(pointer: Phaser.Input.Pointer) {
if (pointer.event.shiftKey) return
// Check if alt is pressed
- if (!pointer.event.altKey) return
-
+ if (pointer.event.altKey) return
// Check if draw mode is tile
- switch (mapEditorStore.tool) {
+ switch (mapEditor.tool.value) {
case 'pencil':
- pencil(pointer, tileMap.value, tileLayer.value)
+ pencil(pointer)
+ break
case 'eraser':
- eraser(pointer, tileMap.value, tileLayer.value)
+ eraser(pointer)
+ break
case 'paint':
- paint(pointer, tileMap.value, tileLayer.value)
+ paint(pointer)
+ break
case 'tile picker':
- tilePicker(pointer, tileLayer.value)
+ tilePicker(pointer)
+ break
}
}
onMounted(async () => {
- if (!mapEditor.currentMap.value?.tiles) return
- console.log(mapEditor.currentMap.value)
+ if (!mapEditor.currentMap.value) return
tileMap.value = createTileMap()
tileLayer.value = await createTileLayer(tileMap.value)
@@ -174,9 +185,15 @@ onMounted(async () => {
}
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(() => {
+ scene.input.off(Phaser.Input.Events.POINTER_MOVE, handlePointer)
+ scene.input.off(Phaser.Input.Events.POINTER_DOWN, handlePointer)
+
if (tileMap.value) {
tileMap.value.destroyLayer('tiles')
tileMap.value.removeAllLayers()
diff --git a/src/components/gameMaster/mapEditor/mapPartials/PlacedMapObjects.vue b/src/components/gameMaster/mapEditor/mapPartials/PlacedMapObjects.vue
index fb30685..871d85b 100644
--- a/src/components/gameMaster/mapEditor/mapPartials/PlacedMapObjects.vue
+++ b/src/components/gameMaster/mapEditor/mapPartials/PlacedMapObjects.vue
@@ -1,6 +1,6 @@
-
+
diff --git a/src/composables/pointerHandlers/useMapEditorPointerHandlers.ts b/src/composables/pointerHandlers/useMapEditorPointerHandlers.ts
index 77f1522..79a5c6c 100644
--- a/src/composables/pointerHandlers/useMapEditorPointerHandlers.ts
+++ b/src/composables/pointerHandlers/useMapEditorPointerHandlers.ts
@@ -28,7 +28,7 @@ export function useMapEditorPointerHandlers(scene: Phaser.Scene, layer: Phaser.T
}
function handlePointerDown(pointer: Phaser.Input.Pointer) {
- pointerStartPosition.value = pointer.position
+ pointerStartPosition.value = { x: pointer.x, y: pointer.y }
if (isMoveTool.value || pointer.event.shiftKey) {
gameStore.setPlayerDraggingCamera(true)
}
@@ -37,9 +37,11 @@ export function useMapEditorPointerHandlers(scene: Phaser.Scene, layer: Phaser.T
function dragMap(pointer: Phaser.Input.Pointer) {
if (!gameStore.game.isPlayerDraggingCamera) return
+ const distance = Phaser.Math.Distance.Between(pointerStartPosition.value.x, pointerStartPosition.value.y, pointer.x, pointer.y)
+
// If the distance is less than the drag threshold, return
// We do this to prevent the camera from scrolling too quickly
- const distance = Phaser.Math.Distance.Between(pointerStartPosition.value.x, pointerStartPosition.value.y, pointer.x, pointer.y)
+
if (distance <= dragThreshold) return
camera.setScroll(camera.scrollX - (pointer.x - pointer.prevPosition.x) / camera.zoom, camera.scrollY - (pointer.y - pointer.prevPosition.y) / camera.zoom)
diff --git a/src/composables/useMapEditorComposable.ts b/src/composables/useMapEditorComposable.ts
index f3b3d6b..bd1328e 100644
--- a/src/composables/useMapEditorComposable.ts
+++ b/src/composables/useMapEditorComposable.ts
@@ -12,14 +12,8 @@ const currentMap = ref