Files
SoundGame/docs/design/04-space-rebuild.md
T
SoundGame Dev cc0f8c008d HTML5 重写:6 款游戏 + 用户系统 + 全局设置 + 5 轮迭代重构
- 新增 web/ 纯音频 HTML5 平台:共享引擎(手势/WebAudio 三层/设置/震动)、
  Node 零依赖服务器(静态 + 注册登录 + 进度存档 API)
- 游戏:剑与声(RPG 新作)、声命线、暗室(重设计)、音序回响(重设计)、
  节拍行者(跟随领奏重构)、盲航(同向闪避重构);声东击西删除
- 全局功能:男声/女声双套 TTS 资产、三档语速、BGM 音量三档、
  震动反馈语言(10 种震型)、服务器进度同步
- 资产:899 ogg + 899 m4a(Qwen3-TTS 双性别语音、Stable Audio 3 音效、
  Mureka BGM 4+3 首),终检零缺失
- 文档:docs/design/ 13 篇设计审查文档、docs/audio/ 资产管线、
  web/server/README.md API 文档
2026-08-29 21:55:44 +08:00

8.4 KiB
Raw Blame History

04 · 《盲航》重构方案(space rebuild)

给开发者的实现要点摘要

  1. 47 秒连续旁白教学(intro1-4 链播)改为交互式演练:每次只教一件事,玩家立刻实操一颗慢速陨石,做错不惩罚、当场重教。四个方向各练一次,单击/双击在开局后第 20s / 45s 分批引入。
  2. 闪避方向改为同向:听到左边的呼啸就向左滑——"把陨石拨开"。反向映射(现版左来右滑)是"没搞懂就死了"的最大认知负担,同向映射让方位声直接映射到同侧手势。
  3. 前 60 秒保护期:陨石慢(逼近 4s)、稀(间隔 4s)、撞了不掉血(训练护盾吸收,语音解释)。60s 后语音宣告"保护解除",难度曲线从现版起点再降一档重新爬坡。
  4. 死亡即教学:每次被撞,语音说清陨石从哪来、该怎么做;坠毁结算播报分因果。
  5. 数字拼接全部改整句:里程碑 5 句固定整句,存活时间分 4 段整句。撞击/护盾等反馈改震动。

1. 现版诊断:"没搞懂就死了"

读 web/space/game.js:

  1. 教学是 4 句连播旁白(voice/intro1..4, game.js:84-87),约 47 秒。玩家零操作听完,然后第一颗陨石 1.2 秒后就来(_scheduleSpawn(1200), game.js:111)。方位声→反向手势的映射只在旁白里说过一遍,没有任何一次实操验证。
  2. 反向闪避违反直觉(ESCAPE_SWIPE = {left:'right',...}, game.js:26)。声音从左边来,手却要往右滑——玩家在前几秒的生存窗口里要完成"定位→取反→出手"三步推理,取反这一步是死亡率主因。
  3. 三个机制同时压上来:闪避、单击加速、双击护盾,47 秒旁白里全部讲完,开局全部可用。玩家还没分清 whoosh 的方位,护盾冷却的播报已经来了。
  4. 难度起点过高:首颗逼近时长 2.8s、刷怪间隔 3.2s(game.js:42-44),对没建立映射的新手等于即死。
  5. 撞击无教学价值:voice/hit1/hit2 只报损,不说陨石从哪来、该怎么躲。玩家死了都不知道为什么。

2. 核心决策:同向闪避

听到哪边来,就向哪边滑(PUSH_SWIPE = {left:'left', right:'right', up:'up', down:'down'}),叙事包装为"挥手把陨石拨开/推引擎避开"。

  • 方位声(左声道)→ 同侧手势(左滑):零推理,反射直达,这是盲玩能成立的前提。
  • 上=高频呼啸→上滑,下=低频轰隆→下滑,保留现有 sfx 方位设计(whoosh_* 四个资产全部复用,只改映射表和文案)。
  • 判定窗口沿用现版结构(撞击前 1.5s 内滑动有效 + 250ms 宽限),仅 need 从 ESCAPE_SWIPE[dir] 改为 dir 本身。
  • 单击加速、双击护盾机制保留(现版"持续增益规避 tap 延迟"的设计是对的,game.js:146-153 注释写得很清楚),只是引入时机后移(§3.3)。

3. 新开场:交互式演练(DRILL 阶段)

3.1 演练流程

每步 = 一句短旁白 → 一颗演练陨石(逼近 4.5s,撞了不掉血)→ 玩家操作 → 反馈。做错/超时:ERROR 震动 + 一句纠正 + 同一颗重来,最多重教 2 次后自动演示通过(不卡流程)。

步 旁白(整句,≤20字/句) 演练内容
D0 "欢迎登上盲航。你只有一双耳朵。" + "陨石来了,会有声音告诉你方位。" 无陨石,建立预期
D1 "听,左边有陨石。向左滑,把它拨开!" 左来,需左滑
D2 "这次在右边。" 右来,需右滑
D3 "上面有东西,声音又尖又高。向上滑!" 上来,需上滑
D4 "下面是低频的轰隆。向下滑!" 下来,需下滑
D5 "四个方向你都会了。引擎点火,出发!" 进保护期
  • 每次成功拨开:dodge 音 + SWIPE_OK 震动 + 短肯定("漂亮。"仅 D1/D3 播,避免啰嗦)。
  • 每步旁白在演练陨石的 whoosh 响起之前播完(语音先、音效后,不叠放),whoosh 响起时玩家已知该做什么。
  • 教学期间下滑=跳过演练(二周目直接问"上滑重听演练,单击出发")。

