# 游戏结算层方案 ## 1. 目标 为游戏结束后的结果展示建立独立结算层,不把结算逻辑散落在: - 规则层 - HUD - 顶部提示 - 页面临时弹窗 目标是: - 统一承接结束态 - 展示成绩与摘要信息 - 支撑不同玩法的结算差异 - 为后续文创奖励、奖章、分享做扩展位 一句话: **把“比赛结束后显示点什么”提升为正式的结果场景能力。** --- ## 2. 当前现状 当前项目已经有: - `session_finished` - `gameSessionStatus = finished` - 基础成绩、里程、时长、心率等 telemetry - 游戏信息面板可读取当前状态快照 但还没有正式的: - `ResultScene` - `SummaryModel` - 结束后专属页面承载 --- ## 3. 设计原则 ### 3.1 结算不应只是提示条 结束不是一个瞬时反馈,而是一次阶段切换。 所以它需要独立层,而不是只弹一句: - 已完成 - 已结束 ### 3.2 结算要与玩法解耦 顺序赛、积分赛、后续幽灵赛、金币赛,结算内容不同。 所以应该有: - 通用结算结构 - 玩法补充区块 ### 3.3 结算要可扩 后续可能加入: - 奖章 - 排名 - 收藏卡 - 文创解锁 - 分享图 所以一开始就要留结构。 --- ## 4. 建议的新层级 建议增加: - `ResultScene` 概念上与这些层并列: - `MapPresentation` - `HUD` - `Feedback` - `ContentExperienceLayer` 职责: - 承接结束态 - 持有结算模型 - 控制显示与关闭 - 为玩法结果提供统一展示结构 --- ## 5. 建议的数据模型 ### 5.1 SummaryModel ```ts interface ResultSummaryModel { title: string subtitle: string mode: string finished: boolean durationMs: number distanceMeters: number averageSpeedKmh: number | null calories: number | null averageHeartRateBpm: number | null completedCount: number skippedCount: number totalCount: number score: number | null extraRows: Array<{ label: string; value: string }> } ``` ### 5.2 ResultSceneState ```ts interface ResultSceneState { visible: boolean summary: ResultSummaryModel | null } ``` --- ## 6. 第一阶段应展示什么 建议先做一版“基础结算页”,不要一上来做复杂演出。 ### 通用区域 - 赛事名称 - 玩法名称 - 完成状态 - 总用时 - 总里程 - 平均速度 - 卡路里 - 平均心率 ### 玩法区域 顺序赛: - 完成控制点数量 - 跳过点数量 - 总控制点数量 积分赛: - 总得分 - 已完成点数 - 未完成点数 ### 操作区 - 返回地图 - 关闭 - 后续再加重开 / 分享 --- ## 7. 配置建议 建议在配置中预留: ```json { "game": { "result": { "enabled": true, "showTelemetry": true, "showCollectedContent": true, "showAwards": false, "template": "default" } } } ``` 这意味着: - 结算是否启用 - 展示哪些区块 - 用哪个模板 都可配置。 --- ## 8. 与当前架构的关系 ### 规则层 负责: - 产出 `session_finished` ### Telemetry 负责: - 提供里程、速度、心率、卡路里等数据 ### MapEngine 负责: - 在结束时汇总通用结算模型 - 把结果快照送到页面层 ### 页面层 负责: - 渲染结算页 --- ## 9. 第一阶段最小实施范围 建议第一阶段只做: 1. `session_finished -> ResultScene` 2. 基础 summary 展示 3. 顺序赛 / 积分赛的简单差异化字段 4. 手动关闭 / 返回地图 先不要一上来做: - 复杂章节动画 - 排名 - 分享图生成 - 复杂奖章系统 --- ## 10. 后续扩展方向 这层建好后,可以逐步加: - 文创奖励 - 奖章 / 成就 - 排名 - 解锁内容 - 分享卡 - 二次引导 --- ## 11. 推荐实施顺序 1. 定义 `ResultSummaryModel` 2. 在 `MapEngine` 汇总结束快照 3. 页面层增加结果面板 4. 顺序赛 / 积分赛各补一组玩法字段 5. 再考虑动画、奖励和品牌内容 --- ## 12. 与文创体验层的配合 后续建议: - 文创体验层 - 承接“游戏中途”的体验 - 结算层 - 承接“游戏结束后”的体验 二者不要混。 如果后续结算后要解锁文创卡片,可以由: - `ResultScene` - 显示结算 - 结算完成后 - 再触发内容奖励卡 --- ## 13. 结论 当前最合适的方向不是继续在结束时零散堆文案,而是: **正式增加一层 `ResultScene`,承接顺序赛、积分赛以及未来更多玩法的统一结算体验。** 第一阶段先做基础 summary,后续再逐步接入文创奖励、奖章、排名和过场动画。