feat: accessibility settings, subtitle/QTE improvements, docs update

This commit is contained in:
2026-06-09 19:42:08 +08:00
parent 33ad26ed52
commit c9d29019a0
8 changed files with 387 additions and 11 deletions

View File

@@ -856,9 +856,76 @@ QTE 成功 / 到达隐藏结局 / 通关等"事件型"成就,通过在对应 e
- [x] 验证TypeScript + Vite build 通过
- [ ] 未来Dagre 关键节点时间线图(`SceneNode.keyMoment?: boolean`
### P16 平台化 — 云存档 + 可访问性 + 自适应码率 + 全局统计(待实现)
<!--
### P16 自适应码率 — HLS/DASH 流媒体支持(已废弃,移入 FUTURE.md
目标:面向分发和用户多样性的补全功能。含原 P15 + 原 P13d 全局统计
离线应用模式下视频文件本地存储无网络波动和缓冲需求。HLS/DASH 在离线场景完全多余
- [x] ~~engine/core/VideoManager.ts~~
- [x] ~~package.json hls.js~~
- [x] ~~验证~~
-->
### P16 可访问性设置 — 字幕 + QTE 辅助 + 防误触 + 暂停 ✅ 已完成 2026-06-09
目标:让不同身体条件的玩家都能舒适游戏。保留 6 个高价值设置和交互改进。
**设置项:**
| 设置 | 默认 | 说明 |
|------|------|------|
| 字幕字号 | 20px | 20/24/28/32px 可选,全局统一,所有场景生效 |
| 字幕背景透明度 | 0 | 0/0.3/0.5/0.7/0.9 可选0=无背景(电影字幕风格) |
| QTE 时限放宽 | 关 | 开启后所有 QTE 时限 × 1.5 |
| QTE 按键简化 | 关 | 开启后所有 QTE 映射为空格键 |
| 防误触延迟 | 开 | 选项出现后 0.5 秒内不接受点击/按键确认,防止连续按跳过误选 |
| 可暂停 | 开 | Space 键暂停/恢复,画面冻结 + 半透明遮罩。非 ESC 菜单式覆盖 |
**入口:** 主菜单"设置"按钮 + 游戏内 ESC 菜单"设置"按钮,两处均可进入。
设置项存 localStorageQTE 参数通过 Engine API 传入 QTESystem。暂停为引擎级功能。
**实现清单:**
- [x] `src/stores/gameStore.ts` — 6 个设置项状态 + localStorage 读写
- [x] `src/components/AccessibilitySettings.vue` — 设置面板 UI下拉 + 开关 + 滑块)
- [x] `src/components/Subtitles.vue``:style` 绑定 `store.subFontSize` / `store.subBgAlpha`
- [x] `src/components/ChoicePanel.vue` — 防误触延迟(选项出现后 0.5s `pointer-events: none`
- [x] `engine/systems/QTESystem.ts``timeLimitMultiplier``singleKeyMode` 参数
- [x] `src/App.vue` — 主菜单 + 游戏内"设置"按钮Space 暂停/恢复带遮罩QTE 参数传入引擎
- [x] 验证TypeScript + Vite build 通过
### P17 全局统计 + 主菜单 — 通关数据展示 + 统一入口(待实现)
目标通关后展示统计数据线索数、结局数、QTE 成功/失败次数),所有入口整合到统一主菜单。
**全局统计数据定义:**
```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": "🏁" }
]
}
```
数据从 `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` 定义
- [ ] 验证:主菜单入口完整、通关后统计数据正确、统计刷新后仍然准确
## 依赖清单