Worked on pathfinding, character animation & rotation, few enhancements

This commit is contained in:
Dennis Postma 2024-07-29 09:01:35 +02:00
parent 56d513021f
commit ea29b6f3a2
9 changed files with 49 additions and 48 deletions

6
package-lock.json generated
View File

@ -657,9 +657,9 @@
} }
}, },
"node_modules/@babel/traverse": { "node_modules/@babel/traverse": {
"version": "7.25.0", "version": "7.25.1",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.0.tgz", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.1.tgz",
"integrity": "sha512-ubALThHQy4GCf6mbb+5ZRNmLLCI7bJ3f8Q6LHBSRlSKSWj5a7dSUzJBLv3VuIhFrFPgjF4IzPF567YG/HSCdZA==", "integrity": "sha512-LrHHoWq08ZpmmFqBAzN+hUdWwy5zt7FGa/hVwMcOqW6OVtwqaoD5utfuGYU87JYxdZgLUvktAsn37j/sYR9siA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {

View File

@ -65,7 +65,6 @@ const sortedItems = computed(() => {
// Event listeners // Event listeners
gameStore.connection?.on('zone:character:join', (data: CharacterT) => { gameStore.connection?.on('zone:character:join', (data: CharacterT) => {
console.log('character:zone:join', data)
zoneStore.addCharacter(data) zoneStore.addCharacter(data)
}) })
@ -74,7 +73,6 @@ gameStore.connection?.on('zone:character:leave', (character_id: number) => {
}) })
gameStore.connection?.on('character:moved', (data: CharacterT) => { gameStore.connection?.on('character:moved', (data: CharacterT) => {
console.log('character:moved', data)
zoneStore.updateCharacter(data) zoneStore.updateCharacter(data)
}) })
@ -91,9 +89,9 @@ onBeforeMount(() => {
} }
gameStore.connection?.emit('character:zone:request', { zoneId: gameStore.character?.zoneId }, (response: TResponse) => { gameStore.connection?.emit('character:zone:request', { zoneId: gameStore.character?.zoneId }, (response: TResponse) => {
console.log(response)
zoneStore.setZone(response.zone) zoneStore.setZone(response.zone)
zoneStore.setCharacters(response.characters) const uniqueCharacters = [...new Set(response.characters)]
zoneStore.setCharacters(uniqueCharacters)
updateZoneTiles(zoneTilemap, tiles, response.zone) updateZoneTiles(zoneTilemap, tiles, response.zone)
zoneObjects.value = response.zone.zoneObjects zoneObjects.value = response.zone.zoneObjects
}) })

View File

@ -24,15 +24,17 @@
:x="tileToWorldX(props.layer, props.character.position_x, props.character.position_y)" :x="tileToWorldX(props.layer, props.character.position_x, props.character.position_y)"
:y="tileToWorldY(props.layer, props.character.position_x, props.character.position_y)" :y="tileToWorldY(props.layer, props.character.position_x, props.character.position_y)"
:origin-y="1" :origin-y="1"
:flipX="props.character.rotation === 6 || props.character.rotation === 4"
:flipY="false"
/> />
</Container> </Container>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { Container, Image, Rectangle, Text } from 'phavuer' import { Container, Image, Rectangle, RoundRectangle, Text } from 'phavuer'
import { type Character as CharacterT } from '@/types' import { type Character as CharacterT } from '@/types'
import { tileToWorldX, tileToWorldY } from '@/services/zone' import { tileToWorldX, tileToWorldY } from '@/services/zone'
import { ref, watch, computed } from 'vue' import { watch, computed } from 'vue'
interface Props { interface Props {
layer: Phaser.Tilemaps.TilemapLayer layer: Phaser.Tilemaps.TilemapLayer
@ -44,6 +46,7 @@ const props = withDefaults(defineProps<Props>(), {
}) })
const charTexture = computed(() => { const charTexture = computed(() => {
console.log('Character texture:', props.character)
if (!props.character?.characterType?.sprite) { if (!props.character?.characterType?.sprite) {
console.log('No character type or sprite found') console.log('No character type or sprite found')
return 'idle_left_down' return 'idle_left_down'
@ -61,17 +64,21 @@ const charTexture = computed(() => {
return `${spriteId}-idle_left_down` // Default fallback return `${spriteId}-idle_left_down` // Default fallback
}) })
watch(() => props.character, (newCharacter) => { watch(
if (newCharacter) { () => props.character,
console.log('Character updated:', newCharacter) (newCharacter) => {
console.log('Rotation:', newCharacter.rotation) if (newCharacter) {
console.log('Current texture:', charTexture.value) console.log('Character updated:', newCharacter)
} else { console.log('Rotation:', newCharacter.rotation)
console.log('Character is null or undefined') console.log('Current texture:', charTexture.value)
} } else {
}, { deep: true }) console.log('Character is null or undefined')
}
},
{ deep: true }
)
const createText = (text: Phaser.GameObjects.Text) => { const createText = (text: Phaser.GameObjects.Text) => {
text.setLetterSpacing(1.5) text.setLetterSpacing(1.5)
} }
</script> </script>

View File

@ -5,7 +5,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { Image, useScene } from 'phavuer' import { Image, useScene } from 'phavuer'
import { onBeforeUnmount, ref } from 'vue' import { onBeforeUnmount, ref } from 'vue'
import { useZoneEditorStore } from '@/stores/zoneEditor'
import { usePointerHandlers } from '@/composables/usePointerHandlers' import { usePointerHandlers } from '@/composables/usePointerHandlers'
import { useCameraControls } from '@/composables/useCameraControls' import { useCameraControls } from '@/composables/useCameraControls'
@ -27,4 +26,4 @@ const { setupPointerHandlers, cleanupPointerHandlers } = usePointerHandlers(scen
setupPointerHandlers() setupPointerHandlers()
onBeforeUnmount(cleanupPointerHandlers) onBeforeUnmount(cleanupPointerHandlers)
</script> </script>

View File

@ -6,14 +6,14 @@
<label class="mb-1.5 font-titles" for="name">Name</label> <label class="mb-1.5 font-titles" for="name">Name</label>
<input v-model="spriteName" class="input-cyan" type="text" name="name" placeholder="New sprite" /> <input v-model="spriteName" class="input-cyan" type="text" name="name" placeholder="New sprite" />
</div> </div>
<div class="w-full flex gap-2 mt-2 pb-4 relative"> <div class="w-full flex gap-2 mt-2 pb-4 relative">
<button class="btn-cyan px-4 py-2 flex-1 sm:flex-none sm:min-w-24" type="button" @click.prevent="saveSprite">Save</button> <button class="btn-cyan px-4 py-2 flex-1 sm:flex-none sm:min-w-24" type="button" @click.prevent="saveSprite">Save</button>
<button class="btn-bordeaux px-4 py-2 flex-1 sm:flex-none sm:min-w-24" type="button" @click.prevent="removeSprite">Remove</button> <button class="btn-bordeaux px-4 py-2 flex-1 sm:flex-none sm:min-w-24" type="button" @click.prevent="removeSprite">Remove</button>
<div class="w-[calc(100%_+_32px)] absolute left-[-15px] bottom-0 h-px bg-cyan-200"></div> <div class="w-[calc(100%_+_32px)] absolute left-[-15px] bottom-0 h-px bg-cyan-200"></div>
</div> </div>
</div> </div>
<button class="btn-cyan py-2 my-4" type="button" @click.prevent="addNewImage">New action</button> <button class="btn-cyan py-2 my-4" type="button" @click.prevent="addNewImage">New action</button>
<Accordion v-for="action in spriteActions" :key="action.id"> <Accordion v-for="action in spriteActions" :key="action.id">
<template #header> <template #header>
@ -118,19 +118,20 @@ function saveSprite() {
const updatedSprite = { const updatedSprite = {
id: selectedSprite.value.id, id: selectedSprite.value.id,
name: spriteName.value, name: spriteName.value,
spriteActions: spriteActions.value?.map((action) => { spriteActions:
return { spriteActions.value?.map((action) => {
action: action.action, return {
sprites: action.sprites, action: action.action,
origin_x: action.origin_x, sprites: action.sprites,
origin_y: action.origin_y, origin_x: action.origin_x,
isAnimated: action.isAnimated, origin_y: action.origin_y,
isLooping: action.isLooping, isAnimated: action.isAnimated,
frameSpeed: action.frameSpeed, isLooping: action.isLooping,
frameWidth: action.frameWidth, frameSpeed: action.frameSpeed,
frameHeight: action.frameHeight, frameWidth: action.frameWidth,
} frameHeight: action.frameHeight
}) ?? [] }
}) ?? []
} }
gameStore.connection?.emit('gm:sprite:update', updatedSprite, (response: boolean) => { gameStore.connection?.emit('gm:sprite:update', updatedSprite, (response: boolean) => {
@ -161,7 +162,7 @@ function addNewImage() {
isLooping: false, isLooping: false,
frameSpeed: 0, frameSpeed: 0,
frameWidth: 0, frameWidth: 0,
frameHeight: 0, frameHeight: 0
} }
if (!spriteActions.value) { if (!spriteActions.value) {

View File

@ -94,4 +94,4 @@ const drop = (event: DragEvent, dropIndex: number) => {
} }
draggedIndex.value = null draggedIndex.value = null
} }
</script> </script>

View File

@ -43,4 +43,4 @@ export function useCameraControls(scene: Phaser.Scene): any {
camera, camera,
isDragging isDragging
} }
} }

View File

@ -4,13 +4,7 @@ import { getTile, tileToWorldXY } from '@/services/zone'
import { useGameStore } from '@/stores/game' import { useGameStore } from '@/stores/game'
import { useZoneEditorStore } from '@/stores/zoneEditor' import { useZoneEditorStore } from '@/stores/zoneEditor'
export function usePointerHandlers( export function usePointerHandlers(scene: Phaser.Scene, layer: Phaser.Tilemaps.TilemapLayer, waypoint: Ref<{ visible: boolean; x: number; y: number }>, camera: Ref<Phaser.Cameras.Scene2D.Camera>, isDragging: Ref<boolean>) {
scene: Phaser.Scene,
layer: Phaser.Tilemaps.TilemapLayer,
waypoint: Ref<{ visible: boolean; x: number; y: number }>,
camera: Ref<Phaser.Cameras.Scene2D.Camera>,
isDragging: Ref<boolean>
) {
const gameStore = useGameStore() const gameStore = useGameStore()
const zoneEditorStore = useZoneEditorStore() const zoneEditorStore = useZoneEditorStore()
@ -68,6 +62,7 @@ export function usePointerHandlers(
function setupPointerHandlers() { function setupPointerHandlers() {
scene.input.on(Phaser.Input.Events.POINTER_MOVE, updateWaypoint) scene.input.on(Phaser.Input.Events.POINTER_MOVE, updateWaypoint)
scene.input.on(Phaser.Input.Events.POINTER_WHEEL, handleZoom) scene.input.on(Phaser.Input.Events.POINTER_WHEEL, handleZoom)
scene.input.on(Phaser.Input.Events.POINTER_MOVE, dragZone)
// These are for in-game only, not for in the zone editor // These are for in-game only, not for in the zone editor
if (!zoneEditorStore.active) { if (!zoneEditorStore.active) {
@ -78,6 +73,7 @@ export function usePointerHandlers(
function cleanupPointerHandlers() { function cleanupPointerHandlers() {
scene.input.off(Phaser.Input.Events.POINTER_MOVE, updateWaypoint) scene.input.off(Phaser.Input.Events.POINTER_MOVE, updateWaypoint)
scene.input.off(Phaser.Input.Events.POINTER_WHEEL, handleZoom) scene.input.off(Phaser.Input.Events.POINTER_WHEEL, handleZoom)
scene.input.off(Phaser.Input.Events.POINTER_MOVE, dragZone)
// These are for in-game only, not for in the zone editor // These are for in-game only, not for in the zone editor
if (!zoneEditorStore.active) { if (!zoneEditorStore.active) {
@ -89,4 +85,4 @@ export function usePointerHandlers(
setupPointerHandlers, setupPointerHandlers,
cleanupPointerHandlers cleanupPointerHandlers
} }
} }

View File

@ -1,4 +1,4 @@
const dev: boolean = false const dev: boolean = true
export default { export default {
name: 'New Quest', name: 'New Quest',