# 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 必须同步)。