项目状态:v0.7.0 已完成并阶段性封版。目前已经可以作为独立 Windows 程序运行,不依赖网络、云端、AI 服务或 Godot 编辑器。
为什么做这个项目
我想做的并不是一只泛用的“可爱狗狗”桌宠。
它首先得是囡囡。
囡囡是以前陪伴过我的一只狗。真正开始做这个项目以后,我很快发现,写程序本身反而不是最难的部分。真正困难的是:怎样让屏幕上的这只狗,在不同姿势、不同动作甚至不同生成素材之间,始终还能让人一眼认出“这是她”。
如果最后只是做出一只画得很漂亮、动作很多的普通狗,那么这个项目对我来说其实没有太大意义。
所以从一开始,我给这个项目定下的原则就是:
宁可少一个动作,也不能因为功能变多,把囡囡做成另一只狗。
先确定“她应该长什么样”
项目最早做的事情不是状态机,也不是互动功能,而是整理以前留下来的照片和视频。
不同照片里的角度、光线、年龄状态都会有差别,所以不能简单找一张照片照着画。我需要从这些真实影像里提取出一些相对稳定的特征:
- 毛色和整体体型;
- 脸部和嘴部比例;
- 眼睛的颜色和神态;
- 耳朵、鼻子等细节;
- 站立、趴卧、坐下、睡觉时仍然应该保留的身份特征。
在这个基础上,我给几个主要姿态建立了相对稳定的视觉母版。
之后增加动作时,并不是“只要能生成出来就用”。有些素材单独看其实很好看,甚至比现有素材更精致,但如果第一眼不像囡囡,就不会进入正式版本。
这一步比我最初预计的耗时很多,但后来证明非常值得。
否则每增加一个动作,角色都会悄悄发生一点变化,到最后虽然每一张图都像狗,但放在一起已经不像同一只狗了。
把记忆里的习惯变成行为
我不太想凭空给她设计一套“桌宠性格”。
很多行为其实直接来自以前的囡囡。
她性格很温顺,也比较黏人,平时经常喜欢趴着。她很喜欢球和飞盘,家里人回来时会明显兴奋,有时会跳起来、转圈。玩飞盘时偶尔还会叼着不肯松口,要从嘴里拿下来才能继续扔。
睡觉的时候,她有时会仰着躺,偶尔还会露出一点舌头。
这些并不是什么复杂的游戏机制,但我反而觉得,它们比增加大量通用功能更重要。
所以现在的桌宠里已经逐步加入了这些行为:
- 站立、坐下、趴卧和睡眠;
- 抚摸后的回应;
- 长时间抚摸后偶尔翻身;
- 睡觉时偶尔仰躺;
- 少量概率出现露舌睡姿;
- 球和飞盘互动;
- 吃东西和喝水;
- 离开电脑一段时间后回来时的欢迎反应。
这些行为不会一直主动抢占注意力。
大多数时候,她只是待在桌面上。偶尔动一下、睡一会儿,或者在你主动摸她、喂她、扔玩具时给出回应。
我更希望它像桌面上存在着一个小生命,而不是一个需要不断操作的小游戏。
真正麻烦的,是让它像一个 Windows 桌宠
做到后来,我发现桌宠和普通游戏里的角色有一个很大的区别:
它没有自己的游戏窗口。
角色本身就是窗口的一部分,而且背景还必须真正透明。
这带来了一些很具体的问题。
比如角色周围的透明区域最好能够让鼠标直接穿过去,否则一只看起来只有几十厘米宽的狗,实际上可能挡住桌面上一大片区域。
但另一方面,当鼠标落在角色身上时,又必须能够正常拖动、抚摸或者打开菜单。
角色向左和向右移动时,图像虽然可以直接翻转,但窗口的可交互轮廓也必须同步翻转。否则就会出现视觉上角色已经转向,Windows 实际保留的点击区域却还在另一边的情况。
不同动作之间切换时,还会涉及透明度、窗口尺寸、轮廓更新和动画状态。如果上一段动画留下了没有清理干净的状态,甚至可能出现角色突然消失的问题。
这些东西单独看都不算很大的技术难题,但组合在一起以后,决定了这个程序最终看起来究竟像“一个真正待在桌面上的角色”,还是“一个透明窗口里播放的动画”。
有些功能,我最后选择了不要
开发过程中也做过一些效果并不理想的尝试。
例如行走动画。
让一张狗的图片移动起来很容易,但让四条腿的节奏自然、身体比例稳定,而且连续几帧看起来仍然是同一只狗,就没有那么简单。
早期版本里曾经出现过明显的步态不自然、不同动作体型不一致、左右翻转后局部被裁掉等问题。
这些问题后来有些解决了,有些则让我重新考虑一个问题:
是不是所有“能够实现”的功能,都有必要进入最终版本?
我的答案慢慢变成了否定。
这个项目没有必要为了证明“它会走路”“它会做很多动作”,强行留下一个观感一般的功能。
如果一个动作明显破坏角色本身的精细感,那么最好的处理办法可能不是继续解释它为什么不完美,而是暂时不用。
这也逐渐成为整个项目的取舍标准:
功能数量不是目标,囡囡本身才是。
从实验做到一个可以独立运行的程序
项目一路从最早的视觉验证,逐渐增加了基础状态、互动、玩具、日常行为和一些属于囡囡自己的标志动作。
到 v0.7.0,程序已经完成了一轮产品化整理。
现在它可以:
- 作为 Windows 本地程序独立运行;
- 使用透明桌面窗口;
- 拖动角色;
- 使用鼠标穿透;
- 通过右键菜单进行互动和设置;
- 使用系统托盘;
- 与球、飞盘、食物和水进行互动;
- 在不同日常状态之间自行切换;
- 不依赖网络;
- 不依赖服务器;
- 不依赖 AI 或大模型;
- 不需要安装 Godot 编辑器。
目前的正式可执行文件大约一百多 MB。
它当然还不是一个功能非常庞大的软件,但从最开始的一张角色图,到现在已经能够长期待在桌面上的独立程序,我觉得它已经完成了最重要的一步。
现在,我暂时不急着继续加东西
v0.7.0 完成以后,我暂时把这个项目阶段性封版了。
并不是因为已经没有东西可做。
走路动画还能继续优化,球和飞盘可以增加更多细节,也可以继续加入新的动作、声音或者桌面工具。
但这些都不是必须现在完成的事情。
对这个项目来说,“还能增加什么”并不是最重要的问题。
更重要的是每次增加东西之前,都先确认:
这个功能会不会让她更像囡囡?
如果答案只是“这样功能更多”,那可能没有必要做。
我希望以后再打开这个项目时,仍然可以保持最开始的那个标准:
不是为了做一只功能很多的桌宠。
只是想让囡囡,再在桌面上待一会儿。
本文整理过程中使用了 AI 辅助。项目设计、素材选择、功能取舍、测试与最终验收均由本人完成。