本帖最后由 naptid 于 2011-3-28 02:27 编辑 9 o: i& A" @* j% `- b
$ _5 i- q3 p) I7 ^0 G% @: v1 s2011/03/28修正:论坛系统升级时,自动将文中某些符号全部替换为html代码,现手动修正。 s; g d% s# I" p4 H
& y! P9 @* l- ]5 ? V- u
因为自己制作了这款游戏的图片字库,故将字体定义文件的初步分析粘贴在这里,也许可以作为以后同引擎游戏字库汉化的参考;由于本人不懂编程,分析水平及其有限,未明之处很多,还请懂行的高手不吝指点。8 H+ p6 R! X% m. g! y3 S& d
5 H% n& n; @1 E9 z6 C) a( K/ w
首先图片字库和字库定义文件位于游戏目录的fonts子目录(汉化版的相关路径有所更改)7 \ I: ^! j8 D' J
图片字库:带阴影及外框的字符字库一套五张,分别为xxx.png(核心字库图)、xxx_shadow.png(阴影字库图)、xxx_shadow.jpg(未明,估计为阴影字库图的背景)、xxx_stroke.png(外框字库图)、xxx_stroke.jpg(未明,估计为外框字库图的背景);无阴影及外框的字库只有一张对应的图片文件( A& E n$ M/ u9 d- }1 H
字库定义文件:同名的xxx.xml
4 `) b2 u' {+ S' e2 b
/ V. a9 F' x6 d* x字库定义文件结构:
: N; k$ U4 r* }4 I& N' v9 q& l <Font id="font" spacewidth="5" charspacing="0" lineheight="0">) Y" i. F& o5 v1 |$ c* z
主要定义字符间距和行高
5 N; a+ z$ e9 a( [3 ~ ]- r# e6 T3 w <Layer mask="xxx.png" padding="0" color="#000000" />
5 e. w O$ \) m/ V <Layer color="#00ff00" image="xxx_stroke.jpg" mask="xxx_stroke.png" padding="10" />
- o9 [8 [( T' G1 t: h定义字库对应图片及填充色,其中部分未明,若仅定义 image="xxx_stroke.jpg" ,则游戏中将显示字库的原始着色,但透明背景将被识别为黑色;若仅定义mask="xxx_stroke.png" ,透明背景可正常识别,但字库原始着色将被填充色代替变成单色字库,且必须定义填充色,否则程序出错;padding参数定义未明;这里的定义对本人而言太复杂,没法研究清楚,因此实际汉化中仅采用了mask参数,导致字库显示为白色无外框效果,比较可惜。" D. _/ l- g2 f6 @2 E" r
7 ]7 {2 j6 t) \* T1 P" w
接下来为单字符定义,仅列两行为例:
; v Z- B Q( Z. ?; v) q/ U: p <Char c="#0041" bx="0" by="0" ix="0" iy="0" sx="0" sy="0" sw="12" sh="20" width="10" />" [: ]$ O) P' c% d8 @/ a6 {0 X
Char c:字符utf8码(16进制);"#0041"表示大写字母A;
2 D5 E: \' L9 I# Tbx、by猜测为字符前间距,单位为像素,未经验证;
& ~8 y$ {1 P6 w* z* Fix、iy为字符在字库中的行数与列数,从0开始;$ X0 D" W% a/ J6 j+ ? W
sx、sy为字符起始取值坐标;" k( c3 ]1 m% A: o% J
sw为本字符的sx到下一字符的sx之间的距离(字宽),单位为像素;8 r' G$ D( T" m0 l3 l w
sh为本字符的sy到下一字符的sy之间的距离(字高);# w/ z) h# Z, O( [3 ^6 Y4 O
width猜测应为字符的显示宽度(如字母i的sw很小,实际显示可能较窄,可在width处适当加大宽度)
4 g& ?3 ]( V8 X: `) J( g; y, {$ m0 b以上仅适用于单字节utf8,汉字UTF8码为3字节,直接输入"#E38082"在游戏中显示为黑框……一开始卡在这儿,后来发现将其中一个参数略加修改即可显示汉字,如下:
, r1 ~: n! m/ [. k4 ~$ R4 h1 I <Char c='赞' bx="0" by="0" ix="0" iy="2" sx="0" sy="40" sw="21" sh="20" width="20" />
; N* A# O1 N7 M' U/ M$ e# Z( \/ {将char c=后的双引号改为单引号,直接加UTF8码汉字即可。其他参数请参考上文。汉字字库定义不像英文字符的宽度会产生变化,字高和字宽都是统一的,修改定义文件的相关参数非常容易;值得一提的是本次汉字字库的提取及整理利用了sspking制作的“通用提取非重复字符及排序工具”,非常好用,建议有需要的人拿去试试(相关页面点此)但本人忘记把其大名加入汉化人员技术名单了,直到在这里码字的时候才想起来;在此向sspking说声对不起……3 {3 k& C" ^8 T
+ n% Z, n; w4 E- P
原来以为到这一步就算大功告成了,没想到游戏实测时发现大问题:顶端任务文字及底部的思考线索文字竟然无法显示完全,缺了很多字,只有三分之一不到的汉字能够正常显示;当时完全蒙了,以为没戏了,后来不甘心做卧槽马死马当活马盲人摸瞎马,竟然给我找到了原因及解决方法——虽然方法比较笨,但终究是解决了……; v2 ]3 ?$ h* Q3 v
1)首先发现只有任务文字和思考文字无法全部显示,单词及短语全部显示正常,查看脚本索引文件dialogs.xml发现,有一项LabelLetters(本人无编程经验,姑且称之为函数)仅在任务及思考相关的定义行中出现,其他地方都没有,猜想多半是受到了这个函数的影响,又想到游戏中的任务文字全部为大写字母,此函数的功能可能是负责转换在某一区间内的utf8码字符,该函数会自动将小写字符转换为大写或其他相应字符,比如小写a(0x0061)转换为大写A(0x0041),而大部分中文字符不幸落入了该函数的作用区间,导致转换后的UTF8码显示为空白!曾尝试用多处出现的label函数直接取代labelletters,游戏报错,于是对我而言这条路堵死了,只能从字库本身着手;但应用转换的具体区间到底是多少尚未得知,于是……
# R* f2 Y2 r2 P9 j2)进行了换字测试,将字库中的所有字逐个显示,对能够正常显示的汉字总结后找到了安全区间(即肯定可以正常显示的UTF8码)末四位的规律:8181-899A,81A0-81BA,8581-859A,85A0-85BA,8981-899A,89A0-89BA,8D81-8D9A,8DA0-8DBA……之后只要在第三位依次+4即可
& t c9 ~& C0 N# N3)码表转换:有了思路之后,就准备人工转换码表了,原本打算拜托shane帮忙做一个简单的转换小软件,后来自己琢磨着用按键精灵的宏编程搞定了,转码后字库经实测后全部显示正常,于是搞定。 |