diff --git a/src/pages/team-battle.vue b/src/pages/team-battle.vue index e4e565a..8986437 100644 --- a/src/pages/team-battle.vue +++ b/src/pages/team-battle.vue @@ -115,15 +115,29 @@ const recoverData = (battleInfo, {force = false, arrowOnly = false} = {}) => { tips.value = nextTips; uni.$emit("update-tips", nextTips); // redPlayer 已在上方 find() 确认:不为 null 则当前射手在红队 - uni.$emit("update-remain", {reset: true, value: 15, team: redPlayer?'red':'blue'}); + const targetTeam = redPlayer ? 'red' : 'blue'; if (force) { - const remain = (Date.now() - battleInfo.current.startTime) / 1000; - console.log(`当前轮已进行${remain}秒`); - if (remain > 0 && remain < 15) { - updateRemainSecond.value = 15 - remain - 0.2 + // force 模式下 start.value 刚由 null 变 true,Vue 异步调度渲染, + // ShootProgress2(v-if="start")尚未挂载,update-remain 事件会被丢弃。 + // 同时 HeaderProgress 对含"重回"的 tips 拦截音频,倒计时无法依赖 + // onAudioEnded 驱动,需在 nextTick 后直接启动。 + const elapsed = (Date.now() - battleInfo.current.startTime) / 1000; + console.log(`当前轮已进行${elapsed}秒`); + if (elapsed > 0 && elapsed < 15) { + updateRemainSecond.value = 15 - elapsed - 0.2; } + const actualRemain = updateRemainSecond.value; + nextTick(() => { + // 等 ShootProgress2 挂载后再发重置事件,确保事件能被接收 + uni.$emit("update-remain", {reset: true, value: 15, team: targetTeam}); + // 重置动画完成后,直接启动倒计时(无需依赖音频结束回调) + setTimeout(() => { + uni.$emit("update-remain", {stop: false, value: actualRemain, team: targetTeam}); + }, 100); + }); } else { - updateRemainSecond.value = battleInfo.readyTime + uni.$emit("update-remain", {reset: true, value: 15, team: targetTeam}); + updateRemainSecond.value = battleInfo.readyTime; } } else { currentRound.value = battleInfo.current.round || 1;