城市闭环竞速
本轮 goal:在现有第一人称电动车玩法上完成一条可玩的单人闭环赛道,包含有序检查点、多圈比赛、完赛计时、独立最佳时间、全程地图与漂移蓄能,同时保留经典玩法并验证移动端和性能。
玩法
- 从街区 TIT 北侧进入「街头赛事」,选择「计时竞速」与「云港环线」。城市环线每圈 1600 米,共两圈,总距离 3200 米;限时 210 秒。
- 路线包含热身直路、S 弯和四个较长的转角。每圈依次经过四个检查点,完成第二圈才结算;起终点位置和朝向连续,背景建筑、路灯及路面纹理每圈保持一致。
- 比赛 HUD 显示圈数、检查点、总计时、进度、漂移蓄能和本机最快完赛。全程小地图包含当前位置、朝向、圈线及检查点。
- 高于 14 m/s 时,在弯内转向并按住刹车即可蓄能;保持走线后松刹释放短时加速。直路、反方向转向、低速或碰撞无法刷出漂移奖励。越界与撞击会取消蓄能。
- 键盘复用方向键 / WASD。手机复用面板转向和刹车,也可以同时按住加速;没有新增操作按钮。蓄能、释放和检查点有视觉、声音及支持设备上的振动反馈。
- 闭环模式保留车流、踹击和昼夜主题,移除红绿灯、横向来车与变身分岔。经典直路与弯道试跑归入「经典骑行」,联机入口保留。道具版本见 道具赛。
- 结算显示每圈时间和总时间,只将有效完赛的更快时间保存到
dayun-kicker.circuit.v1.best-time。未完赛不会刷新纪录。
实现边界
track.ts 提供闭环中心线与道路坐标变换,circuitRace.ts 负责检查点、圈速、漂移和时间纪录,simulation.ts 集成规则;原有渲染适配器继续同步道路、镜头、车流及灯光。竞速计时使用实际帧间时间,包含踹击慢动作与慢帧;物理步长仍最多 50 ms,避免卡顿后车辆瞬移。暂停和切后台时停止计时。
RaceHud 负责比赛状态,MiniMap 负责完整路线,RaceResult 负责结算;Vue 组件通过 props 接收规则数据,UI 不改变比赛进度。地图、结算及非首屏菜单按需加载,沿用现有性能预算。
当前属于单人计时赛。多人竞速、AI 名次、主动氮气按钮、跳台与捷径不在本轮目标内。闭环赛道暂不使用经典模式的分数幽灵,避免将最高分当作最快时间。
验证
单元测试覆盖闭环接缝、道路宽度、完整两圈、检查点顺序、重复和反向过线、暂停、慢动作计时、漂移释放与碰撞取消、有效最快时间及存档隔离。环境测试比较相隔一圈的建筑、路灯实例与路面纹理。
浏览器测试通过真实键盘 / CDP 触控事件操作游戏,覆盖小屏启动、桌面漂移、手机三指漂移、横竖屏、完整两圈、完赛保存、刷新恢复和渲染预算。另用 350 ms 的主线程阻塞验证秒表不受物理步长限制,车辆保持小步更新。稳定性测试用昼 / 昏 / 夜三个主题反复转向、踹击及重开。
本轮自动检查:240 项单元测试、全项目类型检查、生产构建、性能预算及发布产物检查通过。首屏 JavaScript gzip 为 269.4 KiB,沿用 270 KiB 上限;首屏 CSS 为 14.3 KiB,低于 16 KiB 上限。生产资源共 40 个文件,开发调试接口已剔除。
浏览器回归覆盖 28 项用例,闭环相关的四项在最终代码上重新跑通,包含真实触控跑完两圈、存档恢复,以及键盘和三指触控漂移。生产版在 Fast 3G(1.6 Mbps 下载、150 ms 延迟)和 4 倍 CPU 降速下首次可玩为 5205 ms,低于 15000 ms 预算。
闭环触控持续测试运行 195.7 秒,三个主题共 42 轮操作及 10 次连续重开,浏览器错误为 0。抽样最高 350 次绘制、61,746 个三角形;相同开场场景的几何体数量跨度为 28、纹理数量跨度为 3,均在现有预算内。
可复现检查:
pnpm typecheck
pnpm test
pnpm build
pnpm verify:performance
pnpm verify:release
pnpm test:e2e
STABILITY_TRACK=circuit pnpm test:stability
pnpm test:performance真机尚未连接。本轮手机结果来自 Chromium 的设备模拟;需要同一 Wi-Fi 的手机访问 Vite Network 地址再验证 5–10 分钟的实际手感、音频延迟、发热和 Safari 行为。