免责声明
出于版权等原因,我不会提供以下任何制作好的字体。
案例一、《Celeste》替换中文字体、数字等宽化
Celeste 在语言设置为英文时使用 Renogare 字体,但切换到中文之后,西文部分没有继续使用 Renogare 字体,而是和中文一起使用 Noto Sans CJK SC Medium,丢失了一定的“风格”。此外,MiaoNet 的聊天框显示西文和数字时使用西文字体,但 Renogare 的数字部分不等宽,这会导致聊天时间不对齐,有气死强迫症的风险。
1.1 所需工具和字体文件
所需工具:
所需字体:
西文部分保留 Renogare,中文部分我将使用 MiSans,而数字部分我使用 Inter。中文部分使用 MiSans 是因为 Renogare 只有 Regular 一种字重,但笔画较粗,若使用 Noto Sans CJK SC,Bold 字重略细,Black 字重略粗,而 MiSans 的 Bold 字重刚好。数字部分使用 Inter 是因为 Inter 提供的多种数字风格正好可以找到一种组合匹配 Renogare 的风格,且 Inter 支持 OpenType 特性 tnum(等宽数字)。
所需其他文件:
游戏应该自带了 BMFont 所需的配置文件,在 Celeste/Content/Dialog/Fonts/configs 里,我们需要 renogare.bmfc 和 chinese-noto.bmfc。
1.2 数字等宽化
用 FontForge 打开 Renogare,删除字形 0 到 9 的字偶距,尽管你可以右键字形,在“字形信息→配对位置”里管理以 0 到 9 为第一个字形的字偶,但 FontForge 并未提供类似的界面管理以 0 到 9 为第二个字形的字偶。我能找到的最方便的方法是在菜单栏中点击“视图→组合→字偶距对”,按“第二个字符”排序。你可以右键字偶,点击“清除”,但这并不会真正地删除字偶,而只是把字偶偏移量置零(尽管这样也可以用),如果你想真正的删除字偶,在菜单栏点击“元素→字体信息→查找→GPOS”,打开两个 kern 表,手动删除字偶。
然后打开 Inter-ExtraBold(注意:请使用菜单栏的打开,不要在资源管理器中打开,以确保两个 FontForge 实例在同一个进程,不然没法跨字体复制粘贴字形),按 Ctrl+Shift+> 或者在菜单栏点击“视图→转到”跳转到 zero.tf 字形。这个字形名是哪来的?在“元素→字体信息→查找→GSUB”找到“Monospaced Numbers”查找表,查找表里会指出等宽数字的字形名为 xxx.tf。按住 Shift,选中 zero.tf 到 nine.tf,右键,点击“断开参照”,你应该看到 two.tf 到 nine.tf 预览上面的字符变成蓝底黄字。然后在菜单栏点击“元素→字体信息→通用”,将 Inter 的全字大小改为 1000(确保勾选“缩放轮廓”)以匹配 Renogare。接下来再将 zero.tf 到 nine.tf 复制粘贴到 Renogare 的 0 到 9。
你会发现 1、6 和 9 和 Renogare 原来的风格不匹配。要解决这个问题,在 nine.tf 的后面几项中应该有 six.tf.ss01 和 nine.tf.ss01,同样对这两个字形断开参照,然后分别复制粘贴到 6 和 9。接下来处理 1,Inter 的等宽 1 有横线,但非等宽 1 没有,因此将非等宽 1 复制粘贴到 Renogare,然后打开其他任何一个数字,注意到宽度为 645,右键 1,点击“设置宽度”,将宽度设置为 645,然后选中 1,点击菜单栏“度量→宽度三分之一”(个人建议使用“宽度三分之一”而不是“宽度中心”,否则 1 会看起来比较偏右,但宽度三分之一也有自己的问题,这是不带横线 1 天然的问题,无法解决)。
然后点击菜单栏“元素→字体信息”,将“字体名”、“字族名”和“人类可读名称”中的“Renogare”修改为“RenogareTnum”(不要改 Renogare 后面的部分;更改 XUID 的对话框选择“是”),这一步是因为 BMFont 需要你将字体安装到系统中,因此要和原来的 Renogare 做区分。最后点击菜单栏“文件→生成字体”,导出修改后的 Renogare,使用 FontForge 的步骤就结束了。
安装原版 Renogare 和修改后的 RenogareTnum,打开 BMFont,点击菜单栏“Options→Load configuration”,打开 renogare64.bmfc。再点击菜单栏“Options→Font settings”,将 Font 改成 RenogareTnum。然后点击菜单栏“Options→Save bitmap font as”,导出文件名为 renogare64mod.fnt,打开导出的 renogare64mod.fnt,将 face="RenogareTnum" 改为 face="Renogare",否则游戏无法启动。最后将 renogare64mod.fnt 重命名为 renogare64.fnt(不要重命名 renogare64mod_0.png),将 renogare64.fnt 和 renogare64mod_0.png 复制到 Celeste/Content/Dialog/Fonts,完成替换。
同样的方式生成 renogare192.fnt 和 renogare192mod_0.png,也复制到 Celeste/Content/Dialog/Fonts。
为什么命名为 renogare64mod_0.png 和 renogare192mod_0.png,因为 Celeste/Content/Dialog/Fonts 里的 renogare64_0.png 和 renogare192_0.png 不会生效。另外,不要尝试使用 Everest 制作资源包 mod 替换字体,Everest 会智能地合并字体而非替换字体,这不是我们想要的行为。
1.3 修改中文字体
使用 FontForge 打开刚刚制作好的 RenogareTnum(如果没有进行数字等宽化,打开原版 Renogare),点击菜单栏“元素→合并字体”,合入 MiSans-Bold,询问是否保留字偶距的对话框点击“是”或“否”均可,因为两个选项都会导致字偶距重复,游戏无法启动,你可以编写 FontForge 脚本处理重复的字偶距,但我选择在 BMFont 生成字体后再处理。
如果你使用思源黑体,在合并前有一些额外步骤,点击菜单栏“字符标识→平整”,然后点击“编码→重新编码→ISO 10646-1(Unicode,所有平面)”,然后下拉滚动条,你会看到很多红色问号的字形,删除所有红色问号的字形,不然导出时会出错,提示字形过多。选中第一个红色问号的字形,按下 Ctrl+Shift+End,就可以选中所有红色问号的字形,然后按 Delete 键或者右键菜单中点击“清除”,稍等片刻即可清除。最后保存工程或者导出字体文件均可,因为合并时既可以合入工程文件也可以合入字体文件。
接下来,如果你使用 RenogareTnum,再次打开“元素→字体信息→查找→GSUB”,你会看到在 Renogare 原来的两个查找表下面多出来了 MiSans 的查找表,MiSans 的字偶是按类属调节的,因此只需要在每个类属中去掉 zero 到 nine 即可。按下类属右边的下拉图标打开窗口,按住 Shift 点击被选中的数字,再点击确定。(注意:在选择字形的窗口点击取消会导致每个字符都被取消选择,疑似 FontForge 的 Bug,这时你只能点击“按类调节字偶距”的取消按钮回退所有更改,因此经常点击“按类调节字偶距”窗口的确定按钮保存更改)
然后同样是修改字体信息,将 RenogareTnum(或者 Renogare)修改为 RenogareSC,导出并安装字体。
打开 BMFont,点击菜单栏“Options→Load configuration”,打开 chinese-noto.bmfc。再点击菜单栏“Options→Font settings”,将 Font 改成 RenogareSC。再点击菜单栏“Options→Export options”,将 Height 改为 2048。然后选中所有字符,有两个方法,一是点击右边的“000000 Latin”,然后拉到最底下,按住 Shift 点击最后一项(合入 MiSans 时为“02CE20 CJK Extension E”,仅供参考),右键菜单中点击“Select marked subset(s)”。另一个办法是在导入 chinese-noto.bmfc 前将 chars= 开头的行删掉,然后插入一行 chars=0-2097151。
生成 chinese.fnt(由于字符很多,需要一段时间),同样是打开 chinese.fnt,将 face="RenogareSC" 改为 face="Noto Sans CJK SC Medium",否则同样是游戏无法启动(但这次只影响原版不影响 Everest)。
但这次直接复制到 Celeste/Content/Dialog/Fonts 是不行的,游戏会报错,因为字偶距重复了,使用以下脚本处理 fnt 文件即可。(脚本只是简单粗暴地删除相同字偶对重复出现的字偶距)
1 | #!/usr/bin/python3 |
处理之后就可以复制 chinese.fnt 和 chinese_*.png 到 Celeste/Content/Dialog/Fonts 了。
案例二、《Starbound》合入中文字体
我不喜欢星核汉化组提供的字体(幼圆),因此我尝试自行制作字体。
首先使用 Starbound 自带的 asset_unpacker 解包 assets/packed.pak,在解包的目录中找到 hobo.ttf。然后你还需要下载 GNU Unifont。
用 FontForge 打开 hobo.ttf,在菜单栏点击“元素→字体信息→通用”,得到上高为 768,下深为 256(全字大小为 1024)。然后打开 Unifont,同样在菜单栏点击“元素→字体信息→通用”,将上高调整为 768,下深调整为 256(全字大小应自动变为 1024;同样勾选“缩放轮廓”),等待缩放完成。然后你会发现中文的位置偏上(在游戏里会导致中文显示不全),双击 DEL 字形(因为这个字形底部贴着修改前的下深),使用测量工具,按住 Shift 测量直线,得出需要下移的距离为 128。Ctrl+A 选中全部字形,点击菜单栏“元素→变换→变换”,选择“移动”变换,X 距离为 0,Y 距离为 -128,变换后保存工程文件。
切换回 hobo.ttf,合并变换后的工程文件,然后导出字体,确保文件名为小写的 hobo.ttf,放到 Starbound/assets/user 里即可。
我也尝试了使用思源黑体(和上一个案例一样,同样需要先平整和删除红色问号字符),思源黑体的全字大小为 1024,很接近 1000,因此可以不勾选“缩放轮廓”。另外你需要下移的距离不同(对于思源黑体,建议测量 █ FULL BLOCK 字形),我测量的结果为 124。另外如果需要显示中文以外的语言,在合并前适当缩小字形,让字形保持在上高和下深之内才能完整显示(Unifont 的所有字形都在上高和下深之内,无需处理)。
ps:群友说换成 Unifont 后像《Casualty: Unknown》,我服了()
案例三、《Geometry Dash》数字等宽化
Geometry Dash 使用的字体 Pusab 数字不等宽,这会导致进度百分比不断抖动,尤其是开启了 Accurate Percentage 时。
由于 Pusab 是一款风格化的字体,不能像 Renogare 一样“移花接木”,因此我们通过缩放 Pusab 的字形来使它等宽。
使用 FontForge 打开 Pusab,记录 0 到 9 字形的宽度(提示:可以按 Ctrl+左方括号 和 Ctrl+右方括号 切换上一个 / 下一个字形),分别为 656、518、647、642、731、623、665、641、608、660,去掉一个最小值,去掉一个最大值,取平均再四舍五入得到 643。然后依次选中每一个宽度高于 643 的字形,计算缩放比例(如 643 / 656 ≈ 98.01829268%,尽量多保留几位小数,以确保缩放后宽度恰好为 643,但依然有不是 643 的可能),在右键菜单中点击“变换”,选择“缩放”,X 比例为刚才计算出的比例,Y 比例为 100%,原点选择“字形原点”(否则宽度不对),勾选“亦变换宽度”。然后选中 0 到 9 中的所有字形,右键菜单中点击“设定宽度”,将宽度设置为 643,然后右键菜单中点击“宽度中心”。
按案例一相同的方式,检查并移除 0 到 9 的字偶距(其实并没有),并修改字体名为 PusabTnum。如果直接导出字体,你会发现系统显示的字体名称依然是 Pusab 而非 PusabTnum,你需要在菜单栏“元素→字体信息→TTF名称里”删除首选字族名再导出。
然后,由于 BMFont 工具不支持渐变,因此我们使用另一个工具,我尝试过这个在线工具,它会生成负的 yoffset;我也尝试过 Hiero,它无法调整输出大小,会将大号字体拆成多张 Atlas,因此它们两个在几何冲刺里都不可用,因此不得不改用其他工具。我找到一款可用的工具,它是 SpriteGlypher。
字符集使用 NeHe,导出格式为 BMFont (ASCII),Padding 和 Spacing 设置为 1(不要设置为 0,否则游戏内字符旁边可能出现黑线),字体大小根据 Texture Quality 决定(bigFont 分别为 32、64、128px,goldFont 分别为 24、48、96px;注意 SpriteGlypher 的字体大小单位为 pt 而非 px,换算关系为 1px = 0.75pt),然后添加合适的渐变、描边和阴影效果(描边和阴影只能凭感觉调整;渐变我用取色器工具测得为 ffae02 和 ffe659)。
导出后,安装 Geode,然后安装 Texture Loader mod,在 Geometry Dash/geode/config/geode.texture-loader/packs 目录创建 pusabtnum 子目录,将生成的字体(fnt 和 png)放入子目录,然后在子目录中创建 pack.json,写入如下内容。
1 | { |
在游戏中加载这个资源包即可。
不过在游戏中你依然可能看到百分比轻微抖动,这是因为 SpriteGlypher 生成的 xadvance 因为某些原因并未一致,将 0 到 9(id=48 到 id=57)的 xadvance 手动修改一致即可。另外,部分 mod 的 label(如 QoLMod),可能明显抖动,可能是由于这些 mod 内部采用了错误的计算方式,缓解的办法是在 0 到 9 字符的左下角和右下角插入一个 1x1 单位的正方形,再用 GIMP 等软件在生成的 PNG 中抹掉多出来的小点(这也能解决上一个问题)。