找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 338|回复: 4

【小教程】编译DTA客户端的字库

[复制链接]
发表于 2024-8-16 21:36:25 | 显示全部楼层 |阅读模式
本帖最后由 enderseven 于 2024-8-17 12:24 编辑

别看这里的了,论坛不知道为啥吃了我好多内容。
直接下载附件的Markdown看教程

或者去Github看
https://github.com/enderseven1/xna-cncnet-client/blob/develop/Docs/XNA%E5%AD%97%E5%BA%93%E7%BC%96%E8%AF%91%E6%8C%87%E5%8D%97.md










前言

使用过DTA客户端的modder,肯定有不少人遇到过DTA汉化中文显示成“?”的现象。
这种情况很好弄,去copy心灵终结的Resources\SpriteFont012345.xnb覆盖自己的Resources里的文件。
或者有一些人不喜欢自带的字库,觉得字体不好看,或者字库不够大,有些字打不出来,想自己创建字库。
在这里,我将结合@掉叶粽的教程和我自己实践的经验发布一篇适合新手操作的教程。


配置环境
电脑上需要安装XNA Game Studio,网上有很多这样的软件包,编译DTA客户端的时候就会用到。
但是编译DTA一般只用安装.net和XNA的Visual Studio扩展(可能每个人情况不一样?)
完整的环境是有五个软件的:(你可以在一个叫XNBBuilder的Github仓库里找到)
https://github.com/mediaexplorer ... .0/XnaForVS2022.zip
1. DirectX
2. XNA Framework 4.0 Redistribution
3. XNA Game Studio 4.0 Platform Tools
4. XNA Game Studio 4.0 Shared
5. XNA Game Studio 4.0.vsix
将这五个软件各安装一遍,再下载XNBContentComplier:
https://github.com/mattleibow/XNA-4.0-Content-Compiler/releases
如果之前安装过,但还是有问题,就卸载了重新安装一遍。




编写描述文件
首先在桌面上(或者任何一个地方)创建一个文件SpriteFont0.spritefont。 别像我一样打成springfont
了解spritefont基本格式:https://docs.microsoft.com/en-us ... indows/xna/bb447759(v=xnagamestudio.42)
在文件中添加以下内容:
  1. <font color="#ffffff"><?xml version="1.0" encoding="utf-8"?>
  2. <XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
  3.   <Asset Type="Graphics:FontDescription">
  4.     <FontName>宋体</FontName>    <!-- 字体名称 -->
  5.     <Size>11</Size>    <!-- 字体大小 -->
  6.     <Spacing>1</Spacing>    <!-- 字体间距 -->
  7.     <UseKerning>true</UseKerning>    <!-- 字体布局 -->
  8.     <Style>Regular</Style>    <!-- 字体样式 -->
  9.     <DefaultCharacter>?</DefaultCharacter>    <!-- 缺省字符 -->
  10.     <CharacterRegions>    <!-- 字符集合 -->
  11.       <CharacterRegion>    <!-- 字符 -->
  12.         <Start>&#32;</Start>     <!-- 起始字符 -->
  13.         <End>&#126;</End>     <!-- 结束字符,示例这个表示字母数字和符号 -->
  14.       </CharacterRegion>
  15.     </CharacterRegions>
  16.   </Asset>
  17. </XnaContent></font>
复制代码
字体名称:你要用什么字体生成,前提是启动XNBContentComplier前就存在,如果你启动后才安装新字体,想使用这个字体会提示找不到该字体,需要重启该程序才能应用新字体,一般不用重启电脑。
字体大小:DTA客户端的字体一般是14px的,但Size不能填14。如果使用宋体,size要填写11,如果是不包含汉字的西文字体需要填10。
字体间距:每个字符间的间隔。
字体布局:微软说的是设置为true就读取间距,设置false就不读取,反正true就对了。
缺省字符:缺字的时候替换为哪个字符。这个非常关键,因为如果你不设置这个,客户端缺字会直接崩溃(我的客户端不会告诉我缺了哪个字),你字库八成就白生成了。
字符集合:<CharacterRegions></CharacterRegions>之间加的就是你的字库要包含的字符。
字符、起始结束字符:指的是一个字符区间,从起始字符开始到结束字符结束,结束字符也包含在内(Python的End是不包含的,以示区分),当两者相同时表示只有这个字符。如我设置如下,指的是unicode第32个字符到unicode第126个字符(Start小End大,不要搞反了)。但是微软好像没给整数加&#和;,你知道加上就行了,你学他只会报错。
  1. <font color="#ffffff"><Start>&#32;</Start><End>&#126;</End></font>
复制代码
转换成字符也就是这样:
  1. <font color="#ffffff"> (U+0020 空格)!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~(U+007E 波浪号)</font>
复制代码
但是Unicode使用十六进制数字,而每次十六进制转十进制很麻烦。区间最好不要有带本节图二的红叉的字符,我之前因为这个报错过,但是后面做好像又不报错,不确定。
计算方法:打开计算器选择程序员模式,把十进制数输入到DEC里,HEX里得到它的十六进制;把十六进制数输入到HEX里,DEC得到十进制。


为了方便可以写成如下形式(也就是在十六进制数前面加个x),其实就是html和xml的基本格式。
  1. <font color="#ffffff"><Start>&#x20;</Start><End>&#x7E;</End></font>
复制代码

选择字体
字体可以选宋体、Arial,宋体的话Size填写11,Arial填写10(因为不支持的字符会被大一号,汉字Arial里没有)。当然也可以选择其他像素体、点阵体,16px的最好,Size设置为12。
最好不要选择微软雅黑或艺术字之类的字体,不然会像下面这样糊成一坨:


