54 lines
1.7 KiB
Vue
54 lines
1.7 KiB
Vue
<template>
|
|
<Image v-bind="imageProps" v-if="gameStore.getLoadedAsset(texture)" />
|
|
</template>
|
|
|
|
<script lang="ts" setup>
|
|
import { computed } from 'vue'
|
|
import { Image, useScene } from 'phavuer'
|
|
import type { Sprite as SpriteT, ZoneCharacter } from '@/application/types'
|
|
import { loadSpriteTextures } from '@/composables/gameComposable'
|
|
import { useGameStore } from '@/stores/gameStore'
|
|
|
|
const props = defineProps<{
|
|
zoneCharacter: ZoneCharacter
|
|
currentX: number
|
|
currentY: number
|
|
}>()
|
|
|
|
const gameStore = useGameStore()
|
|
const scene = useScene()
|
|
|
|
const texture = computed(() => {
|
|
const { rotation, characterHair } = props.zoneCharacter.character
|
|
const spriteId = characterHair?.sprite?.id
|
|
const direction = [0, 6].includes(rotation) ? 'back' : 'front'
|
|
|
|
return `${spriteId}-${direction}`
|
|
})
|
|
|
|
const isFlippedX = computed(() => [6, 4].includes(props.zoneCharacter.character.rotation ?? 0))
|
|
|
|
const imageProps = computed(() => {
|
|
// Get the current sprite action based on direction
|
|
const direction = [0, 6].includes(props.zoneCharacter.character.rotation ?? 0) ? 'back' : 'front'
|
|
const spriteAction = props.zoneCharacter.character.characterHair?.sprite?.spriteActions?.find(
|
|
spriteAction => spriteAction.action === direction
|
|
)
|
|
|
|
return {
|
|
depth: 1,
|
|
originX: Number(spriteAction?.originX) ?? 0,
|
|
originY: Number(spriteAction?.originY) ?? 0,
|
|
flipX: isFlippedX.value,
|
|
texture: texture.value,
|
|
// y: props.zoneCharacter.isMoving ? Math.floor(Date.now() / 250) % 2 : 0
|
|
}
|
|
})
|
|
|
|
loadSpriteTextures(scene, props.zoneCharacter.character.characterHair?.sprite as SpriteT)
|
|
.then(() => {})
|
|
.catch((error) => {
|
|
console.error('Error loading texture:', error)
|
|
})
|
|
</script>
|