下载 App
《新话》开发日志 02
5 小时前2 浏览综合
《新话》是一张俯视地图。一开始的想法很自然:地图用代码生成,格子、地形、河流都程序化画出来。
这条路我们撞了七次墙。逐格画符号,格子感挥之不去;描等值线,线条杂乱;连续渐变底色,变成一片灰糊;瓦片贴图试过软边、噪声边、重叠、多变体,格子感始终消不掉。程序化水墨没有手绘质感,而 Shader 那套方案直接走不通——纯 2D 项目没有 3D 渲染管线,离屏纹理根本不会被渲染。Perlin 噪声也不行,地形会碎成一片片小湖和零散山体。
结论是:能试的画法都试完了,没有一种画得出「手绘」的感觉。
于是换了个思路——把地图离线烘焙成一张画。
一张手绘地图,和一份必须严丝合缝的数据
现在的做法分三步。先离线用脚本按几何区域生成地形数据,同时输出一张色块参考图;再把参考图交给 AI,要求严格保持色块的位置与形状,重绘成水墨地图;运行时把整张底图一次性画出来,地形数据则用来跑逻辑。
两者必须严格对齐,因为部落选址、物分布、小人行走全都读地形数据。底图偏了,部落就会站在海里。
踩的坑都很具体。河流原本只有一格宽,AI 照着画成了阶梯状锯齿,于是加宽到三格;丘和荒漠原本都是土黄系,AI 分不清,于是把丘改成深橄榄绿;参考图的边缘是硬邦邦的方块,AI 会照抄出方块状的海岸线,于是对参考图做一次轻度高斯模糊,边界柔和下来,才画出自然的曲线。
现在一共有五张地图,开局随机选一张。
地图上画的是「物」,图鉴里画的才是「字」
这是全作最核心的一条美术区分。
地图上散落的不是刻好的字,是「物」本身。部落看到物,才画出一个字。所以代码里有两个完全不同的绘制入口:地图上画的是具象图标——太阳、山峰、一条鱼,因为那些字还没被造出来;而图鉴和投放面板里画的是甲骨文字形,那里展示的才是「字」。
字形不是画得好看,是画得对
既然是重演真实造字史,字形就不能凭印象手绘。
我们先查了一圈现成资源:甲骨文在 Unicode 里没有码位,方正甲骨文字体禁止软件嵌入。最后在 Wikimedia 找到一批 CC0 公共领域的甲骨文图,下载了二十八张作参考。
然后逐个字对着参考图核对、重写画法。「目」原本画成竖长方框,甲骨文实际是横向的眼形,有杏仁形的轮廓和瞳仁;「网」原本画成横格,实际是纵向网格带交叉;「上」原本是基线加竖横,实际只是两短横,下长上短。
不用字体,因为无码位也不可嵌入;不用位图,因为放大就糊。最终是在 NanoVG 里程序化画矢量字形,每个字都照着真实甲骨文写,相机放大八倍也不失真。
组合字不是「两个字并排」
甲骨文的会意字本来就是构件并排,比如「海」是水加大。但早期实现只是把两个字缩小、摆在一起,结果笔画粗细不一、间距粘连,看着像两个无关的字硬挤在一格。
现在的做法分三层:构件按位置变体,而不是等比缩小;按结构类型分配比例,左右四比六、上下三点五比六点五;构件之间还要避让、对齐基线,让两部分咬合成一个整字。
还有个容易忽略的细节——笔画宽度必须统一。组合时不再递归「画一个字」,而是直接调用底层画法,把整字的笔画宽度传进去。否则两个构件各自按自己的尺寸算笔画宽,拼起来就是一粗一细。
用得越久,字越抽象
字写出来之后不会一成不变,累计使用次数决定它的形态。
刚写出时是象形,甲骨文原样,最像那个东西;用得久了,笔画变得圆润;用得更久,整体收拢、抽象化。反过来,长期没人用的字会渐渐褪色,透明度下降、笔画变细。它不是被删掉,而是像写在纸上被时间磨去了一部分。

















