Load all tiles in zone editor
This commit is contained in:
parent
be854a79b8
commit
7c259f455c
@ -1,5 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<ZoneTiles @tilemap:create="tileMap = $event" />
|
<div v-if="isLoaded">
|
||||||
|
<ZoneTiles @tilemap:create="tileMap = $event" />
|
||||||
|
</div>
|
||||||
<ZoneObjects v-if="tileMap" :tilemap="tileMap as Phaser.Tilemaps.Tilemap" />
|
<ZoneObjects v-if="tileMap" :tilemap="tileMap as Phaser.Tilemaps.Tilemap" />
|
||||||
<ZoneEventTiles v-if="tileMap" :tilemap="tileMap as Phaser.Tilemaps.Tilemap" />
|
<ZoneEventTiles v-if="tileMap" :tilemap="tileMap as Phaser.Tilemaps.Tilemap" />
|
||||||
|
|
||||||
@ -14,10 +16,11 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { onUnmounted, ref } from 'vue'
|
import { useScene } from 'phavuer'
|
||||||
|
import { onMounted, onUnmounted, ref } from 'vue'
|
||||||
import { useGameStore } from '@/stores/gameStore'
|
import { useGameStore } from '@/stores/gameStore'
|
||||||
import { useZoneEditorStore } from '@/stores/zoneEditorStore'
|
import { useZoneEditorStore } from '@/stores/zoneEditorStore'
|
||||||
import { type Zone } from '@/types'
|
import { type AssetT, type Zone } from '@/types'
|
||||||
|
|
||||||
// Components
|
// Components
|
||||||
import Toolbar from '@/components/gameMaster/zoneEditor/partials/Toolbar.vue'
|
import Toolbar from '@/components/gameMaster/zoneEditor/partials/Toolbar.vue'
|
||||||
@ -29,11 +32,14 @@ import TeleportModal from '@/components/gameMaster/zoneEditor/partials/TeleportM
|
|||||||
import ZoneTiles from '@/components/gameMaster/zoneEditor/ZoneTiles.vue'
|
import ZoneTiles from '@/components/gameMaster/zoneEditor/ZoneTiles.vue'
|
||||||
import ZoneObjects from '@/components/gameMaster/zoneEditor/ZoneObjects.vue'
|
import ZoneObjects from '@/components/gameMaster/zoneEditor/ZoneObjects.vue'
|
||||||
import ZoneEventTiles from '@/components/gameMaster/zoneEditor/ZoneEventTiles.vue'
|
import ZoneEventTiles from '@/components/gameMaster/zoneEditor/ZoneEventTiles.vue'
|
||||||
|
import config from '@/config'
|
||||||
|
import { loadZoneTileTexture } from '@/composables/zoneComposable'
|
||||||
|
|
||||||
|
const scene = useScene()
|
||||||
const gameStore = useGameStore()
|
const gameStore = useGameStore()
|
||||||
const zoneEditorStore = useZoneEditorStore()
|
const zoneEditorStore = useZoneEditorStore()
|
||||||
|
|
||||||
const tileMap = ref(null as Phaser.Tilemaps.Tilemap | null)
|
const tileMap = ref(null as Phaser.Tilemaps.Tilemap | null)
|
||||||
|
const isLoaded = ref(false)
|
||||||
|
|
||||||
function save() {
|
function save() {
|
||||||
if (!zoneEditorStore.zone) return
|
if (!zoneEditorStore.zone) return
|
||||||
@ -59,6 +65,14 @@ function save() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
const tiles: AssetT[] = await fetch(config.server_endpoint + '/assets/list_tiles').then((response) => response.json())
|
||||||
|
for (const tile of tiles) {
|
||||||
|
await loadZoneTileTexture(scene, tile.key, tile.updatedAt)
|
||||||
|
}
|
||||||
|
isLoaded.value = true
|
||||||
|
})
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
zoneEditorStore.reset()
|
zoneEditorStore.reset()
|
||||||
})
|
})
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<Modal :is-modal-open="gameStore.uiSettings.isPasswordResetOpen" @modal:close="() => gameStore.togglePasswordReset()" :modal-width="400" :modal-height="300" :is-resizable="false">
|
<Modal :is-modal-open="gameStore.uiSettings.isPasswordResetOpen" @modal:close="() => gameStore.togglePasswordReset()" :modal-width="400" :modal-height="300" :is-resizable="false">
|
||||||
<template #modalHeader>
|
<template #modalHeader>
|
||||||
<h3 class="m-0 font-medium shrink-0 text-white">Reset Password</h3>
|
<h3 class="m-0 font-medium shrink-0 text-white">Reset Password</h3>
|
||||||
</template>
|
</template>
|
||||||
@ -47,4 +47,4 @@ async function resetPasswordFunc() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@ -223,23 +223,23 @@ watch(
|
|||||||
)
|
)
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
window.addEventListener('mousemove', drag)
|
addEventListener('mousemove', drag)
|
||||||
window.addEventListener('mouseup', stopDrag)
|
addEventListener('mouseup', stopDrag)
|
||||||
window.addEventListener('mousemove', resizeModal)
|
addEventListener('mousemove', resizeModal)
|
||||||
window.addEventListener('mouseup', stopResize)
|
addEventListener('mouseup', stopResize)
|
||||||
if (props.modalPositionX !== 0 && props.modalPositionY !== 0) {
|
if (props.modalPositionX !== 0 && props.modalPositionY !== 0) {
|
||||||
window.addEventListener('resize', handleResize)
|
addEventListener('resize', handleResize)
|
||||||
}
|
}
|
||||||
initializePosition()
|
initializePosition()
|
||||||
})
|
})
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
window.removeEventListener('mousemove', drag)
|
removeEventListener('mousemove', drag)
|
||||||
window.removeEventListener('mouseup', stopDrag)
|
removeEventListener('mouseup', stopDrag)
|
||||||
window.removeEventListener('mousemove', resizeModal)
|
removeEventListener('mousemove', resizeModal)
|
||||||
window.removeEventListener('mouseup', stopResize)
|
removeEventListener('mouseup', stopResize)
|
||||||
if (props.modalPositionX !== 0 && props.modalPositionY !== 0) {
|
if (props.modalPositionX !== 0 && props.modalPositionY !== 0) {
|
||||||
window.removeEventListener('resize', handleResize)
|
removeEventListener('resize', handleResize)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
@ -4,8 +4,7 @@ import TilemapLayer = Phaser.Tilemaps.TilemapLayer
|
|||||||
import Tileset = Phaser.Tilemaps.Tileset
|
import Tileset = Phaser.Tilemaps.Tileset
|
||||||
import Tile = Phaser.Tilemaps.Tile
|
import Tile = Phaser.Tilemaps.Tile
|
||||||
import { useAssetManager } from '@/managers/assetManager'
|
import { useAssetManager } from '@/managers/assetManager'
|
||||||
import type { Zone as ZoneT } from '@/types'
|
import type { AssetT, Zone as ZoneT } from '@/types'
|
||||||
import { unduplicateArray } from '@/utilities'
|
|
||||||
|
|
||||||
export function getTile(layer: TilemapLayer | Tilemap, x: number, y: number): Tile | undefined {
|
export function getTile(layer: TilemapLayer | Tilemap, x: number, y: number): Tile | undefined {
|
||||||
const tile = layer.getTileAtWorldXY(x, y)
|
const tile = layer.getTileAtWorldXY(x, y)
|
||||||
@ -48,6 +47,7 @@ export function tileToWorldY(layer: TilemapLayer | Tilemap, pos_x: number, pos_y
|
|||||||
export function placeTile(zone: Tilemap, layer: TilemapLayer, x: number, y: number, tileName: string) {
|
export function placeTile(zone: Tilemap, layer: TilemapLayer, x: number, y: number, tileName: string) {
|
||||||
let tileImg = zone.getTileset(tileName) as Tileset
|
let tileImg = zone.getTileset(tileName) as Tileset
|
||||||
if (!tileImg) {
|
if (!tileImg) {
|
||||||
|
console.log('tile not found:', tileName)
|
||||||
tileImg = zone.getTileset('blank_tile') as Tileset
|
tileImg = zone.getTileset('blank_tile') as Tileset
|
||||||
}
|
}
|
||||||
layer.putTileAt(tileImg.firstgid, x, y)
|
layer.putTileAt(tileImg.firstgid, x, y)
|
||||||
@ -86,9 +86,10 @@ export function FlattenZoneArray(tiles: string[][]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function loadZoneTilesIntoScene(zone: ZoneT, scene: Phaser.Scene) {
|
export async function loadZoneTilesIntoScene(zone: ZoneT, scene: Phaser.Scene) {
|
||||||
const tileArray = unduplicateArray(FlattenZoneArray(zone.tiles))
|
const tileArray: AssetT[] = await fetch(config.server_endpoint + '/assets/list_tiles/' + zone.id).then((response) => response.json())
|
||||||
|
console.log(tileArray)
|
||||||
for (const tile of tileArray) {
|
for (const tile of tileArray) {
|
||||||
await loadZoneTileTexture(scene, tile, new Date())
|
await loadZoneTileTexture(scene, tile.key, tile.updatedAt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,8 +24,17 @@ class AssetManager extends Dexie {
|
|||||||
|
|
||||||
async downloadAsset(key: string, url: string, group: string, updatedAt: Date, frameCount?: number, frameWidth?: number, frameHeight?: number) {
|
async downloadAsset(key: string, url: string, group: string, updatedAt: Date, frameCount?: number, frameWidth?: number, frameHeight?: number) {
|
||||||
try {
|
try {
|
||||||
|
// Check if the asset already exists, then check if updatedAt is newer
|
||||||
|
const asset = await this.assets.get(key)
|
||||||
|
if (asset && asset.updatedAt > updatedAt) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Download the asset
|
||||||
const response = await fetch(config.server_endpoint + url)
|
const response = await fetch(config.server_endpoint + url)
|
||||||
const blob = await response.blob()
|
const blob = await response.blob()
|
||||||
|
|
||||||
|
// Store the asset in the database
|
||||||
await this.assets.put({ key, data: blob, group, updatedAt, frameCount, frameWidth, frameHeight })
|
await this.assets.put({ key, data: blob, group, updatedAt, frameCount, frameWidth, frameHeight })
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`Failed to add asset ${key}:`, error)
|
console.error(`Failed to add asset ${key}:`, error)
|
||||||
|
@ -11,17 +11,16 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import config from '@/config'
|
import config from '@/config'
|
||||||
import 'phaser'
|
import 'phaser'
|
||||||
import { ref } from 'vue'
|
|
||||||
import { Game, Scene } from 'phavuer'
|
import { Game, Scene } from 'phavuer'
|
||||||
import { useGameStore } from '@/stores/gameStore'
|
import { useGameStore } from '@/stores/gameStore'
|
||||||
import { useZoneEditorStore } from '@/stores/zoneEditorStore'
|
import { useZoneEditorStore } from '@/stores/zoneEditorStore'
|
||||||
import ZoneEditor from '@/components/gameMaster/zoneEditor/ZoneEditor.vue'
|
import ZoneEditor from '@/components/gameMaster/zoneEditor/ZoneEditor.vue'
|
||||||
import AwaitLoaderPlugin from 'phaser3-rex-plugins/plugins/awaitloader-plugin'
|
import AwaitLoaderPlugin from 'phaser3-rex-plugins/plugins/awaitloader-plugin'
|
||||||
import { useAssetManager } from '@/managers/assetManager'
|
import { loadZoneTilesIntoScene, loadZoneTileTexture } from '@/composables/zoneComposable'
|
||||||
|
import type { AssetT, Tile } from '@/types'
|
||||||
|
|
||||||
const gameStore = useGameStore()
|
const gameStore = useGameStore()
|
||||||
const zoneEditorStore = useZoneEditorStore()
|
const zoneEditorStore = useZoneEditorStore()
|
||||||
const assetManager = useAssetManager
|
|
||||||
|
|
||||||
const gameConfig = {
|
const gameConfig = {
|
||||||
name: config.name,
|
name: config.name,
|
||||||
@ -66,45 +65,7 @@ const preloadScene = async (scene: Phaser.Scene) => {
|
|||||||
scene.load.image('TELEPORT', '/assets/zone/tp_tile.png')
|
scene.load.image('TELEPORT', '/assets/zone/tp_tile.png')
|
||||||
scene.load.image('blank_tile', '/assets/zone/blank_tile.png')
|
scene.load.image('blank_tile', '/assets/zone/blank_tile.png')
|
||||||
scene.load.image('waypoint', '/assets/waypoint.png')
|
scene.load.image('waypoint', '/assets/waypoint.png')
|
||||||
|
|
||||||
/**
|
|
||||||
* We're using rex-await-loader to load assets asynchronously
|
|
||||||
* Phaser does not support this out of the box, so we're using this plugin
|
|
||||||
*/
|
|
||||||
// scene.load.rexAwait(async function (successCallback) {
|
|
||||||
// await assetManager.getAssetsByGroup('tiles').then((assets) => {
|
|
||||||
// assets.forEach((asset) => {
|
|
||||||
// if (scene.load.textureManager.exists(asset.key)) return
|
|
||||||
// scene.textures.addBase64(asset.key, asset.data)
|
|
||||||
// })
|
|
||||||
// })
|
|
||||||
//
|
|
||||||
// // Load objects
|
|
||||||
// await assetManager.getAssetsByGroup('objects').then((assets) => {
|
|
||||||
// assets.forEach((asset) => {
|
|
||||||
// if (scene.load.textureManager.exists(asset.key)) return
|
|
||||||
// scene.textures.addBase64(asset.key, asset.data)
|
|
||||||
// })
|
|
||||||
// })
|
|
||||||
//
|
|
||||||
// successCallback()
|
|
||||||
// })
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const createScene = async (scene: Phaser.Scene) => {
|
const createScene = async (scene: Phaser.Scene) => {}
|
||||||
/**
|
|
||||||
* Create sprite animations
|
|
||||||
* This is done here because phaser forces us to
|
|
||||||
*/
|
|
||||||
// assetManager.getAssetsByGroup('sprite_animations').then((assets) => {
|
|
||||||
// assets.forEach((asset) => {
|
|
||||||
// scene.anims.create({
|
|
||||||
// key: asset.key,
|
|
||||||
// frameRate: 7,
|
|
||||||
// frames: scene.anims.generateFrameNumbers(asset.key, { start: 0, end: asset.frameCount! - 1 }),
|
|
||||||
// repeat: -1
|
|
||||||
// })
|
|
||||||
// })
|
|
||||||
// })
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
@ -33,4 +33,4 @@ export async function resetPassword(email: string) {
|
|||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
return { error: error.response.data.message }
|
return { error: error.response.data.message }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,4 +4,4 @@ export function uuidv4() {
|
|||||||
|
|
||||||
export function unduplicateArray(array: any[]) {
|
export function unduplicateArray(array: any[]) {
|
||||||
return [...new Set(array.flat())]
|
return [...new Set(array.flat())]
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user