下载 App

三个进度条互相打架:一个被误诊三次的 bug

10/211 浏览综合
2026-10-19
这是整个项目最难查的问题,因为它表现得像三个不同的 bug。

症状

玩家同时靠近资源和节点,按住空格,驯养进度和修复进度会互相打断,其中一个突然归零。

第一次误诊:以为目标在乱跳

最直接的猜测是目标选择逻辑每帧重选最近的实体,导致焦点来回切。
改成「粘滞锁定」—— 一旦锁定目标,只要它还在交互范围内就绝不换。修完,问题从「频繁打断」变成「偶尔打断」。
有改善,但没解决。这种「变好了但没好」是最容易让人收手的信号。

第二次误诊:以为是走位问题

接着猜是玩家微小的移动导致超出交互半径。
加了 1.35 倍滞回:走出半径只暂停、不清零,只有走得更远才解锁。修完,还是偶尔打断。

第三次才找到真根因

主循环里 updateInteract(dt, active) 每帧都调用,松手时 active=false。当时在 else 分支里写了清空三类 target 和 progress。
也就是说,松开空格的瞬间,三套交互的进度全被清零。手指抖一下,几十秒的进度就没了。
玩家体感是「三条交互互相打架」,实际是「松手就全清」。
修法是把「暂停」和「放弃」彻底分开:
  • active=false 只走暂停分支,progress 一动不动
  • 连续空闲超过 6 秒才丢弃,防止跑遍全图回来还挂着陈年进度条
  • 信标修复例外:它是持续回血,没有进度可存,直接 beaconRepairTarget = active ? beacon : null

一个视觉问题比逻辑 bug 更难查

同期还改了 UI:原来用 if/else if 只显示一条进度条,剩下两条被顶掉不显示。玩家看到进度条消失,自然判断「被另一条打断了」。
改成三条并列显示、向上堆叠之后,很多「互相打断」的投诉自己就消失了 —— 明明逻辑没变,只是让人看见了真实状态。
这件事的教训写进了项目备忘:松手 ≠ 清零;三套交互的状态必须同时可见。

同型 bug 又冒出两次

两天后修节点时发现:进度到 100%,但孢囊不足 4,代码在 if 外面把 progress 清零。于是变成「修到满 → 清零 → 再修 → 再清零」,玩家体感是「永远修不好」。
驯养段一模一样 —— p.tameTarget = null; p.tameProgress = 0; 同样写在 else 外面。孢囊耗尽的玩家会卡在「驯到满 → 清零」的死循环里。
统一改成一条规则:扣款成功才清状态。
失败时把 progress 钳在 1,target 保留,下一帧凑够资源自动完成。提示用 1.2 秒 CD 防刷屏。
现在有断言守着这个行为,包括「补齐资源后下一帧必须完成」。
这类 bug 最麻烦的地方在于它不是崩溃,是慢慢磨掉耐心。玩家不会报「进度被清零了」,只会说「这游戏修不好东西」。
TapTap
打包是另一门手艺:Electron 与 aapt2 的四次翻车截图
打包是另一门手艺:Electron 与 aapt2 的四次翻车
2026-10-17(补记于 10-20) 代码能跑和能上架是两件事。这一章记四次翻车。 一、APK 全设备秒退 症状:TapPlay 上传后所有设备打开即闪退,日志里一行都不给。 原因查了很久:d8 只喂了 MainActivity.class,没喂匿名内部类 MainActivity$1~3。dex 缺类,真机 onCreate 直接崩。 诊断过程里的坑比 bug 本身更值得记:判断 dex
官方
一枚三角形撑起的十天:技术栈的妥协截图
一枚三角形撑起的十天:技术栈的妥协
2026-10-10 决定做《余烬荒原:群智回响》时,第一个问题不是玩法,是「怎么才能让别人双击就能玩」。 约束来自上一个项目。屏风镶嵌那套用的是 Vite + 原生 ES module,本地起服务一切正常,但把产物直接发给别人,双击 index.html 就是白屏 —— 浏览器对 file:// 下的 module 加载直接拦掉,控制台甩一行 CORS 报错,玩家看不懂,也不会去开什么本地服务器
官方
当测试开始骗你截图
当测试开始骗你
2026-10-20 测试跑绿了不代表对。这一周遇到三种「测试骗人」,每一次都差点让我得出错误结论。 一、flaky test:连跑 6 次挂 3 次 input-check 里「空格驯养野生生物」偶发失败,tamed=false。 诊断第一步是孤立环境跑 40 次驯养,40/40 成功。游戏逻辑没问题。 真凶在测试代码本身:它用 g.allies.splice() 移除野生 ally,但玩家的
官方
给一群三角形配上音乐和片头截图
给一群三角形配上音乐和片头
2026-10-20 游戏从「能玩」到「像个作品」,中间隔着声音和画面。 BGM:交叉淡入淡出 需求是按阶段换曲:标题页和引导页用一首,发育期按友群共鸣等级分前后期,四种群核降临各一首。 实现用两个 Audio 元素轮换:新的从 0 渐强,旧的渐弱到 0 之后 pause(),交叉时长 1.8 秒。 几个细节坑: 不能硬改 volume 再 play(),会听到「咔」的一声 重复 setTrack
官方