下载 App
开发日志07:收工
修改于10 小时前2 浏览综合 包含 AI 合成内容
上一篇结尾说,下一步优先级最高的是完整通关一次。
所以这一篇记录的是另一件事:把游戏做成一个能交到玩家手里的东西。


一、从「能玩」到「能交」
自己跑起来能玩,和平台愿意收,是两件完全不同的事。
第一轮梳理下来,挡在门口的是两件事:
一是包体。 我们原来是 Tauri 打包的裸 exe,四十MB。但 Tauri 在 Windows 上完全依赖系统的 WebView2 运行时——玩家机器上没装,双击 exe 就是「什么都没发生」。最糟的失败方式不是报错,是没反应。
照平台规则,可以把安装器放进游戏目录、在后台登记「运行依赖」。但那样玩家装游戏时还得联网装一次运行时。
我们选了另一条:把固定版运行时直接内嵌进包。
代价很直白——包从 41.9 MB 变成 262 MB。
换来的是:解压、双击、进游戏,不联网,不装任何东西。哪怕是一台从没联网的干净机器。
现在包里只剩两个可执行文件:游戏本体,和渲染依赖本身。没有安装器,没有启动器,没有别的程序。
二是图标。 这张图后来换过一次。第一版是我们用游戏里真实的模块贴图拼的——绝对和实机一致,但拼出来像一张零件全家福,不像图标。最后一版换成了现在这张:中间一枚青绿色晶核,四条机械臂从四角环抱过来。



二、两个「看起来不像 bug 的 bug」
这一批修的问题里,有两个特别值得写下来。
第一个:WASD 移动键失灵
玩家反馈「电脑端 WASD 按了没反应」。
我们第一反应是查键盘绑定——结果绑定完全正常,按下 d,坐标就从 640 变成 703。
真正的问题是:区域装配台打开后会冻结战局,而保存按钮点完不会自动关闭面板。
于是玩家点完「保存机库」,以为流程结束了,回到画面按 WASD——世界是冻结的,当然不动。
根因还藏了一层:保存按钮在页面加载时就绑定了保存函数,而我们后来给保存函数加了一层包装(投放携带件、关闭面板、恢复战局),但那层包装没有重新绑到按钮上。按钮始终在执行最早那个版本。
我们最后把按钮改成「保存并开始 · 区域 3」,保存后自动关闭面板、恢复战局。
第二个:分配经验值无效
玩家反馈「组件和核心升级点了没反应」。
这个更离谱:升级弹窗本身要求暂停,而升级函数又拒绝在暂停时执行。
打开弹窗 → 冻结战局(暂停)
点升级 → 升级函数:if (暂停) 返回「不是运行状态」界面和规则互相打架,结果就是永远升不了级。
更糟的是失败提示:它写进了屏幕下方那行结构日志,而那行字在界面改版时已经被隐藏了。所以玩家看到的确实是「什么都没发生」——连一句「为什么不行」都没有。
于是把「是否允许升级」的判定,从「有没有暂停」改成了「升级弹窗是不是真的开着,而且是升级模式」。用弹窗自身的状态判断,而不是另存一个布尔开关——弹窗一关,判定自动失效,不会留下「暂停状态下也能升级」的漏洞。



三、换舱为什么会卡
这是这一批里最花时间的一个。
现象很简单:从舱室走到舱室,会明显顿一下,有时候半秒。
按老办法猜,第一反应是「换舱时在加载场景」。实测打脸——换舱逻辑本身只要 0.4 到 2.2 毫秒。
真正的办法只有一个:用 CPU 模拟手机降速,然后录性能火焰图。
结果很清楚:热点不在换舱,在寻路。
具体是这样:每个敌人往玩家走,都要算一条绕开障碍的路径。算出来的路径会缓存起来复用——但缓存的键里,除了房间和障碍,还包含了一个「角度桶」(按 5 度一档)。
问题在于,敌人每个 tick 大约转 4 度。
所以几乎每个 tick 都换桶,几乎每个 tick 都重新算一遍路径。
换舱那一刻,四个敌人同时第一次寻路,叠加起来就是一帧一百多毫秒——画面直接定住。
改法是把缓存的键从「角度桶 + 布局」换成「房间 + 障碍 + 模块布局」,不含角度。安全性没有降低,因为每次调用仍然会用当帧的精确几何校验路径第一段,角度变化导致原路不通会被立刻拦下重算。
同时给「每 tick 最多规划几条」「每 tick 最多建几张图」都加了预算,超出的那几台先直行,下一帧再算。
结果:同一个战斗舱,从 1.5 秒只渲染 14 帧,变成 121 帧。
顺带还清了几个每帧热点:音效每次播放都新建一个音频对象(改成对象池)、伤害数字每帧重新排版并带模糊阴影(改成预渲染位图)、角色标签每帧重设字体。