添加汉字
首先加上字母数字和符号,也就是上面的例子。
  1. <font color="#ffffff"><Start>&#x20;</Start><End>&#x7E;</End></font>
复制代码
其他拉丁字母及扩展如下:
  1. <font color="#ffffff"><CharacterRegion><Start>&#xA0;</Start><End>&#x36F;</End></CharacterRegion></font>
复制代码
我们可以找一个合适的字库或编码,如方正简繁字表(简繁,9664个字)、义务教育常用字表(简体字,3500个字)、通用规范汉字表(简体字,8105个字)、GB2312(简体字,6763个字)等,排除掉那些可能这辈子都用不到的汉字。字库文件来自夜煞之乐的字体计数器:https://github.com/NightFurySL2001/CJK-character-count
根据需求选择好想要的字库以后,将里面的内容塞进python,用for循环生成字符集合。
  1. <font color="#ffffff"># -*- coding:utf-8 -*-
  2. a='你的字库' # 输入你的字库,存储到字符串变量
  3. for i in a: # 遍历字库
  4.     print('      <CharacterRegion><Start>'+i+'</Start><End>'+i+'</End></CharacterRegion>') #输出。为了节省空间我把四行缩成一行,不影响结果。</font>
复制代码
扩展B区(表意文字补充平面)之后的汉字因编码原因会提示字符串的长度必须正好为一个字符”,解决方法:
1.把传入字符改为传入编码。
  1. <font color="#ffffff">for i in a:
  2. </font>
复制代码
2.把字库转换成列表排序一下,复制到文本编辑器里,删掉后面扩展B区后面的字。
  1. <font color="#ffffff"># -*- coding:utf-8 -*-
  2. a=list('你的字库') # 把字库转为列表
  3. a.sort() # 排序一下,编码大(B区之后)的在后面
  4. print(''.join(a)) # 转为字符串输出
  5. </font>
复制代码

编辑器字体调成微软雅黑,可以看到后面的字很明显风格不一样,因为微软雅黑不支持扩展B区后面的字。如果安装了诸如遍黑体(https://github.com/Fitzgerald-Po ... /Plangothic-Project)一类的具有大字库的黑体,则会使差异减小甚至忽略不计。
3.直接抹掉扩展B区之后的汉字(扩展B区的起始编码为U+20000)。
  1. <font color="#ffffff"># -*- coding:utf-8 -*-
  2. a='你的字库'
  3. for i in a:</font>
复制代码
  1. <font color="#ffffff"># -*- coding:utf-8 -*-
  2. a='你的字库'</font>
复制代码
然后我们粘贴到<CharacterRegions>的最后一个</CharacterRegion>后面,得到如下:
  1. <font color="#ffffff"><blockquote><?xml version="1.0" encoding="utf-8"?></font>
复制代码
再补上中文用的符号,描述文件就写好了。
  1. <font color="#ffffff"><CharacterRegion><Start>&#xFF01;</Start><End>&#xFF65;</End></CharacterRegion> <!-- 全角标点 -->
  2. <CharacterRegion><Start>&#x2010;</Start><End>&#x205E;</End></CharacterRegion> <!-- 常用标点 -->
  3. <CharacterRegion><Start>&#x3000;</Start><End>&#x303F;</End></CharacterRegion> <!-- 中日韩标点 --></font>
复制代码


编译字库文件
终于来到重头戏了,我们编写好描述文件以后,点击Add Content,选择spritefont类型,找到你刚才写的SpriteFont0.spritefont,添加进去,点击Project Settings,填写输出文件夹(如果不填会报错!这样的话你不就白生成了吗?)


然后我们按上面的Build Content Project,只要它没有弹出异常就说明字库开始生成了。
生成完的xnb跟你的spritefont同名,也就是说我放SpriteFont0.spritefont生成的就是SpriteFont0.xnb。


编译用时
XNB文件本身用于表音文字是很方便的,拉丁文字、希腊文、西里尔文加起来也不过千百个,但是用于数量如此庞大的汉字时就显得十分鸡肋。
按照我的电脑配置,编译几百字符的xnb不在话下,一两千个字符也只用最多几分钟,但这个似乎是呈指数型增长的,也就是说你不能自然而然的认为编译一千个字符要一分钟,一万个字符就只要十分钟而已。我昨天凌晨四点编译了两个八千字的字库(一粗一细),早上六点起刚好编译完,所以时间是很悬的,一万个字符没个两三小时根本下不来。最好的办法就是你晚上编写好,打开编译,睡一觉就好了。
你也可以白天编译,它编译的时候你可以干其他事,总之等着就对了。
当然




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2024-8-16 21:51:22 | 显示全部楼层
diy论坛把我内容吃掉了……
回复

使用道具 举报

发表于 2024-8-17 01:53:50 | 显示全部楼层
本帖最后由 ruanhuhu 于 2024-8-17 01:54 编辑



选择导出位置那里可以选择是否压缩
回复

使用道具 举报

发表于 2024-8-21 02:11:45 来自手机 | 显示全部楼层
我之前试图编译全gbk内容,然后挂了一天一夜没出来,放弃了……
回复

使用道具 举报

 楼主| 发表于 2024-8-25 12:18:34 | 显示全部楼层
囧韓方序囧 发表于 2024-8-21 02:11
我之前试图编译全gbk内容,然后挂了一天一夜没出来,放弃了……

全CJK别想了,他会提示:
XNA Framework Reach profile supports a maximum Texture2D size of 2048, but this Texture2D is 4096x2048.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|Archiver|手机版|管理员邮箱|红警DIY论坛

GMT+8, 2024-9-12 09:28 , Processed in 0.051607 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表