下载 App

给一群三角形配上音乐和片头

10/21综合
2026-10-20
游戏从「能玩」到「像个作品」,中间隔着声音和画面。

BGM:交叉淡入淡出

需求是按阶段换曲:标题页和引导页用一首,发育期按友群共鸣等级分前后期,四种群核降临各一首。
实现用两个 Audio 元素轮换:新的从 0 渐强,旧的渐弱到 0 之后 pause(),交叉时长 1.8 秒。
几个细节坑:
  • 不能硬改 volume 再 play(),会听到「咔」的一声
  • 重复 setTrack 同一首歌必须直接 return,否则每帧 update 都会重启播放
  • 单曲放完但还没到切换时刻 → loop = true
还有一个隐蔽的 bug:未解锁时(玩家还没点击过页面)我只记下想播的曲子,但同时把 this.cur 也设成了那首。结果解锁后 setTrack 因为 key === this.cur 直接 return,永远补不上。修法是未解锁分支里只记 wantKey,不碰 cur。

自动播放策略:三端三种脾气

浏览器默认拦截带声音的自动播放,片头 CG 带音轨,直接被拦。
做了三层降级:
  1. 先试带声音的 play()
  1. 被拦 → muted = true 重播,顶部提示「点击画面开启声音」,点视频即可开声
  1. 打包后直接放开:Electron 加 autoplay-policy=no-user-gesture-required,Android 侧 WebView 本来就有 setMediaPlaybackRequiresUserGesture(false)
网页版双击仍然静音,这是浏览器的强制策略,绕不过去。

片头:为什么走 DOM 而不是 canvas

片头是全屏视频。放进 canvas 需要逐帧 drawImage,还要自己处理分辨率、缩放、UI 层级,收益为零。
所以用了 DOM 层:position: fixed 全屏 div + <video>,z-index: 9999。canvas 在下面照常渲染标题页,视频层一淡出,标题页自然就在那儿了。不需要「切场景」这种操作。
关键细节:片头期间必须屏蔽游戏键盘输入。否则玩家按空格跳过片头的同时,也触发了标题页的「按空格进入引导」。game.js 的 keydown 开头加了 if (EW.intro && EW.intro.active) return;。

文件缺失要能活

片头 27 MB、音乐 35 MB。任何一个加载失败都不能把玩家卡在黑屏里。
  • intro.js 监听 error,直接渐隐进标题页
  • audio.js 记录 failed[key],不再重试
  • 视频有 ended 和 error 两条路径,最终都通向同一个 _beginFade()
这个容错设计后来救了场。预览面板只托管一个 HTML 文件,所有外链媒体都拿不到,但因为降级到位,玩家看到的只是「没声音」,不是「白屏打不开」。

一个数字

APK 63 MB。游戏本体 0.11 MB,剩下 63 MB 全是片头和音乐。
如果要瘦身,压成 720p 大约能省 18 MB。但这是取
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,但玩家的
官方
三个进度条互相打架:一个被误诊三次的 bug截图
三个进度条互相打架:一个被误诊三次的 bug
2026-10-19 这是整个项目最难查的问题,因为它表现得像三个不同的 bug。 症状 玩家同时靠近资源和节点,按住空格,驯养进度和修复进度会互相打断,其中一个突然归零。 第一次误诊:以为目标在乱跳 最直接的猜测是目标选择逻辑每帧重选最近的实体,导致焦点来回切。 改成「粘滞锁定」—— 一旦锁定目标,只要它还在交互范围内就绝不换。修完,问题从「频繁打断」变成「偶尔打断」。 有改善,但没解决。这种「
官方