3

如何编辑已编译的 spritefont?我想更改某些字符的字距,删除一两个像素,更改锯齿,但我找不到任何仍受支持或广为人知的官方工具。

如果没有办法(或者如果太难)编辑编译的 spritefont,我该如何手动创建 spritefont?

4

1 回答 1

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 Importer,它实现了自己的 sprite 字体处理器。它是开源的(albiet C++/CLI),因此您可以检查它的功能并可能对其进行修改。它包括自己的版本SpriteFontContent,但遗憾的是它同样被锁定。Nuclex 将为您提供的最重要的东西是它具有描述精灵字体中不同指标含义的注释。

显然你在搞乱 XNA 的私有部分——所以不要指望它在不同的 XNA 版本之间继续工作。(首先它是私有的,这样 XNA 团队将来可以自由地修改它。)


您可以做的另一件事是使用替代工具将您的字体构建为“字体纹理”(在此处描述- 尽管这篇文章很旧)。

于 2012-09-12T12:01:07.527 回答