如何编辑已编译的spritefont?我想更改一些字符的字距,删除一两个像素,更改别名,但我找不到任何仍然支持或广为人知的官方工具。
如果无法(或者太难)编辑编译后的spritefont,我该如何手动创建spritefont?
发布于 2012-09-12 20:01:08
没有官方的方法可以做到这一点。您会注意到,如果查看SpriteFont类型,您可以修改的内容非常少(DefaultCharacter、Spacing和LineSpacing)。
如果你看看它的内容管道对应的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导入器,它实现了自己的sprite字体处理器。它是开源的(albiet C++/CLI),因此您可以检查它的功能,也许还可以对其进行修改。它包含了自己的SpriteFontContent版本,但不幸的是,它同样被锁定了。Nuclex提供给你的最重要的东西是它的注释描述了精灵字体中的不同指标的含义。
显然,您是在扰乱XNA的私有部分-所以不要期望它在不同的XNA版本之间保持工作。(首先,它完全是私有的,这样XNA团队将来可以自由地修改它。)
你可以做的另一件事是使用一个替代的工具来构建你的字体作为一个“字体纹理”(described here -尽管这篇文章已经很旧了)。
https://stackoverflow.com/questions/12385675
复制相似问题