如何编辑已编译的spritefont?

时间:2012-09-12 10:00:42

标签: xna spritefont

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

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

1 个答案:

答案 0 :(得分: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,它实现了自己的精灵字体处理器。它是开源的(albiet C ++ / CLI),因此您可以检查它的功能并修改它。它包含了自己的SpriteFontContent版本,但遗憾的是它同样被锁定了。 Nuclex给你的最重要的事情就是它有一些注释来描述精灵字体中不同的指标是什么意思。

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


您可以做的另一件事是使用替代工具将您的字体构建为“字体纹理”(described here - 尽管这篇文章很老了。)