+
+
+
+
+
+ {{ t('ui.gameEnd') }}
+ +
+
+
+
+
+
+
+
+
+
+
+ diff --git a/ROADMAP.md b/ROADMAP.md index 32b9ad3..dd2bbe5 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -896,36 +896,34 @@ QTE 成功 / 到达隐藏结局 / 通关等"事件型"成就,通过在对应 e - [x] `src/App.vue` — 主菜单 + 游戏内"设置"按钮;Space 暂停/恢复带遮罩;QTE 参数传入引擎 - [x] 验证:TypeScript + Vite build 通过 -### P17 全局统计 + 主菜单 — 通关数据展示 + 统一入口(待实现) +### P17 主菜单统一化 — 游戏入口整理 ✅ 已完成 2026-06-09 -目标:通关后展示统计数据(线索数、结局数、QTE 成功/失败次数),所有入口整合到统一主菜单。 +目标:将当前散落在 `start-overlay` 中的 7 个按钮整合到一个 `MainMenu.vue` 统一组件中, +游戏结束后不再只用"游戏结束"大字,而是显示同样的入口栏。 -**全局统计数据定义:** +**设计决策:** 全局统计面板废弃。P14 成就系统和 P15 章节回顾已覆盖玩家行为追踪需求, +业界交互式电影游戏(Detroit / Dark Pictures / Telltale)也不做全局数字统计面板。 -```json -{ - "stats": [ - { "id": "clues_found", "label": "线索发现数", "variable": "investigation", "icon": "🔍" }, - { "id": "qte_wins", "label": "QTE 成功次数", "variable": "qte_succeeded", "icon": "🎯" }, - { "id": "endings_count", "label": "达成结局数", "type": "endings", "icon": "🏁" } - ] -} +**菜单结构:** + +``` +┌──────────────────────────────┐ +│ [中文] [English] │ ← 语言切换 +│ │ +│ [开始游戏] [继续上次进度] │ +│ │ +│ [章节] [成就] [画廊] [设置] │ +│ │ +└──────────────────────────────┘ ``` -数据从 `StateManager.variables` 读取。`type: "endings"` 的统计项从 `visitedSceneIds ∩ endings[].sceneId` 计算。 - -**主菜单界面:** - -统一入口组件 `MainMenu.vue`,整合:新游戏 / 继续 / 章节选择 / 成就 / 画廊 / 设置 / 语言切换。 +游戏结束后展示同样的按钮栏 + 标题"游戏结束"。 **实现清单:** -- [ ] `engine/types.ts` — `GameData.stats: StatDef[]` -- [ ] `src/components/MainMenu.vue` — 主菜单统一入口,所有按钮整齐排列 -- [ ] `src/components/StatsPanel.vue` — 通关后统计面板 -- [ ] `src/App.vue` — 游戏结束后展示 StatsPanel;主菜单用 MainMenu 替代当前散装按钮 -- [ ] `public/scenes/demo.json` — `stats` 定义 -- [ ] 验证:主菜单入口完整、通关后统计数据正确、统计刷新后仍然准确 +- [x] `src/components/MainMenu.vue` — 统一主菜单组件:两行按钮(开始/继续 + 章节/成就/画廊/设置)+ 语言切换 + 游戏结束标题模式 +- [x] `src/App.vue` — 使用 `MainMenu` 替代散装 `start-overlay` 按钮 + `game-end-overlay`;移除 60 行旧 CSS +- [x] 验证:TypeScript + Vite build 通过 ## 依赖清单 diff --git a/src/App.vue b/src/App.vue index e976b7e..8278f65 100644 --- a/src/App.vue +++ b/src/App.vue @@ -8,7 +8,7 @@ import HotspotLayer from '@/components/HotspotLayer.vue' import SaveLoadMenu from '@/components/SaveLoadMenu.vue' import ChapterSelect from '@/components/ChapterSelect.vue' import PlaybackBar from '@/components/PlaybackBar.vue' -import LangSwitch from '@/components/LangSwitch.vue' +import MainMenu from '@/components/MainMenu.vue' import AchievementToast from '@/components/AchievementToast.vue' import AchievementPanel from '@/components/AchievementPanel.vue' import EndingGallery from '@/components/EndingGallery.vue' @@ -238,21 +238,20 @@ init() -
- +