汉化技术帖~字库原理篇 by sumiya
(一)四个问题
如果有人在狼组片面地看了一些初级教程,可能会被误导。
狼组翻译的汉化初级教程,其中一篇讲到字库的,有这样一张讲解TILE(a:TILE是什么)的图:
|_|_|_|_|_|_|_|_|
|_|_|_|X|X|_|_|_|
|_|_|X|_|_|X|_|_|
|_|X|_|_|_|_|X|_|
|_|X|_|_|_|_|X|_|
|_|X|X|X|X|X|X|_|
|_|X|_|_|_|_|X|_|
|_|X|_|_|_|_|X|_|
这看上去就是个字符“A”,没错,游戏机的屏幕上就是这样显示8*8的“A”的。但是这个只是“A”的框架,游戏是怎样决定用什么颜色去显示这个字(b:字取色问题)?
或者当字存在阴影时,为什么游戏能将这个阴影的颜色变得淡一些,而不是和字的颜色相同(c:一字多色问题)?
还有,为什么有时候要调整TLP的“显示格式”,当你看到下面状态栏里的注释xBPP变化的某一xBPP时,字才能显示出来(d:xBPP是什么意思)?
如果只看了初级教程,只会用TLP画字,那你就会认为:TILE就是字的点阵信息。这样你就完全误解了TILE的工作原理。
(二)解决问题:一切都是编号(索引)
这个步骤要求你必须了解计算机基础知识。(要知道什么是bit,什么是byte;还要知道16进制、2进制、进制转换。这个很基础,我就不说了,不懂可以去找本《计算机应用基础》来看)
1、整天用TLP(Tile Layer Pro)来画字模(编辑TILE),也许会认为TILE就是一张“字模”。字库的TILE确实可以认为就是“字模”,那“字模”又算什么?通称的“字模”其实是存放在游戏ROM里的一串2进制数据,这段数据记录了字符信息。
比如刚才那张1BPP的字模图:
行 2进制数 转换为16进制
|_|_|_|_|_|_|_|_| 0 00000000 0
|_|_|_|X|X|_|_|_| 1 00011000 18
|_|_|X|_|_|X|_|_| 2 00100100 24
|_|X|_|_|_|_|X|_| 3 以下省略…………
|_|X|_|_|_|_|X|_| 4 ……………………
|_|X|X|X|X|X|X|_|
|_|X|_|_|_|_|X|_|
|_|X|_|_|_|_|X|_|
2、1BPP就是指1 bit per pixel,翻译为中文就是“用1个‘比特’(1个比特占用一个2进制位)来存放1个‘像素点’的信息”。1个2进制位能表示的数值只有0或1,当这些数 据被传输到GBA显存时,经过游戏程序的设定,GBA硬件会自动对这些数据进行“索引”工作。
索引过程:当数值为0时,GBA会去调色板(后面会讲到)取0号颜色放到屏幕上这个相应点的位置;当数值为1时,就会去取1号颜色。(当0号颜色被游戏程序设定为黑色、1号为白色时,你将会看到一个黑底白字的“A”显示在屏幕上。
2BPP也是同样原理,但是用2个2进制位表示1个像素点(2 bit/pixel)。2个2进制位能表示的数值有0、1、2、3,当2BPP的TILE被放到显存,游戏程序进行设定之后,GBA同样对他们进行索引工作。
索引过程:数值0,取调色板0号颜色;数值1,取1号;数值2,取2号;数值3,取3号。(当调色板0号颜色设定为黑、1号设定为白、2号设定为灰时,如下图)
行 10进制数 2进制数 16进制
|_|_|_|_|_|_|_|_| 0 00000000 00 00 00 00 00 00 00 00 00 00
|_|_|_|1|1|_|_|_| 1 00011000 00 00 00 01 01 00 00 00 01 40
|_|_|1|_|2|1|_|_| 2 00102100 00 00 01 00 10 01 00 00 04 90
|_|1|_|2|_|_|1|_| 3 01020010 00 01 00 10 00 00 01 00 12 04
|_|1|2|_|_|_|1|2| 4 ……以下省略
|_|1|1|1|1|1|1|2|
|_|1|2|2|2|2|1|2|
|_|1|2|_|_|_|1|2|
你将会看到一个黑底白字,带着灰色阴影的“A”。注意:在同样使用8*8的情况下,每一行使用的2进制位个数增加为1BPP的2倍。
3BPP和4BPP同理。有时候游戏使用的字库格式略微有些差异,但是原理都是一样的。

