diff --git a/src/application/types.ts b/src/application/types.ts index efd7c26..218ee95 100644 --- a/src/application/types.ts +++ b/src/application/types.ts @@ -216,11 +216,19 @@ export type Sprite = { characterTypes: CharacterType[] } +export interface SpriteImage { + url: string + offset: { + x: number + y: number + } +} + export type SpriteAction = { id: UUID sprite: Sprite action: string - sprites: string[] + sprites: SpriteImage[] originX: number originY: number frameWidth: number diff --git a/src/components/gameMaster/assetManager/partials/sprite/SpriteDetails.vue b/src/components/gameMaster/assetManager/partials/sprite/SpriteDetails.vue index 9d76450..c4c6c3f 100644 --- a/src/components/gameMaster/assetManager/partials/sprite/SpriteDetails.vue +++ b/src/components/gameMaster/assetManager/partials/sprite/SpriteDetails.vue @@ -21,9 +21,12 @@ + + + + @@ -58,7 +77,9 @@ import type { Sprite, SpriteAction } from '@/application/types' import { uuidv4 } from '@/application/utilities' import SpriteActionsInput from '@/components/gameMaster/assetManager/partials/sprite/partials/SpriteImagesInput.vue' +import SpritePreview from '@/components/gameMaster/assetManager/partials/sprite/partials/SpritePreview.vue' import Accordion from '@/components/utilities/Accordion.vue' +import Modal from '@/components/utilities/Modal.vue' import { useAssetManagerStore } from '@/stores/assetManagerStore' import { useGameStore } from '@/stores/gameStore' import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue' @@ -176,6 +197,30 @@ watch(selectedSprite, (sprite: Sprite | null) => { spriteActions.value = sortSpriteActions(sprite.spriteActions) }) +// View sprite modal logic +const isModalOpen = ref(false) +const selectedAction = ref(null) +const previewFps = ref(0) + +function openPreviewModal(action: SpriteAction) { + selectedAction.value = action + previewFps.value = action.frameRate || 0 + isModalOpen.value = true +} + +watch(isModalOpen, (newValue) => { + if (!newValue) { + selectedAction.value = null + previewFps.value = 0 + } +}) + +function updatePreviewFps() { + if (selectedAction.value) { + selectedAction.value.frameRate = previewFps.value + } +} + onMounted(() => { if (!selectedSprite.value) return }) diff --git a/src/components/gameMaster/assetManager/partials/sprite/partials/SpriteImagesInput.vue b/src/components/gameMaster/assetManager/partials/sprite/partials/SpriteImagesInput.vue index 000ed1c..3d06e75 100644 --- a/src/components/gameMaster/assetManager/partials/sprite/partials/SpriteImagesInput.vue +++ b/src/components/gameMaster/assetManager/partials/sprite/partials/SpriteImagesInput.vue @@ -1,19 +1,43 @@ diff --git a/src/components/gameMaster/assetManager/partials/sprite/partials/SpritePreview.vue b/src/components/gameMaster/assetManager/partials/sprite/partials/SpritePreview.vue new file mode 100644 index 0000000..a4c1731 --- /dev/null +++ b/src/components/gameMaster/assetManager/partials/sprite/partials/SpritePreview.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/src/components/gameMaster/mapEditor/partials/CreateMap.vue b/src/components/gameMaster/mapEditor/partials/CreateMap.vue index 50926e4..8314248 100644 --- a/src/components/gameMaster/mapEditor/partials/CreateMap.vue +++ b/src/components/gameMaster/mapEditor/partials/CreateMap.vue @@ -13,11 +13,11 @@
- +
- +
diff --git a/src/components/utilities/Modal.vue b/src/components/utilities/Modal.vue index fc9bc7e..ec4ff29 100644 --- a/src/components/utilities/Modal.vue +++ b/src/components/utilities/Modal.vue @@ -17,7 +17,7 @@ -
@@ -81,7 +81,6 @@ const props = withDefaults(defineProps(), { const emit = defineEmits<{ 'modal:open': [] 'modal:close': [] - 'character:create': [] }>() defineExpose({ @@ -157,6 +156,11 @@ function drag(event: MouseEvent) { y.value = dragState.initialY + (event.clientY - dragState.startY) } +function closeModal() { + isModalOpenRef.value = false + emit('modal:close') +} + function toggleFullScreen() { if (isFullScreen.value) { Object.assign({ x, y, width, height }, preFullScreenState) diff --git a/src/composables/gameComposable.ts b/src/composables/gameComposable.ts index 9a18791..4ab7d16 100644 --- a/src/composables/gameComposable.ts +++ b/src/composables/gameComposable.ts @@ -59,7 +59,6 @@ export async function loadTexture(scene: Phaser.Scene, textureData: TextureData) export async function loadSpriteTextures(scene: Phaser.Scene, sprite_id: string) { if (!sprite_id) return false - // @TODO: Fix this const spriteStorage = new SpriteStorage() const sprite = await spriteStorage.get(sprite_id)