3.2 前 60 秒保护期

演练结束进入 playing 后启动保护期(protectionUntil = runStart + 60s):

参数 保护期 保护期后
逼近时长 4.0s(恒定) 3.2s → 2.0s 爬坡(比现版 2.8→1.8 各抬 0.4s)
刷怪间隔 4.0s(恒定) 3.2s → 1.4s 爬坡
撞击 不掉血:训练护盾吸收,播 shield_block 音 + WARNING 震动 + 语音解释("护盾接住了。那颗在左边,听到左声道的呼啸就向左滑。"按实际方位选句) 正常掉血
单击/双击 第 20s / 45s 才解锁(见 §3.3) 可用

第 60s 播:"训练护盾关闭,接下来靠你自己了。" + WARNING 震动。之后难度从低档开始 120s 爬满(沿用 RAMP_MS=120s)。

3.3 单击/双击分批引入

  • 第 20 秒(保护期内):暂停刷怪 6 秒,旁白:"试试单击,引擎会短促加速,直接冲过空隙。" → 玩家单击 → boost 音 + CONFIRM 震动 + "感觉到了吗?加速期间撞不上你。" → 恢复刷怪。
  • 第 45 秒:同样暂停 6 秒:"双击展开护盾,能挡一次撞击,用完要 30 秒充能。" → 玩家双击 → shield 音 + CONFIRM 震动 → 恢复。
  • 若玩家 8 秒内没做,不等待直接继续(机制仍在,之后用上也正常生效)。
  • 护盾充能完毕语音(voice/shield_ready)保留。

4. 死亡即教学 + 结算

4.1 撞击反馈(保护期后)

每次被撞:sfx/hit + HIT 震动 + 一句归因语音(按方位 4 句预生成:"左边撞上的。听到左声道呼啸,向左滑。"),替换现版 voice/hit1/hit2 的纯报损。第二次被撞额外加半句船体状态:"船体只剩最后一次了。"

4.2 坠毁结算(整句化)

删除 numClips 拼接体系(voice/num*/n_time/n_sec/n_dodge/n_ge, game.js:47-65):

  • 存活时间 4 段整句:"不到三十秒,再试一次。""超过三十秒,有进步。""超过一分钟,合格的飞行员。""超过两分钟,王牌飞行员。"
  • 躲避数 4 段整句(合并进上句的第二句):"只拨开几颗。""拨开了十来颗。""拨开了几十颗。""拨开了一大群,漂亮。"
  • 每局结算 = 时间段整句 + 躲避段整句 + "单击再飞一次,下滑回大厅。"
  • 里程碑播报:dodges % 10 的数字拼接改为 5 句固定整句(10/20/30/40/50 颗各一句:"十颗了,稳。"…"五十颗,传奇。"),超出 50 不再播报。

4.3 最高分

存活时间最高纪录存进度(data = { bestSec: n, totalRuns: n }),结算时若破纪录加一句"新纪录!"(SUCCESS 震动)。

5. 震动映射(对齐 00 文档)

事件 震动
成功闪避 SWIPE_OK(dodge 音保留)
警报渐强(撞击前 1s / 0.5s 两段) DANGER 渐强脉冲(随 alarm 两档,第二档更密)
撞击 HIT
护盾挡下 CONFIRM
加速/护盾激活 CONFIRM
坠毁 ERROR + HIT(间隔 300ms)
演练做对 SWIPE_OK;演练做错 ERROR

现版 sfx/alarm 两档警报音保留(它是方位+距离的内容信息,不是反馈提示音),震动 DANGER 与其同步叠加。

6. 实现要点(给开发 agent)

  1. ESCAPE_SWIPE 改同向映射(一行改动),DODGE_WINDOW_MS/DODGE_GRACE_MS 判定结构不动。
  2. 新增 phase='drill':复用 _spawnObstacle 但参数化(approachMs/spawnInterval/harmless 标志),演练陨石带 harmless: true 与指定 dir。
  3. _resolve() 增加保护期分支:now < protectionUntil 时撞击走"训练护盾"路径(不掉血、播归因语音)。
  4. 暂停刷怪:_clearTimers() 后重排 _scheduleSpawn(现版已有清晰的 timer 管理,game.js:250-261)。
  5. 归因语音按方位选句:voice/hit_left/hit_right/hit_up/hit_down + voice/hit_last。
  6. 语音全部整句重录:演练 8 句、保护期 3 句、单击/双击引入 4 句、归因 5 句、结算 10 句(时间段 4 + 躲避段 4 + 新纪录 + 重开)、里程碑 5 句 ≈ 35 句 × 2 音色。删除全部 num 拼接件。
  7. 教学语音与 whoosh 的时序:语音 onComplete 后再 spawn 演练陨石,保证不叠放。
  8. 更新 web/space/README.md 手势表(同向闪避是玩家可见的最大变化,README 必须同步)。