1、bgm、鼓声、视频的播放统一通过pinia进行管理
2、优化bgm播放、点击鼓声、暂停bgm、进入webview及视频播放后退出时的bgm控制
This commit is contained in:
Wenzhe 2026-02-06 15:46:30 +08:00
parent 2c686db5a5
commit 6c2f6f31f1
4 changed files with 244 additions and 184 deletions

View File

@ -2,8 +2,11 @@
import { ref, onMounted, computed } from 'vue' import { ref, onMounted, computed } from 'vue'
import VideoPlayButton from './VideoPlayButton.vue' import VideoPlayButton from './VideoPlayButton.vue'
import VideoPlayerModal from './VideoPlayerModal.vue' import VideoPlayerModal from './VideoPlayerModal.vue'
import { usePlayerStore } from '../store/player'
import { recordInteraction } from '../api/api.js' import { recordInteraction } from '../api/api.js'
const playerStore = usePlayerStore()
// //
const props = defineProps({ const props = defineProps({
// //
@ -55,9 +58,6 @@ const parallaxOffset = computed(() => {
return props.scrollPosition * 0.1 return props.scrollPosition * 0.1
}) })
// BGM
const wasBgPlayingBeforeWebview = ref(false)
// webview // webview
const openWebview = () => { const openWebview = () => {
// //
@ -77,20 +77,11 @@ const openWebview = () => {
// //
checkSealCollection() checkSealCollection()
// BGM
wasBgPlayingBeforeWebview.value = props.isMusicPlaying
// webview // webview
emit('webview-open') emit('webview-open')
// BGM // BGM
if (props.isMusicPlaying) {
emit('pause-bgm', 'webview') emit('pause-bgm', 'webview')
}
// webview
uni.setStorageSync('isOpeningWebview', true)
uni.setStorageSync('wasMusicPlayingBeforeWebview', props.isMusicPlaying)
uni.navigateTo({ uni.navigateTo({
url: '/pages/webview/webview', url: '/pages/webview/webview',
@ -105,7 +96,7 @@ const openWebview = () => {
duration: 1500 duration: 1500
}) })
// BGM // BGM
if (wasBgPlayingBeforeWebview.value) { if (props.isMusicPlaying) {
emit('resume-bgm') emit('resume-bgm')
} }
// webview // webview

View File

@ -106,8 +106,9 @@ watch(() => props.isVideoPlaying, (newIsVideoPlaying) => {
if (newIsVideoPlaying && isDrumPlaying.value && drumPlayer.value) { if (newIsVideoPlaying && isDrumPlaying.value && drumPlayer.value) {
drumPlayer.value.stop() drumPlayer.value.stop()
isDrumPlaying.value = false isDrumPlaying.value = false
// BGM // BGM
emit('resume-bgm') //
console.log('视频开始播放停止鼓声但不恢复BGM播放')
} }
}) })
@ -262,11 +263,10 @@ const openVideoPlayer = () => {
isDrumPlaying.value = false isDrumPlaying.value = false
drumPlayer.value.destroy() drumPlayer.value.destroy()
drumPlayer.value = null drumPlayer.value = null
// BGM // BGM
emit('resume-bgm')
} }
showVideoPlayer.value = true showVideoPlayer.value = true
emit('video-open') emit('video-open', true) // isQianmenVideo=true
} }
// //

View File

@ -2,6 +2,7 @@
import { ref, onMounted, onUnmounted, computed, watch, nextTick } from 'vue' import { ref, onMounted, onUnmounted, computed, watch, nextTick } from 'vue'
import { useSceneStore } from '../store/scene' import { useSceneStore } from '../store/scene'
import { useCollectionStore } from '../store/collection' import { useCollectionStore } from '../store/collection'
import { usePlayerStore } from '../store/player'
import { recordPageVisit, saveUserInfo, generateCoupletPoster } from '../api/api.js' import { recordPageVisit, saveUserInfo, generateCoupletPoster } from '../api/api.js'
import LongImageViewer from './LongImageViewer.vue' import LongImageViewer from './LongImageViewer.vue'
import MediaPlayer from './MediaPlayer.vue' import MediaPlayer from './MediaPlayer.vue'
@ -18,6 +19,7 @@ import LoadingComponent from './LoadingComponent.vue'
const sceneStore = useSceneStore() const sceneStore = useSceneStore()
const collectionStore = useCollectionStore() const collectionStore = useCollectionStore()
const playerStore = usePlayerStore()
// //
const activeSceneIndex = ref(0) const activeSceneIndex = ref(0)
@ -57,8 +59,6 @@ const isAutoScrolling = ref(false)
const showLoading = ref(true) const showLoading = ref(true)
// //
const isImagesLoaded = ref(false) const isImagesLoaded = ref(false)
//
const isMusicPlaying = ref(false)
// //
const audioPlayer = ref(null) const audioPlayer = ref(null)
@ -117,13 +117,6 @@ const scenes = ref([
const sceneInteractiveStates = ref(scenes.value.map(() => false)) const sceneInteractiveStates = ref(scenes.value.map(() => false))
// //
const sealCollectedStates = ref(scenes.value.map(() => false)) const sealCollectedStates = ref(scenes.value.map(() => false))
//
const isVideoPlaying = ref(false)
// webview
const isWebviewOpening = ref(false)
//
const isDrumPlaying = ref(false)
// //
const collectedItems = computed(() => { const collectedItems = computed(() => {
@ -149,7 +142,7 @@ const collectionProgress = computed(() => {
// BGM // BGM
const isBgmButtonDisabled = computed(() => { const isBgmButtonDisabled = computed(() => {
return isVideoPlaying.value || isDrumPlaying.value return playerStore.isBgmButtonDisabled
}) })
// EndPage // EndPage
@ -247,7 +240,7 @@ const handleStart = () => {
console.log('点击开始按钮hasScrolled:', hasScrolled.value) console.log('点击开始按钮hasScrolled:', hasScrolled.value)
// //
if (!isMusicPlaying.value) { if (!playerStore.isMusicPlaying) {
console.log('背景音乐未播放,开始播放') console.log('背景音乐未播放,开始播放')
toggleMusic() toggleMusic()
} }
@ -344,10 +337,10 @@ const toggleMusic = () => {
initMusicPlayer() initMusicPlayer()
} }
if (isMusicPlaying.value) { if (playerStore.isMusicPlaying) {
// //
audioPlayer.value.pause() audioPlayer.value.pause()
isMusicPlaying.value = false playerStore.setMusicPlaying(false)
console.log('音乐已暂停') console.log('音乐已暂停')
} else { } else {
// //
@ -357,7 +350,7 @@ const toggleMusic = () => {
if (result && typeof result.then === 'function') { if (result && typeof result.then === 'function') {
// Web使Promise // Web使Promise
result.then(() => { result.then(() => {
isMusicPlaying.value = true playerStore.setMusicPlaying(true)
console.log('音乐已开始播放') console.log('音乐已开始播放')
}).catch(error => { }).catch(error => {
console.error('音乐播放失败(需要用户交互):', error) console.error('音乐播放失败(需要用户交互):', error)
@ -365,7 +358,7 @@ const toggleMusic = () => {
}) })
} else { } else {
// //
isMusicPlaying.value = true playerStore.setMusicPlaying(true)
console.log('音乐已开始播放') console.log('音乐已开始播放')
} }
} catch (error) { } catch (error) {
@ -614,14 +607,7 @@ const handleQianmenHeightChanged = (height) => {
console.log('当前CSS变量:', getComputedStyle(document.documentElement).getPropertyValue('--scene-height')) console.log('当前CSS变量:', getComputedStyle(document.documentElement).getPropertyValue('--scene-height'))
} }
// BGM
const wasMusicPlayingBeforeVideo = ref(false)
// BGM
const wasMusicPlayingBeforeDrum = ref(false)
// webviewBGM
const wasMusicPlayingBeforeWebview = ref(false)
// //
import { onShow } from '@dcloudio/uni-app' import { onShow } from '@dcloudio/uni-app'
@ -629,77 +615,36 @@ import { onShow } from '@dcloudio/uni-app'
// //
onShow(() => { onShow(() => {
// webviewBGM // webviewBGM
const isOpeningWebview = uni.getStorageSync('isOpeningWebview')
const wasMusicPlayingBeforeWebview = uni.getStorageSync('wasMusicPlayingBeforeWebview')
const wasMusicPlayingBeforeDrum = uni.getStorageSync('wasMusicPlayingBeforeDrum')
const isVideoPlaying = uni.getStorageSync('isVideoPlaying')
const wasMusicPlayingBeforeVideo = uni.getStorageSync('wasMusicPlayingBeforeVideo')
console.log('onShow - 页面显示:', { console.log('onShow - 页面显示:', {
isOpeningWebview, isOpeningWebview: playerStore.isWebviewOpening,
wasMusicPlayingBeforeWebview, wasMusicPlayingBeforeWebview: playerStore.wasMusicPlayingBeforeWebview,
wasMusicPlayingBeforeDrum, wasMusicPlayingBeforeDrum: playerStore.wasMusicPlayingBeforeDrum,
isVideoPlaying, isVideoPlaying: playerStore.isVideoPlaying,
wasMusicPlayingBeforeVideo, wasMusicPlayingBeforeVideo: playerStore.wasMusicPlayingBeforeVideo,
currentIsMusicPlaying: isMusicPlaying.value, currentIsMusicPlaying: playerStore.isMusicPlaying,
audioPlayerExists: !!audioPlayer.value audioPlayerExists: !!audioPlayer.value
}) })
if (isOpeningWebview) { if (playerStore.isWebviewOpening) {
// webview
// uni.getStorageSync
const hasDrumFlag = wasMusicPlayingBeforeDrum !== '' && wasMusicPlayingBeforeDrum !== undefined && wasMusicPlayingBeforeDrum !== null
console.log('检查鼓声标记:', { hasDrumFlag, wasMusicPlayingBeforeDrum })
if (hasDrumFlag) {
console.log('从鼓声播放时进入webview恢复BGM状态:', wasMusicPlayingBeforeDrum)
// BGM
const shouldPlay = wasMusicPlayingBeforeDrum === 'true' || wasMusicPlayingBeforeDrum === true || wasMusicPlayingBeforeDrum === 1 || wasMusicPlayingBeforeDrum === '1'
if (shouldPlay && !isMusicPlaying.value) {
// audioPlayer
if (!audioPlayer.value) {
initMusicPlayer()
}
if (audioPlayer.value) {
try {
console.log('尝试恢复BGM播放鼓声场景')
const result = audioPlayer.value.play()
// play()PromiseWeb
if (result && typeof result.then === 'function') {
// Web使Promise
result.then(() => {
isMusicPlaying.value = true
console.log('全局BGM已恢复播放从webview返回之前鼓声播放')
}).catch(error => {
console.error('恢复BGM播放失败:', error)
// 使UI
isMusicPlaying.value = true
})
} else {
// Web
isMusicPlaying.value = true
console.log('全局BGM已恢复播放从webview返回之前鼓声播放')
}
} catch (error) {
console.error('恢复BGM播放失败:', error)
// 使UI
isMusicPlaying.value = true
}
}
}
//
uni.removeStorageSync('wasMusicPlayingBeforeDrum')
} else {
// webviewBGM // webviewBGM
// wasMusicPlayingBeforeWebview
const wasPlaying = wasMusicPlayingBeforeWebview === 'true' || wasMusicPlayingBeforeWebview === true || wasMusicPlayingBeforeWebview === 1 || wasMusicPlayingBeforeWebview === '1'
console.log('正常webview返回恢复BGM状态:', { console.log('正常webview返回恢复BGM状态:', {
wasMusicPlayingBeforeWebview, wasMusicPlayingBeforeWebview: playerStore.wasMusicPlayingBeforeWebview,
wasPlaying, wasMusicPlayingBeforeDrum: playerStore.wasMusicPlayingBeforeDrum,
currentIsMusicPlaying: isMusicPlaying.value, currentIsMusicPlaying: playerStore.isMusicPlaying,
audioPlayerExists: !!audioPlayer.value audioPlayerExists: !!audioPlayer.value
}) })
if (wasPlaying && !isMusicPlaying.value) {
// BGM
// 1wasMusicPlayingBeforeWebviewtruewebviewBGM
// 2wasMusicPlayingBeforeDrumtrueBGM
// 3wasMusicPlayingBeforeWebviewwasMusicPlayingBeforeDrumfalseisDrumPlayingtruewebviewBGM
// 4BGM
const shouldResumeBGM = playerStore.wasMusicPlayingBeforeWebview || playerStore.wasMusicPlayingBeforeDrum
console.log('是否应该恢复BGM播放:', shouldResumeBGM)
// BGM
if (shouldResumeBGM && !playerStore.isMusicPlaying) {
// audioPlayer // audioPlayer
if (!audioPlayer.value) { if (!audioPlayer.value) {
initMusicPlayer() initMusicPlayer()
@ -712,39 +657,42 @@ onShow(() => {
if (result && typeof result.then === 'function') { if (result && typeof result.then === 'function') {
// Web使Promise // Web使Promise
result.then(() => { result.then(() => {
isMusicPlaying.value = true playerStore.setMusicPlaying(true)
console.log('全局BGM已恢复播放从webview返回') console.log('全局BGM已恢复播放从webview返回')
}).catch(error => { }).catch(error => {
console.error('恢复BGM播放失败:', error) console.error('恢复BGM播放失败:', error)
// 使UI // 使UI
isMusicPlaying.value = true playerStore.setMusicPlaying(true)
}) })
} else { } else {
// Web // Web
isMusicPlaying.value = true playerStore.setMusicPlaying(true)
console.log('全局BGM已恢复播放从webview返回') console.log('全局BGM已恢复播放从webview返回')
} }
} catch (error) { } catch (error) {
console.error('恢复BGM播放失败:', error) console.error('恢复BGM播放失败:', error)
// 使UI // 使UI
isMusicPlaying.value = true playerStore.setMusicPlaying(true)
} }
} }
} else {
// BGM
console.log('BGM保持暂停状态从webview返回')
} }
}
// // webview
uni.removeStorageSync('isOpeningWebview') playerStore.setWebviewOpening(false)
uni.removeStorageSync('wasMusicPlayingBeforeWebview')
// BGM // BGM
isDrumPlaying.value = false playerStore.setDrumPlaying(false)
console.log('重置isDrumPlaying为false当前isBgmButtonDisabled:', isBgmButtonDisabled.value) console.log('重置isDrumPlaying为false当前isBgmButtonDisabled:', isBgmButtonDisabled.value)
// webview // webview
handleWebviewClose() handleWebviewClose()
} else if (isVideoPlaying) { // BGMwebview
playerStore.wasMusicPlayingBeforeDrum = false
} else if (playerStore.isVideoPlaying) {
// BGM // BGM
console.log('从视频返回恢复BGM状态:', wasMusicPlayingBeforeVideo) console.log('从视频返回恢复BGM状态:', playerStore.wasMusicPlayingBeforeVideo)
const wasPlaying = wasMusicPlayingBeforeVideo === 'true' || wasMusicPlayingBeforeVideo === true || wasMusicPlayingBeforeVideo === 1 || wasMusicPlayingBeforeVideo === '1' if (playerStore.wasMusicPlayingBeforeVideo && !playerStore.isMusicPlaying) {
if (wasPlaying && !isMusicPlaying.value) {
// audioPlayer // audioPlayer
if (!audioPlayer.value) { if (!audioPlayer.value) {
initMusicPlayer() initMusicPlayer()
@ -757,71 +705,79 @@ onShow(() => {
if (result && typeof result.then === 'function') { if (result && typeof result.then === 'function') {
// Web使Promise // Web使Promise
result.then(() => { result.then(() => {
isMusicPlaying.value = true playerStore.setMusicPlaying(true)
console.log('全局BGM已恢复播放从视频返回') console.log('全局BGM已恢复播放从视频返回')
}).catch(error => { }).catch(error => {
console.error('恢复BGM播放失败:', error) console.error('恢复BGM播放失败:', error)
// 使UI // 使UI
isMusicPlaying.value = true playerStore.setMusicPlaying(true)
}) })
} else { } else {
// Web // Web
isMusicPlaying.value = true playerStore.setMusicPlaying(true)
console.log('全局BGM已恢复播放从视频返回') console.log('全局BGM已恢复播放从视频返回')
} }
} catch (error) { } catch (error) {
console.error('恢复BGM播放失败:', error) console.error('恢复BGM播放失败:', error)
// 使UI // 使UI
isMusicPlaying.value = true playerStore.setMusicPlaying(true)
} }
} }
} }
//
uni.removeStorageSync('isVideoPlaying')
uni.removeStorageSync('wasMusicPlayingBeforeVideo')
// //
isVideoPlaying.value = false playerStore.setVideoPlaying(false)
console.log('重置isVideoPlaying为false当前isBgmButtonDisabled:', isBgmButtonDisabled.value) console.log('重置isVideoPlaying为false当前isBgmButtonDisabled:', isBgmButtonDisabled.value)
} }
}) })
// //
const handleVideoOpen = () => { const handleVideoOpen = (isQianmenVideo = false) => {
// //
isVideoPlaying.value = true playerStore.setVideoPlaying(true)
//
uni.setStorageSync('isVideoPlaying', true)
// BGM // BGM
wasMusicPlayingBeforeVideo.value = isMusicPlaying.value // BGM
// // BGM退BGM
uni.setStorageSync('wasMusicPlayingBeforeVideo', isMusicPlaying.value) playerStore.wasMusicPlayingBeforeVideo = playerStore.wasMusicPlayingBeforeDrum
console.log('视频打开时保存鼓声播放前的BGM状态:', playerStore.wasMusicPlayingBeforeDrum)
// BGM // BGM
if (audioPlayer.value && isMusicPlaying.value) { if (audioPlayer.value && playerStore.isMusicPlaying) {
audioPlayer.value.pause() audioPlayer.value.pause()
isMusicPlaying.value = false playerStore.setMusicPlaying(false)
console.log('全局BGM已停止视频播放中') console.log('全局BGM已停止视频播放中')
} }
// //
isDrumPlaying.value = false playerStore.setDrumPlaying(false)
// BGM
console.log('视频打开时BGM状态:', playerStore.isMusicPlaying)
console.log('视频打开时鼓声播放前的BGM状态:', playerStore.wasMusicPlayingBeforeDrum)
} }
// //
const handleVideoClose = () => { const handleVideoClose = () => {
// //
isVideoPlaying.value = false playerStore.setVideoPlaying(false)
// BGM
// BGMBGM
const shouldResumeBGM = playerStore.restoreMusicStateAfterVideo()
console.log('视频关闭时是否应该恢复BGM播放:', shouldResumeBGM)
console.log('视频关闭时BGM状态:', playerStore.isMusicPlaying)
console.log('视频关闭时鼓声播放前的BGM状态:', playerStore.wasMusicPlayingBeforeDrum)
// BGM // BGM
if (audioPlayer.value && wasMusicPlayingBeforeVideo.value && !isMusicPlaying.value) { if (audioPlayer.value && shouldResumeBGM && !playerStore.isMusicPlaying) {
try { try {
const result = audioPlayer.value.play() const result = audioPlayer.value.play()
// play()PromiseWeb // play()PromiseWeb
if (result && typeof result.then === 'function') { if (result && typeof result.then === 'function') {
// Web使Promise // Web使Promise
result.then(() => { result.then(() => {
isMusicPlaying.value = true playerStore.setMusicPlaying(true)
console.log('全局BGM已恢复播放视频已关闭') console.log('全局BGM已恢复播放视频已关闭')
}).catch(error => { }).catch(error => {
console.error('BGM恢复播放失败需要用户交互:', error) console.error('BGM恢复播放失败需要用户交互:', error)
@ -829,32 +785,34 @@ const handleVideoClose = () => {
}) })
} else { } else {
// //
isMusicPlaying.value = true playerStore.setMusicPlaying(true)
console.log('全局BGM已恢复播放视频已关闭') console.log('全局BGM已恢复播放视频已关闭')
} }
} catch (error) { } catch (error) {
console.error('BGM恢复播放失败需要用户交互:', error) console.error('BGM恢复播放失败需要用户交互:', error)
// isMusicPlayingfalse // isMusicPlayingfalse
} }
} else {
console.log('BGM保持暂停状态视频已关闭')
} }
} }
// webview // webview
const handleWebviewOpen = () => { const handleWebviewOpen = () => {
// webview // webview
isWebviewOpening.value = true playerStore.setWebviewOpening(true)
console.log('Webview即将打开') console.log('Webview即将打开')
// BGM便退webview // BGMBGM
if (isDrumPlaying.value) { // playerStore.wasMusicPlayingBeforeDrum
uni.setStorageSync('wasMusicPlayingBeforeDrum', wasMusicPlayingBeforeDrum.value) console.log('当前鼓声播放状态:', playerStore.isDrumPlaying)
} console.log('当前鼓声播放前的BGM状态:', playerStore.wasMusicPlayingBeforeDrum)
} }
// webview // webview
const handleWebviewClose = () => { const handleWebviewClose = () => {
// webview // webview
isWebviewOpening.value = false playerStore.setWebviewOpening(false)
console.log('Webview已关闭') console.log('Webview已关闭')
} }
@ -862,32 +820,49 @@ const handleWebviewClose = () => {
const pauseBgm = (source = 'drum') => { const pauseBgm = (source = 'drum') => {
// //
if (source === 'drum') { if (source === 'drum') {
isDrumPlaying.value = true playerStore.setDrumPlaying(true)
// BGM // BGM
wasMusicPlayingBeforeDrum.value = isMusicPlaying.value playerStore.saveMusicStateBeforeDrum()
console.log('保存鼓声播放前的BGM状态:', playerStore.isMusicPlaying)
} else if (source === 'webview') {
// webviewBGM
playerStore.saveMusicStateBeforeWebview()
console.log('保存webview打开前的BGM状态:', playerStore.isMusicPlaying)
// BGMBGM
// playerStore.wasMusicPlayingBeforeDrum
console.log('当前鼓声播放状态:', playerStore.isDrumPlaying)
console.log('当前鼓声播放前的BGM状态:', playerStore.wasMusicPlayingBeforeDrum)
// webviewplayerStore.wasMusicPlayingBeforeDrum
// playerStore.wasMusicPlayingBeforeDrum
} }
if (audioPlayer.value && isMusicPlaying.value) { if (audioPlayer.value && playerStore.isMusicPlaying) {
audioPlayer.value.pause() audioPlayer.value.pause()
isMusicPlaying.value = false playerStore.setMusicPlaying(false)
console.log(`全局BGM已暂停${source === 'drum' ? '鼓声播放中' : 'webview打开中'}`) console.log(`全局BGM已暂停${source === 'drum' ? '鼓声播放中' : 'webview打开中'}`)
} }
// BGM
if (source === 'webview' && playerStore.isDrumPlaying) {
console.log('webview打开时鼓声播放中保持鼓声播放前的BGM状态:', playerStore.wasMusicPlayingBeforeDrum)
}
} }
// BGM // BGM
const resumeBgm = () => { const resumeBgm = () => {
// //
isDrumPlaying.value = false playerStore.setDrumPlaying(false)
// BGM // BGM
if (audioPlayer.value && wasMusicPlayingBeforeDrum.value && !isMusicPlaying.value) { if (audioPlayer.value && playerStore.restoreMusicStateAfterDrum() && !playerStore.isMusicPlaying) {
try { try {
const result = audioPlayer.value.play() const result = audioPlayer.value.play()
// play()PromiseWeb // play()PromiseWeb
if (result && typeof result.then === 'function') { if (result && typeof result.then === 'function') {
// Web使Promise // Web使Promise
result.then(() => { result.then(() => {
isMusicPlaying.value = true playerStore.setMusicPlaying(true)
console.log('全局BGM已恢复播放鼓声已结束') console.log('全局BGM已恢复播放鼓声已结束')
}).catch(error => { }).catch(error => {
console.error('BGM恢复播放失败需要用户交互:', error) console.error('BGM恢复播放失败需要用户交互:', error)
@ -895,7 +870,7 @@ const resumeBgm = () => {
}) })
} else { } else {
// //
isMusicPlaying.value = true playerStore.setMusicPlaying(true)
console.log('全局BGM已恢复播放鼓声已结束') console.log('全局BGM已恢复播放鼓声已结束')
} }
} catch (error) { } catch (error) {
@ -903,6 +878,10 @@ const resumeBgm = () => {
// isMusicPlayingfalse // isMusicPlayingfalse
} }
} }
// playerStore.wasMusicPlayingBeforeDrum
// webview使
console.log('鼓声结束后鼓声播放前的BGM状态:', playerStore.wasMusicPlayingBeforeDrum)
} }
// 使scroll-view // 使scroll-view
@ -919,7 +898,7 @@ onUnmounted(() => {
<!-- 音乐控制按钮 --> <!-- 音乐控制按钮 -->
<div <div
class="music-control" class="music-control"
:class="{ 'music-playing': isMusicPlaying, 'disabled': isBgmButtonDisabled }" :class="{ 'music-playing': playerStore.isMusicPlaying, 'disabled': isBgmButtonDisabled }"
@click="toggleMusic" @click="toggleMusic"
> >
<img src="/static/images/music_on.png" alt="音乐" class="music-icon" /> <img src="/static/images/music_on.png" alt="音乐" class="music-icon" />
@ -999,7 +978,7 @@ onUnmounted(() => {
:active="activeSceneIndex === 4" :active="activeSceneIndex === 4"
:scroll-position="scrollContainer?.value?.scrollTop || 0" :scroll-position="scrollContainer?.value?.scrollTop || 0"
:video-url="scenes[4].videoUrl" :video-url="scenes[4].videoUrl"
:is-music-playing="isMusicPlaying" :is-music-playing="playerStore.isMusicPlaying"
:page-visit-uuid="pageVisitUuid" :page-visit-uuid="pageVisitUuid"
@collect-seal="collectSeal(4)" @collect-seal="collectSeal(4)"
@video-open="handleVideoOpen" @video-open="handleVideoOpen"
@ -1015,13 +994,13 @@ onUnmounted(() => {
:active="activeSceneIndex === 5" :active="activeSceneIndex === 5"
:scroll-position="scrollContainer?.value?.scrollTop || 0" :scroll-position="scrollContainer?.value?.scrollTop || 0"
:video-url="scenes[5].videoUrl" :video-url="scenes[5].videoUrl"
:is-music-playing="isMusicPlaying" :is-music-playing="playerStore.isMusicPlaying"
:is-video-playing="isVideoPlaying" :is-video-playing="playerStore.isVideoPlaying"
:is-webview-opening="isWebviewOpening" :is-webview-opening="playerStore.isWebviewOpening"
:page-visit-uuid="pageVisitUuid" :page-visit-uuid="pageVisitUuid"
@collect-seal="collectSeal(5)" @collect-seal="collectSeal(5)"
@height-changed="handleQianmenHeightChanged" @height-changed="handleQianmenHeightChanged"
@video-open="handleVideoOpen" @video-open="handleVideoOpen(true)"
@video-close="handleVideoClose" @video-close="handleVideoClose"
@pause-bgm="(source) => pauseBgm(source)" @pause-bgm="(source) => pauseBgm(source)"
@resume-bgm="resumeBgm" @resume-bgm="resumeBgm"

90
store/player.js Normal file
View File

@ -0,0 +1,90 @@
import { defineStore } from 'pinia'
export const usePlayerStore = defineStore('player', {
state: () => ({
// 音乐播放状态
isMusicPlaying: false,
// 视频播放状态
isVideoPlaying: false,
// 鼓声播放状态
isDrumPlaying: false,
// webview打开状态
isWebviewOpening: false,
// 视频打开前的BGM状态
wasMusicPlayingBeforeVideo: false,
// 鼓声开始前的BGM状态
wasMusicPlayingBeforeDrum: false,
// webview打开前的BGM状态
wasMusicPlayingBeforeWebview: false
}),
getters: {
// 计算是否禁用BGM控制按钮
isBgmButtonDisabled: (state) => {
return state.isVideoPlaying || state.isDrumPlaying
}
},
actions: {
// 设置音乐播放状态
setMusicPlaying(status) {
this.isMusicPlaying = status
},
// 设置视频播放状态
setVideoPlaying(status) {
this.isVideoPlaying = status
},
// 设置鼓声播放状态
setDrumPlaying(status) {
this.isDrumPlaying = status
},
// 设置webview打开状态
setWebviewOpening(status) {
this.isWebviewOpening = status
},
// 保存视频打开前的BGM状态
saveMusicStateBeforeVideo() {
this.wasMusicPlayingBeforeVideo = this.isMusicPlaying
},
// 保存鼓声开始前的BGM状态
saveMusicStateBeforeDrum() {
this.wasMusicPlayingBeforeDrum = this.isMusicPlaying
},
// 保存webview打开前的BGM状态
saveMusicStateBeforeWebview() {
this.wasMusicPlayingBeforeWebview = this.isMusicPlaying
},
// 恢复视频关闭后的BGM状态
restoreMusicStateAfterVideo() {
return this.wasMusicPlayingBeforeVideo
},
// 恢复鼓声结束后的BGM状态
restoreMusicStateAfterDrum() {
return this.wasMusicPlayingBeforeDrum
},
// 恢复webview关闭后的BGM状态
restoreMusicStateAfterWebview() {
return this.wasMusicPlayingBeforeWebview
},
// 重置所有状态
resetState() {
this.isMusicPlaying = false
this.isVideoPlaying = false
this.isDrumPlaying = false
this.isWebviewOpening = false
this.wasMusicPlayingBeforeVideo = false
this.wasMusicPlayingBeforeDrum = false
this.wasMusicPlayingBeforeWebview = false
}
}
})