2012-09-12 64 views
3

如何編輯編譯的spritefont?我想改變一些字符的字距,擦除一個或兩個字符,改變別名,但是我找不到任何仍然支持或廣爲人知的官方工具。如何編輯已編譯的spritefont?

如果沒有辦法(或者如果太難了)編輯編譯的spritefont,我該如何手動創建spritefont?

回答

3

有沒有官方的方式來做到這一點。您會注意到,如果您查看SpriteFont類型,您可以修改幾個寶貝(DefaultCharacterSpacingLineSpacing)。

如果你看看它的內容管道對應,SpriteFontContent,根本沒有public成員。


最好的辦法是用ILSpy看到這些類有什麼私有成員(以及它們是如何工作)。然後使用反射直接修改它們。 SpriteFont基本上是一組度量數據和一個Texture2D

我建議你在構建內容流水線擴展時修改SpriteFontContent(如果你有自己沒有構建的XNB文件,這會變得更復雜)。它會是這個樣子:

[ContentProcessor(DisplayName = "Custom Font Processor")] 
public class CustomFontProcessor : FontDescriptionProcessor 
{ 
    public override SpriteFontContent Process(FontDescription input, ContentProcessorContext context) 
    { 
     SpriteFontContent output = base.Process(input, context); 
     // ... your modifications here ... 
     return output; 
    } 
} 

爲了使您的生活更輕鬆,你可以使用Exposed Object它給你dynamic,然後可以訪問私有成員直接(使它更容易寫這反映代碼)。

你可以看看Nuclex TrueType導入器,它實現了它自己的精靈字體處理器。它是開放源代碼(albiet C++/CLI),因此您可以檢查它的功能並修改它。它包括它自己的版本SpriteFontContent,但不幸的是它同樣被鎖定。 Nuclex最重要的事情就是它具有描述精靈字體中不同度量標準的意義。

很明顯,你正在搞亂XNA的私有部分 - 所以不要指望它在不同的XNA版本之間繼續工作。 (它之所以是擺在首位的所有私人是爲了讓XNA團隊可以隨意修改它的未來。)


你可以做的另一件事是使用替代工具來構建你的字體作爲「字體紋理」(described here - 雖然這篇文章很舊)。