四、手机端:那些一眼看不出、但一看就错的地方
房间小图的连通关系
电脑端的小图里,相邻舱室之间有线。手机版原来把整个连线层隐藏了——因为那层用的是贴图,缩到 150 像素宽后只剩一条几乎看不见的细线。
我们改成在节点之间直接画短横/短竖,已探索是青色实线,未探索是灰色。
这个修复反复了两次。第一次做的短杠「错位严重」——因为伪元素的定位是以内容盒为基准的,而卡片有边框和内边距,算出来的位置插进了卡片里;更糟的是同一条连接被两端各画了一次,两条短杠叠在 7 像素的缝隙里,形成一段双倍亮、两头溢出的长条。
最后改成「从两个节点的中心连一条线,让节点盖住两端」。露出来的正好是缝隙本身,不再依赖任何具体的边框、内边距、间距数值。

画面被拉扁
另一类问题更不容易发现:画布的后备分辨率和它在页面上的实际尺寸比例不一致,浏览器就会把画面拉伸。
实测装配台的预览区,横向被拉了 5.5 倍——本来是一台机甲,被拉成一根横条。
原因是面板还没展开时就去量尺寸,量到的是 100%,被兜底逻辑变成了一个固定值;等面板展开,画布已经是错的比例了。
主画面也有 17% 的压扁:弹窗打开时画布尺寸变了,但渲染循环只按「窗口大小有没有变」判断要不要重新量。
两处都改成「盒子真实变化时才重算」,并且量不到尺寸就等下一帧,绝不用兜底值污染画布。
结算页上的按钮
还有一处:核心失效的结算页上,技能卡、核心面板、「雷达」「近景」这些按钮还浮在上面。
原因是滚动这些东西的隐藏规则只认「弹窗打开」和「暂停页」,而结算页的类名不叫这两个,就漏了。这已经是同一类问题第三次出现——现在的规则是把三种页面都列全。



五、现在的状态
| 项 | 现状 |
|---|---|
| 地图 | 175 个舱室(主区 140 + 支线 35),20 个区域,7 条支线 |
| Boss | 20 个(19 个区域 Boss + 终局) |
| 零件 | 6 类,每类 5 级 |
| 道具 | 7 种一次性增益 |
| 卫星 | 最多 3 只 |
| 安装上限 | 默认 12,奖励可抬到 25 |
| 玩家核心 | 520 → 978 耐久,脉冲 14 → 22,冷却 12 → 8 tick |
| 敌人核心 | 140 → 252 耐久(成长低于玩家) |
| Boss 核心 | 五级 1512,终局三核合计 4536 |
| 装甲 | 325 耐久 |
| 炮台齐射 | 2.4 秒一轮 |
| 舱门判定 | 49.4 像素 |
| 代码层 | 电脑版 51 个 JS + 18 个 CSS;手游版 52 + 19 |
| PC 上架包 | 262 MB(含内嵌 WebView2 固定版运行时) |
| 安卓包 | 85.4 MB(arm64) |
| 规则回归 | 8 组全绿 |



六、预留的想法
其实我们还有一些预留的想法,一是时间问题;二是我们不想凭自己的判断去猜,因为过去每一次「我觉得玩家会喜欢」都被实机数据推翻过。游戏,要交给玩游戏的人来评定。
于是我们开始提交并收集反馈,这并不意味着「做完了」。
我们已经把能自己发现的问题清了一轮:键盘、升级、卡顿、画面畸变、手机操作、图标、包体。剩下的问题,靠我们自己再跑一千遍也未必能发现——因为它们只在真实的人、真实的机器、真实的习惯下才会出现。
开发日志到这里是第七篇,既是这短暂的开发周期的最后一篇,又不会是这个游戏日志的最后一篇。











