GF漢化詳細教程[游戲字體篇]
現在的游戲大部分是用矢量字體了,但以前的游戲一般都是用點陣字體。下面先介紹一下點陣字體顯示原理。
漢字內碼
點頭表示什么?是“對”、“YES”,偏偏有的地方表示的意義卻恰恰相反。一個動作,有不同的詮釋;一個問題,有不同的答案;而一個符號,卻有不同的意義,關鍵在于:你是如何地理解。在電腦中亦如此,所有的數據都是以0和1保存的,按不同的數據操作,可以得到不同的結果。對于顯示英文操作,由于英文字母種類很少,只需要8位(一字節)即可。而對于中文,常用卻有5000以上,于是我們的DOS前輩想了一個辦法,就是將ASCII表的高128個很少用到的數值以兩個為一組來表示漢字,即漢字的內碼。而剩下的低128位則留給英文字符使用,即英文的內碼。
漢字字模
得到了漢字的內碼后,還僅是一組數字,那又如何在屏幕上去顯示呢?這就涉及到文字的字模,字模雖然也是一組數字,但它的意義卻與數字的意義有了根本的變化,它是用數字的各位信息來記載英文或漢字的形狀,如英文的'A'在字模中是這樣記載的:
而中文的“你”在字模中卻是這樣記載的:
所有的漢字字模組成點陣字庫,像以前Dos下常用的Ucdos漢字系統就是用的點陣字庫,點陣字庫根據不同需要有好多種尺寸,如16*16 24*24,點越多顯示的字越細致,特別是顯示那些筆劃比較多的字,效果越好。
下面進入GF字體的世界,GF的字體擴展名是.LAF,都打包存儲于Data000.LAB文件中。先分析一下LAF的文件格式,然后再討論如何在字庫中加入中文。LAF格式由文件頭、字體索引表、字體偏移量表、字體點陣四部分組成。
1. 文件頭(32字節)
字段 | 數據長度 | 描述 |
Charnum | Long(4字節) | 字庫中字體個數 |
fontsize | Long(4字節) | 字體點陣部分的數據長度 |
MaxWidth | Long(4字節) | 字體最大寬度 |
MaxHeight | Long(4字節) | 字體最大高度 |
Unknown | Long(8字節) | 未知 |
FirstChar | Long(4字節) | 第一個字符編碼 |
LastChar | Long(4字節) | 最后一個字符編碼 |
2. 字體索引表
與字體編碼范圍相對應,每個雙字節保存一個字模在偏移量表中的偏移量。如GF的英文字庫是顯示ASCII碼表中0-FF的字符,所以有256個字模,字體索引表有256*2 =512字節。保存內容為這256個字模在字體偏移量表中的偏移量
3. 字體偏移量表(與字體個數一一對應)
字段 | 數據長度 | 描述 |
Offset | Long(4字節) | 此字模相對字體點陣的偏移量 |
Unknown | Long(4字節) | 未知 |
Width | Long(4字節) | 字模寬度 |
Height | Long(4字節) | 字模高度 |
4. 字體點陣
保存字體點陣。字體點陣的保存順序是,從左到右,從上到下。0代表無點,ff代表有點。(這是GF點陣與一般字體點陣的區別,一般字體點陣一個二進制位的1代表一個點,但是GF的字庫0xFF才代表一個點)。
現在舉一個GF中的點陣的例子,下圖是GF中漢字“選”的點陣,可以基本看出字形吧,每個漢字都要做成這樣的點陣加入到字庫中去。
現在舉一個例子,說明GF程序如何顯示一個英文字母N。(N的ASCII碼是0x4E)
1. 在字體索引表中找到字模在偏移量表中的偏移量。讀文件32+4E*2 = 0xBC處的雙字,得到偏移量4E。
2. 在字體偏移量表中得到字體點陣的偏移量。讀文件32+512+4E*16 = 0x700處得到字體點陣的偏移量0x
3. 讀字體點陣顯示字符N。字體點陣的首地址為16*256+512+32 = 0x1220H。字體N的點陣部分是在文件0x1220H+0x
漢字編碼GB2312-80簡介
GB
GB2312收錄簡化漢字及符號、字母、日文假名等共7445個圖形字符,其中漢字占6763個。GB2312規定“對任意一個圖形字符都采用兩個字節表示,每個字節均采用七位編碼表示”,習慣上稱第一個字節為“高字節”,第二個字節為“低字節”。
GB2312將代碼表分為94個區,對應第一字節;每個區94個位,對應第二字節,兩個字節的值分別為區號值和位號值加32(2OH),因此也稱為區位碼。01-09區為符號、數字區,16-87區為漢字區,10-15區、88-94區是有待進一步標準化的空白區。GB2312將收錄的漢字分成兩級:第一級是常用漢字計3755個,置于16-55區,按漢語拼音字母/筆形順序排列;第二級漢字是次常用漢字計3008個,置于56-87區,按部首/筆畫順序排列。故而GB2312最多能表示6763個漢字。
GB2312的編碼范圍為2121H-777EH,與ASCII有重疊,通行方法是將GB碼兩個字節的最高位置1以示區別。
改造字庫
我們現在要做的就是將GB2312中的6763個漢字加入到GF的字庫中去。漢字點陣定為16*16。因為游戲中仍要部分內容要以英文方式顯示,所以我們加入漢字并不應該破壞原有的英文點陣字庫,而是應該在英文字庫尾部追加這6763個漢字。
1. 首先要修改文件頭部分,每個字段都要做相應調整。
2. 由于漢字編碼范圍是2121H-777EH,所以字體索引表至少要擴大為777E*2個字節。索引表的內容前512字節為原始的英文字體索引表,應該保留。在此之后,凡遇到字體索引表中GB2312漢字編碼處是漢字的位置,添加漢字在字體偏移量表中的偏移量。漢字偏移量應該從0x100開始(前256是英文字庫)
3. 重建字體偏移量表,將6763個漢字在字體點陣的偏移量、漢字寬0x10,漢字高0x10寫入。
4. 將6763個漢字的點陣追加到原來英文點陣的尾部。
經過以上4部,字庫改造完畢。雖然修改只有4部分,但是每部分都涉及到各種偏移量的計算,多字節高低位的讀取等、文件頭的再修改等步驟,代碼實現起來非常麻煩,稍有不甚就會失敗,甚至導致GF運行時直接崩潰,調試時需要特別的耐心才行。
在生成新的字庫后,把新字庫覆蓋掉原來Data000.LAB中的同名字庫文件,字庫的修改就大功告成了。