1

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

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

因此,我尝试在多语言字体“Microsoft JhengHei”中加载所有字符。

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

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

.../Content/MyFont.spritefont : 错误 : Importer 'FontDescriptionImporter' 出现意外失败!

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

在 Microsoft.Xna.Framework.Content.Pipeline.Graphics.FontDescription.set_CharacterRegions(CharacterRegion[] 值)

当我将其更改为○忮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>

我搜索了几天的解决方案,但徒劳无功,感谢任何帮助。

4

2 回答 2

3

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

但是在 Monogame 3.7.1 中,不再需要使用自定义内容管道,因为管道工具现在原生包含 LocalizedFontProcessor。

我的步骤是:

  1. 在管道工具中将 .spritefont Processor 设置为 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
于 2020-05-15T18:20:04.770 回答
1

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

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

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

分步教程

  1. 创建一个类库。

  2. 使用. MonoGame.Framework.Content.Pipeline.Portable_ NuGet(确保您选中了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>

内容.mgcb

...
#-------------------------------- References --------------------------------#

/reference:..\LocalizationPipeline.dll

#---------------------------------- Content ---------------------------------#
...
#begin MyFont.spritefont
/importer:FontDescriptionImporter
/processor:LocalizedFontProcessor
/build:MyFont.spritefont
...

来源

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

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

  3. LocalizationSample(感谢@Groo 给我这个链接。)

于 2016-02-09T18:57:00.690 回答