From 9de7af961ec551e6a7cc43ad3c4def72cbf1cd76 Mon Sep 17 00:00:00 2001
From: Dennis Postma <dennis@directonline.io>
Date: Fri, 10 Jan 2025 23:22:32 +0100
Subject: [PATCH] Improved map tile initialising

---
 src/application/types.ts                    |  2 +-
 src/components/game/character/Character.vue |  7 ++-
 src/components/game/map/Map.vue             | 12 ++---
 src/components/game/map/MapTiles.vue        | 55 +++++++++------------
 src/composables/useCharacter.ts             |  0
 5 files changed, 31 insertions(+), 45 deletions(-)
 create mode 100644 src/composables/useCharacter.ts

diff --git a/src/application/types.ts b/src/application/types.ts
index b3dc3f3..071b32c 100644
--- a/src/application/types.ts
+++ b/src/application/types.ts
@@ -184,7 +184,7 @@ export type Character = {
 
 export type MapCharacter = {
   character: Character
-  isMoving?: boolean
+  isMoving: boolean
 }
 
 export type CharacterItem = {
diff --git a/src/components/game/character/Character.vue b/src/components/game/character/Character.vue
index e0a0aea..0147a94 100644
--- a/src/components/game/character/Character.vue
+++ b/src/components/game/character/Character.vue
@@ -90,7 +90,9 @@ const updatePosition = (positionX: number, positionY: number, direction: Directi
       }
     },
     onUpdate: (tween) => {
+      // @ts-ignore
       currentPositionX.value = tween.targets[0].x
+      // @ts-ignore
       currentPositionY.value = tween.targets[0].y
     },
     onComplete: () => {
@@ -149,8 +151,6 @@ watch(
   }
 )
 
-watch(() => props.mapCharacter, updateSprite)
-
 const characterTypeStorage = new CharacterTypeStorage()
 characterTypeStorage.getSpriteId(props.mapCharacter.character.characterType!).then((spriteId) => {
   console.log(spriteId)
@@ -172,8 +172,7 @@ onMounted(() => {
     mapStore.setCharacterLoaded(true)
 
     // #146 : Set camera position to character, need to be improved still
-    // scene.cameras.main.startFollow(charContainer.value as Phaser.GameObjects.Container)
-    // scene.cameras.main.stopFollow()
+    scene.cameras.main.startFollow(charContainer.value as Phaser.GameObjects.Container)
   }
 
   updatePosition(props.mapCharacter.character.positionX, props.mapCharacter.character.positionY, props.mapCharacter.character.rotation)
diff --git a/src/components/game/map/Map.vue b/src/components/game/map/Map.vue
index 884f074..7c86e5a 100644
--- a/src/components/game/map/Map.vue
+++ b/src/components/game/map/Map.vue
@@ -1,26 +1,20 @@
 <template>
   <MapTiles :key="mapStore.mapId" @tileMap:create="tileMap = $event" />
-  <MapObjects v-if="tileMap" :tilemap="tileMap as Phaser.Tilemaps.Tilemap" />
+  <!--  <MapObjects v-if="tileMap" :tilemap="tileMap as Phaser.Tilemaps.Tilemap" />-->
   <Characters v-if="tileMap" :tilemap="tileMap as Phaser.Tilemaps.Tilemap" />
 </template>
 
 <script setup lang="ts">
-import type { Map, MapCharacter, mapLoadData, UUID } from '@/application/types'
+import type { MapCharacter, mapLoadData, UUID } from '@/application/types'
 import Characters from '@/components/game/map/Characters.vue'
 import MapTiles from '@/components/game/map/MapTiles.vue'
 import MapObjects from '@/components/game/map/PlacedMapObjects.vue'
-import { loadMapTilesIntoScene } from '@/composables/mapComposable'
-import { MapStorage } from '@/storage/storages'
 import { useGameStore } from '@/stores/gameStore'
 import { useMapStore } from '@/stores/mapStore'
-import { useScene } from 'phavuer'
-import { onUnmounted, ref, shallowRef } from 'vue'
+import { onUnmounted, shallowRef } from 'vue'
 
-const scene = useScene()
 const gameStore = useGameStore()
 const mapStore = useMapStore()
-const mapStorage = new MapStorage()
-const mapData = ref<Map>()
 
 const tileMap = shallowRef<Phaser.Tilemaps.Tilemap>()
 
diff --git a/src/components/game/map/MapTiles.vue b/src/components/game/map/MapTiles.vue
index a864adf..ddbca72 100644
--- a/src/components/game/map/MapTiles.vue
+++ b/src/components/game/map/MapTiles.vue
@@ -1,5 +1,5 @@
 <template>
-  <Controls v-if="isInitialized" :layer="tileLayer" :depth="0" />
+  <Controls v-if="tileLayer" :layer="tileLayer" :depth="0" />
 </template>
 
 <script setup lang="ts">
@@ -11,17 +11,17 @@ import { FlattenMapArray, loadMapTilesIntoScene, setLayerTiles } from '@/composa
 import { MapStorage } from '@/storage/storages'
 import { useMapStore } from '@/stores/mapStore'
 import { useScene } from 'phavuer'
-import { onBeforeUnmount, onMounted, ref } from 'vue'
+import { onBeforeUnmount, onMounted, shallowRef } from 'vue'
+
+import Tileset = Phaser.Tilemaps.Tileset
 
 const emit = defineEmits(['tileMap:create'])
-
 const scene = useScene()
 const mapStore = useMapStore()
 const mapStorage = new MapStorage()
 
-let tileMap: Phaser.Tilemaps.Tilemap
-let tileLayer: Phaser.Tilemaps.TilemapLayer
-let isInitialized = ref(false)
+const tileMap = shallowRef<Phaser.Tilemaps.Tilemap>()
+const tileLayer = shallowRef<Phaser.Tilemaps.TilemapLayer>()
 
 function createTileMap(mapData: any) {
   const mapConfig = new Phaser.Tilemaps.MapData({
@@ -35,48 +35,41 @@ function createTileMap(mapData: any) {
 
   const newTileMap = new Phaser.Tilemaps.Tilemap(scene, mapConfig)
   emit('tileMap:create', newTileMap)
-
   return newTileMap
 }
 
-function createTileLayer(mapData: any) {
+function createTileLayer(currentTileMap: Phaser.Tilemaps.Tilemap, mapData: any) {
   const tilesArray = unduplicateArray(FlattenMapArray(mapData?.tiles ?? []))
 
-  const tilesetImages = Array.from(tilesArray).map((tile: any, index: number) => {
-    return tileMap.addTilesetImage(tile, tile, config.tile_size.width, config.tile_size.height, 1, 2, index + 1, { x: 0, y: -config.tile_size.height })
+  const tilesetImages = tilesArray.map((tile: any, index: number) => {
+    return currentTileMap.addTilesetImage(tile, tile, config.tile_size.width, config.tile_size.height, 1, 2, index + 1, { x: 0, y: -config.tile_size.height })
   })
 
   // Add blank tile
-  tilesetImages.push(tileMap.addTilesetImage('blank_tile', 'blank_tile', config.tile_size.width, config.tile_size.height, 1, 2, 0, { x: 0, y: -config.tile_size.height }))
-  const layer = tileMap.createBlankLayer('tiles', tilesetImages as any, 0, config.tile_size.height) as Phaser.Tilemaps.TilemapLayer
+  tilesetImages.push(currentTileMap.addTilesetImage('blank_tile', 'blank_tile', config.tile_size.width, config.tile_size.height, 1, 2, 0, { x: 0, y: -config.tile_size.height }))
+
+  const layer = currentTileMap.createBlankLayer('tiles', tilesetImages as Tileset[], 0, config.tile_size.height) as Phaser.Tilemaps.TilemapLayer
 
   layer.setDepth(0)
   layer.setCullPadding(2, 2)
-
   return layer
 }
 
-async function initialize() {
-  try {
-    await loadMapTilesIntoScene(mapStore.mapId as UUID, scene)
-    const mapData = await mapStorage.get(mapStore.mapId)
-    tileMap = createTileMap(mapData)
-    tileLayer = createTileLayer(mapData)
-    setLayerTiles(tileMap, tileLayer, mapData?.tiles)
-    isInitialized.value = true
-  } catch (error) {
-    console.error('Failed to initialize map:', error)
-  }
-}
-
 onMounted(() => {
-  initialize()
+  loadMapTilesIntoScene(mapStore.mapId as UUID, scene)
+    .then(() => mapStorage.get(mapStore.mapId))
+    .then((mapData) => {
+      tileMap.value = createTileMap(mapData)
+      tileLayer.value = createTileLayer(tileMap.value, mapData)
+      setLayerTiles(tileMap.value, tileLayer.value, mapData?.tiles)
+    })
+    .catch((error) => console.error('Failed to initialize map:', error))
 })
 
 onBeforeUnmount(() => {
-  if (!tileMap) return
-  tileMap.destroyLayer('tiles')
-  tileMap.removeAllLayers()
-  tileMap.destroy()
+  if (!tileMap.value) return
+  tileMap.value.destroyLayer('tiles')
+  tileMap.value.removeAllLayers()
+  tileMap.value.destroy()
 })
 </script>
diff --git a/src/composables/useCharacter.ts b/src/composables/useCharacter.ts
new file mode 100644
index 0000000..e69de29