下载 App
#聚光灯gamejam开发者日志
昨天 18:2610 次播放综合
《纸上武林 · 侠客之战》开发日志 — 2026-10-10 今天一口气收了五件事:去一处碍眼的提示文字、补齐全部声音、把手机端偏小的画面放大、修好被我自己改坏的点击、再修好关卡卡片的白底。前四件都是「本来该有却没有」的东西,最后一件是回归 bug。
- 去掉右上角的「云端已同步」 问题:右上角铜钱下方常驻一行「云端已同步」,平时看着是噪音。
做法:CloudSave.lua 的 Status() 里,正常同步完成的分支不再返回文字,改成返回空串。读取中、保存中、待上传、失败待重试、账号变化这些异常态照旧显示——这些是真需要玩家看见的。
- 补齐音效与配乐 之前游戏是全程无声的。Sfx.lua 早就写好了播放逻辑和资源表,但 assets/audio/ 目录根本不存在,所有音效都静默降级了。
生成了 13 个音效(命中/重击/击溃/受击/战败、挥剑/重挥/轻功/真气/大招、主将怒吼/战鼓来袭/按钮点击)+ 2 首配乐(战鼓热血的战斗曲、古筝竹笛的标题曲),统一转成 .ogg。
顺带修掉两个真 bug ① pitch 传参错误(存在已久)
SoundSource:Play(sound, frequency, gain) 的 frequency 是绝对 Hz,不是倍率。原代码把 0.85 当成 0.85Hz 传进去,结果一秒素材被拉成十几个小时——所有带变调的音效几乎完全无声。改为 snd:GetFrequency() * pitch。
② DWP 加载:cache:Exists() 把资源永久挡在门外
第一版我给音频加了「文件存在才加载」的预检。但 Sound 属于边玩边下(DWP)媒体资源,而 cache:Exists() 的语义是「只查本地、不触发下载」——这道预检等于让音频永远不下、永远静音。日志里是这么暴露的:
[Sfx] 缺少音频资源: audio/bgm_title.ogg(静音) 改成走 cache:GetResourceAsync() 主动触发下载,并改掉「失败结果永久缓存」的老毛病。
打斗时「所有人」的音效 Soldier.lua 里每个士卒出手时播破空声。围攻名额上限是 3,所以同屏最多 3 声,不会糊成一片。配合敌方剑客、主将的出手音效,全场都有声响。
- 手机端画面放大 根源:这套 UI 的坐标是「设计单位」,屏幕高度恒等于 800 个设计单位。也就是说元素的占屏高比例是固定的——手机屏幕物理尺寸小,同一比例看上去就小。要放大只能提高比例。
人物:CHAR_SCALE 1.17 → 1.32;主将身高 354 → 399;军阵列距/行距 56/44 → 63/50(同步放大,否则人叠人) 界面:新增 UI_SCALE = 1.20,给 UI 单开一套坐标空间(界面空间 = 设计单位 ÷ UI_SCALE,渲染时再乘回来)。字号/按钮/血条/卡片/提示框等比放大 20%,虚拟按键也一并放大 世界与战场逻辑仍走 Config.VW/VH,人物和镜头完全不受 UI 缩放影响。
- 修手机端点击失效(自己挖的坑) 放大上线后,手机端点不动任何按钮。
根因:输入换算方向写反了。
渲染:界面坐标 u × UI_SCALE → 设计坐标 d 输入:设计坐标 d 到手,要还原界面坐标 → 必须 ÷ UI_SCALE 我在 HandleTap 和 UpdateHubDrag 里写成了 ×,所有 HUD 命中框整体偏到 1.2 倍的位置。手机屏窄,偏移后几乎点不中任何东西。
教训:给坐标空间做变换时,渲染与输入的换算方向必须成对推导,不能凭直觉各写各的。
- 修未购买关卡卡片的白底 问题:关卡界面里,没买过的关卡(如「聚贤庄」)卡面上半部分地图区是纯白,没有建筑场景;选中/已解锁的正常。
根因:World.MapImage() 把失败结果永久缓存了(IMG.list[i] = false)。而 .png 同样是 DWP 资源:文件默认不在本地,关键在于 nvgCreateImage 是直接读文件的底层调用,不经过 ResourceCache、不会触发下载。
于是链路变成:首次显示某关 → 文件还没下 → 建图失败 → 写死 false → 永不重试 → 永远白底。被选中的关卡之所以有图,是因为世界背景已经把它加载过了。
修复:文件不在本地时发起下载但不写缓存;新增 World.PreloadMapImages(),进关卡界面时一次性并行预热 10 张地图。战场背景走同一函数,一并修好。
今日收获(踩坑备忘) 坑 一句话 cache:Exists() 只查本地、不触发下载。拿它做预检会把 DWP 资源永久挡死 nvgCreateImage 直接读文件,不触发 DWP。用前必须先确认文件在本地 SoundSource:Play 的 frequency 是绝对 Hz,不是 pitch 倍率 负缓存 凡是「失败即写死」的缓存,都要先分清「真失败」和「还没准备好」 坐标变换 渲染乘、输入除——方向必须成对推导








