因為有些人對怎麼做簡轉繁的方法有興趣.
對於這部分沒興趣的,現在就可以<-離開了.
-------------------------------------------------------
先簡單講一下, 一開始是有打算把文本也換成繁體.
但是, 昨天卡住了, 因為我沒找出來Chinese-X.xnb的運作方法.
才Post了第一篇文章. 問有沒有人已經做出來了.
如果已經有人在做了, 不太想花太多時間在這上面.
但是, 昨天運氣很好, 突然開竅看懂了Stardew的作法.
也看了大家回應, 才決定只去修改字型檔.
雖然不完美, 但是至少有60分了.
廢話不多說, 開始說技術部分,
等大家了解後, 應該會覺得一點都不難.
裡面最重要的是 XNB Extract 0.2.2
我們需要用這個工具, 去把 xnb 檔案解出來.
以下我自己觀察的結果, 也許不太正確,
如果有人知道更詳細的格式, 也請不吝指教.
SpriteFont1.zh-CN.xnb 會解出
SpriteFont1.zh-CN.yaml 和 SpriteFont1.zh-CN.texture.png
重點是 SpriteFont1.zh-CN.yaml 是描述某個字在 png 檔的位置.
- #!Rectangle
x: 127
y: 57
width: 1
height: 1
會有很多個 Rectangle, 是代表一個一個的字.
而代表是哪個字, 就要看後面的資料了.
- "三" #!Char
- "上" #!Char
- "下" #!Char
- "不" #!Char
這每個字是一一相對應前面的 Rectangle,
所以我就寫個 nodejs 去處理 .yaml 檔,
轉成之後要用的 json 格式,
裡面記錄了每個字的x,y,width和height.
再用新同文堂的資料去做簡轉繁.
然後利用這轉完的資料, 用 html5 的 canvas 去把 png 檔載入,
再用這兩個API去修改png檔.
ctx.clearRect // 清掉原來的簡體字
ctx.fillText // 把新的繁體字寫進去
做完後, 就有新的 png 檔. 然後再使用 XNB Extract 去壓回成 xnb 檔.
SmallFont.zh-CN.xnb 也是類似的處理方法.
而讓我卡住的 Chinese-0.xnb Chinese-1.xnb Chinese-2.xnb Chinese-3.xnb
也是類似的方法, 但最大不同的是描述字體的資料是放在 Chinese.fnt
(因為不太一樣, 所以當初才會卡住.)
格式也是有點不太一樣.
<char id="8273" x="1012" y="0" width="9" height="18" xoffset="6" yoffset="9"
xadvance="22" page="1" chnl="15" />
<char id="9825" x="180" y="40" width="19" height="19" xoffset="1" yoffset="9"
xadvance="22" page="3" chnl="15" />
<char id="12288" x="1022" y="23" width="1" height="1" xoffset="0" yoffset="0"
xadvance="22" page="0" chnl="15" />
id="8273" 這個數字事實上就是 unicode .
以 javascript 來寫, 你可以用下面方式轉回來
String.fromCharCode(8273);
到這邊, 就已經知道某個簡體字的位置.
後面有一個 page="1" 這個數字就是 Chinese-X ,
所以 page="1" 就是放在 Chinese-1.png
這樣就照前面的做法就可以了.
然後修改完 Chinese-X.png, 再壓回去 Chinese-X.xnb 檔.
蓋掉原來的 xnb 檔, 再執行星露谷, 就可以看到改完的結果了.
這就大功告成了. :)
比較完美的做法是重建整個字形檔,
因為我還沒有完全看懂他的格式,
所以這就留待有心人了. XD
--
All Comments