如何在单游戏中用精灵字体绘制每个角色

本文关键字:字体 精灵 体绘制 角色 单游戏 游戏 | 更新日期: 2023-09-27 18:33:56

我是monogame的新手,我正在尝试制作一个.spritefont文件,以便用我选择的字体绘制字符串。

带有英文字符的字符串可以在屏幕上很好地显示,但我希望用多种语言绘制字符串,例如日语和中文。

因此,我尝试以多语言字体"Microsoft JhengHei"加载所有字符。

字体的第一个字符是!(U+0021),最后一个字符是 ○(U+FFEE)

但是当我尝试编译程序时,编译器给了我一个错误:

.../Content/MyFont.spritefont:错误:导入程序"FontDescriptionImporter"意外失败!

System.Reflection.TargetInvocationException:调用的目标引发了异常。 ---> System.ArgumentException: CharacterRegion.End 必须大于 CharacterRegion.Start

at Microsoft.Xna.Framework.Content.Pipeline.Graphics.FontDescription.set_CharacterRegions(CharacterRegion[] value(

当我将○更改为忮时,MSBuild卡住了,需要很长时间才能继续内容。

代码MyFont.spritefont如下:

<?xml version="1.0" encoding="utf-8"?>
<XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
  <Asset Type="Graphics:FontDescription">
    <FontName>Microsoft JhengHei</FontName>
    <Size>14</Size>
    <Spacing>0</Spacing>
    <UseKerning>true</UseKerning>
    <Style>Regular</Style>
    <CharacterRegions>
      <CharacterRegion>
        <Start>&#x0021;</Start>
        <End>&#xFFEE;</End>
      </CharacterRegion>
    </CharacterRegions>
  </Asset>
</XnaContent>

我寻找了几天的解决方案,但徒劳无功,任何帮助都值得赞赏。

如何在单游戏中用精灵字体绘制每个角色

我无法在 Monogame 3.7.1 中重现 J3soon 接受的答案的步骤。

但是,在 Monogame 3.7.1 中,不再需要使用自定义内容管道,因为管道工具现在本机包含本地化字体处理器。

我的步骤是:

  1. 在管道工具中将 .spritefont 处理器设置为 LocalizedFontProcessor
  2. 在 .spritefont 中,包括 resx 文件的路径。
  3. 在 .spritefont 中,将 Asset Type="Graphics:FontDescription" 替换为 Asset Type="Graphics:LocalizedFontDescription">
  4. 重新构建内容

我本以为步骤 #1 会在幕后完成 #3,但对我来说,有必要在管道工具和 .spritefont 文件中执行此操作。

精灵字体文件

<?xml version="1.0" encoding="utf-8"?>
<XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
  <Asset Type="Graphics:LocalizedFontDescription">
    <FontName>Arial</FontName>
    <Size>16</Size>
    <Spacing>2</Spacing>
    <UseKerning>true</UseKerning>
    <Style>Regular</Style>
    <CharacterRegions>
      <CharacterRegion>
        <Start>&#32;</Start>
        <End>&#126;</End>
      </CharacterRegion>
    </CharacterRegions>
    <ResourceFiles>
      <Resx>..'Strings.fr.resx</Resx>
    </ResourceFiles>
  </Asset>
</XnaContent>

内容文件

#begin MyFont.spritefont
/importer:FontDescriptionImporter
/processor:LocalizedFontProcessor
/processorParam:PremultiplyAlpha=True
/processorParam:TextureFormat=Compressed
/build:MyFont.spritefont

因为处理所有 65,000 个字符需要太多时间。我们应该只处理我们使用的字符。

因此,最简单的方法是制作一个MonoGame Custom Content Pipeline并通过一些.resx文件加载我们正在使用的字符。

我花了很多时间寻找这个解决方案。所以我会发布我是如何成功的,希望它可以帮助将来有同样问题的人。

步教程

  1. 创建类库。

  2. 使用 NuGet 引用MonoGame.Framework.Content.Pipeline.Portable包。(确保您选中了Include Prerelease复选框(

  3. 在此处下载LocalizationSample并解压缩文件。

  4. 在"LocalizationPipeline'"下,将LocalizedFontDescription.csLocalizedFontProcessor.cs复制到类库中

  5. 生成类库,以便它输出LocalizationPipeline.dll文件。

  6. 打开Myfont.spritefont并将其资产类型更改为LocalizationPipeline.LocalizedFontDescription

  7. 然后添加资源<ResourceFiles><Resx>..'strings.resx</Resx></ResourceFiles>(这些文件应包含我们要绘制的字符串(

  8. 打开Content.mgcb和对LocalizationPipeline.dll的引用

  9. MyFont.spritefont 的处理器设置为 LocalizedFontProcessor

  10. 重新生成项目。

MyFont.spritefont

<?xml version="1.0" encoding="utf-8"?>
<XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
  <Asset Type="LocalizationPipeline.LocalizedFontDescription">
    <FontName>Microsoft JhengHei</FontName>
    <Size>14</Size>
    <Spacing>0</Spacing>
    <UseKerning>true</UseKerning>
    <Style>Regular</Style>
    <CharacterRegions>
      <CharacterRegion>
        <Start>&#32;</Start>
        <End>&#126;</End>
      </CharacterRegion>
    </CharacterRegions>
    <ResourceFiles>
      <Resx>..'strings.resx</Resx>
    </ResourceFiles>
  </Asset>
</XnaContent>

Content.mgcb

...
#-------------------------------- References --------------------------------#
/reference:..'LocalizationPipeline.dll
#---------------------------------- Content ---------------------------------#
...
#begin MyFont.spritefont
/importer:FontDescriptionImporter
/processor:LocalizedFontProcessor
/build:MyFont.spritefont
...

来源

  1. 第 1 部分 为 MonoGame 管线创建自定义内容导入器

  2. 如何:创建本地化游戏

  3. 本地化示例(感谢@Groo给我这个链接。