下载 App

开发日志3,涌现游戏终于发布

前天 04:439 浏览
弄了一个完善的钓鱼生态,并且有各种器官,让你们自进化长成百吨巨物。开发日志(三)
抛竿、入水、咬钩、收线、张力、上鱼、逃脱、断竿、巨物、金币、购买、升级、图鉴、种植、收获、撒饵、孵化、失败,加上五个 UI 音。BGM 三首是分层的:白天木吉他民谣,夜晚极简环境音,博弈的时候切紧张律动,按昼夜自动换。
这里有个架构上的坎。这游戏是纯 UI 的,没有任何场景对象,但音源必须挂进场景才会被混音——没场景就出不了声。最后是专门建了一个空场景,只为承载音源。听着有点笨,但确实是这个引擎的约束。
另外是接入方式。三十多处按钮如果一个个插音效,又累又容易漏,而且以后加按钮还会忘。所以改成包一层:`Button.OnClick` 包一次,全场按钮点击音就有了;`Modal.Close` 包一次,所有面板关闭音也就有了。一处覆盖全部。
音效本身还加了节流和随机音高,不然连点的时候会糊成一片噪音。
顺手修了个真 bug。商店切换页签必崩,报 `attempt to call a nil value`。根因是页签的点击回调里调了一个叫 `rebuild` 的函数,但那个函数在第147行才用 `local` 定义,回调在第122行——Lua 编译期扫到第122行时,`rebuild` 还没被声明成局部变量,就把它解析成了全局变量。加个前向声明就好了。这种错光看代码很难看出来,因为函数明明就写在下面。
## 拖动地图,和一个很隐蔽的指针坑
加了拖动模式:单指自由拖地图,双指缩放。
为什么要加——默认单指是"点水面抛竿",这是最高频的操作,所以单指腾不出来自由看地图;而双指平移在桌面和模拟器上很难做。所以给了个开关,打开之后单指让给相机,看完再切回去。跟打窝模式是同一套心智:两个都要单指,所以互斥,切换的时候会清掉瞄准预览,免得切完还留个圈在屏幕上。
加完发现拖动和双指缩放完全没反应,但点水面抛竿正常。
查出来是个挺隐蔽的框架行为:`Widget:OnPointerMove` 不会冒泡到父节点。`OnPointerDown` 和 `OnPointerUp` 的代码里都写了 `elseif parent then parent:xxx()` 这个兜底分支,唯独 `OnPointerMove` 只有 `if props.onPointerMove then ... end`,没有 else。
而池塘里最上层被命中的 widget 是铺满整个区域的那个视图,我原来的回调挂在它外层的容器上。所以事件到了视图就断了,永远传不到容器。
症状跟这个差异严丝合缝:点击正常,因为 Down/Up 会冒泡;拖动没反应,因为 Move 不冒泡;双指捏合也没反应,因为捏合靠 Move 算两指距离,同样传不到。
修法是把四个指针回调全挂到真正被命中的那个 widget 上。坐标语义不用改,那个 widget 没有 transform,事件坐标还是绝对屏幕坐标,正好是抛竿。
这游戏最早叫《虫王纪》,改版成鱼之后叫《鱼王纪》,现在上架叫《钓上百吨鱼王》。
中间还认真考虑过叫《池塘日记》。当时做了一轮调研,把 TapTap 上同类游戏的命名拆成三类:治愈模拟经营类走「具体物+日常感」的公式,白日梦想屋、心动小镇、猫咪和汤这种;钓鱼类走「钓鱼+身份」的公式,欢乐钓鱼大师、钓鱼发烧友、钓鱼佬一生,极度直白,吃品类搜索流量;手账国风类走诗意四字,江南百景图、绘真妙笔千山。
调研结论是「鱼王纪」三条都不占:跟游戏定位还打架——GDD 里明确写了不做鱼王竞赛,名字却把预期拉成"我要称王";「纪」字是史诗调性,治愈类用的是「屋/镇/家/汤」这种具体的、有容器感的字;而且它一个卖点都没传达出来,手账、水彩、池塘、生态,全没进去。
《池塘日记》是冲着治愈那条路去的,「日记」同时担了手账视觉、慢节奏记录感、每天不一样的生态演化三层意思。这个名字调研文档里还留着,备选是一池春秋和池塘手账。
最后上架用的是《钓上百吨鱼王》,走的是直白那条路。这跟调研里"钓鱼类极度直白,吃品类搜索流量"的结论其实是一致的,只是选了另一条路。商店文案也是这个调性:「自进化养成鱼塘,推进鱼塘生态,钓出百吨巨物」。
#宣传图返工
做商店素材的时候,第一版11张实机截图里有5张几乎一模一样——像素差只有3到7,满分255,等于98%相同。摆在一起等于同一张图发五遍。
两个原因。一是全程用同一个"看全池"的镜头,五张都是同样的远景俯视,没有镜头变化。二是设咬钩和博弈状态的时候**忘了真的下钩**,相机跟着一个不存在的钩子,镜头纹丝不动;而张力条扬竿条在屏幕底部,又被合成图的纸带盖住了。
第二版改成三级镜头:远景1.8倍看全池生态,中景2.3倍看鱼群聚集和水草涟漪,中近景2.3倍让钓鱼人、钓线、浮漂同框,特写2.5倍让巨物占满画面。改完11张全部可辨。
过程中踩了几个坑。必须真的下钩,不然相机没东西可跟。相机要硬设缩放和坐标,只设目标值会冻在默认值——截图环境下相机平滑的调用时机不可靠。缩放不能低于1.73倍,再低池塘就填不满竖屏,顶上会露一大块空白。还有状态不能走共享文件,多个截图进程并行跑会互相覆盖,实测遇到过一次"要拍鱼群却拍到了巨物",改成命令行参数传就好了。
版式上也返工了。第一版用纸带盖住了游戏原生底栏,但那恰恰是最有信息量的部分——饵料行、打窝、抛竿、家商店图鉴菜单全在那儿。第二版定死实机内容保留不少于85%,实测游戏底栏从 y≈2570 开始,所以底部一点不加,品牌信息全挪到顶部纸带右上角。
配色直接复用了游戏自己的色板,纸底、卡片、文字、暖金、暖红全部取自 `Theme.lua`,字体也是游戏内同款的 MiSans。阴影一律用暖褐色,绝不用纯黑——GDD 里把纯黑阴影明确列为廉价感来源之一。
有个细节要说明:截图里图鉴的收集进度是注入的模拟数据。真机跑出来是0/40、0/49,因为我自己没怎么玩,一屏问号毫无吸引力。宣传图得展示解锁之后的样子,但数值本身是真实游戏状态,不是P图。
这批还没提交。
起因是字体。`nvgCreateFont` 在文件缺失的时候不抛错,只返回-1,然后 UI 静默降级——玩家看到的是一屏没有文字的空白界面。这是最难排查的一类线上故障,因为它不报错。
而字体是 DWP 资源,边玩边下,首次启动时如果还没下载完也可能查不到。所以加了显式的启动自检,把"静默失败"变成"有日志可查"。
现在的状态
游戏是完整的了。钓鱼三阶段、生态闭环、图鉴、商店、岸边之家、观赏缸、岸边植物、47种器官、9种皮肤变种、音频、拖动模式,都在。存档往返一致,确定性可复现。
上架名定为《钓上百吨鱼王》,版本号1.0.8。
游戏内全部是程序化绘制,
后面还是按路线图走内容深度:生态位从3个扩到8个,先做鲢鱼和鲫鱼;然后钓点系统、天气昼夜、池塘日记,最后是养出鱼王。有个技术债记着——鱼的蜕变换算表是硬编码的,加新生态位必须同步改,不然鱼苗没法蜕变成新鱼种。
明确不做的是战斗、塔防、关卡,通用数值成长,抽卡盲盒。#聚光灯gamejam开发者日志