我是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>!</Start>
<End>○</End>
</CharacterRegion>
</CharacterRegions>
</Asset>
</XnaContent>
我搜索了几天的解决方案,但是徒劳,任何帮助都表示赞赏。
答案 0 :(得分:2)
我无法在Monogame 3.7.1中重现J3soon接受的答案的步骤。
但是在Monogame 3.7.1中,不再需要使用“自定义内容管道”,因为管道工具现在本机包含LocalizedFontProcessor。
我的步骤是:
我本以为第1步将在后台执行第3步,但对我而言,必须在管道工具和.spritefont文件中都执行此操作。
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> </Start>
<End>~</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
答案 1 :(得分:1)
由于处理所有65,000个字符需要花费太多时间。我们应该只处理我们正在使用的字符。
所以最简单的方法是制作一个MonoGame Custom Content Pipeline
并加载一些.resx
文件我们正在使用的字符。
我花了很多时间寻找这个解决方案。所以我会发布我是如何成功的,希望它可以帮助将来有同样问题的人。
分步教程
创建一个类库。
使用MonoGame.Framework.Content.Pipeline.Portable
引用NuGet
包。 (确保选中了Include Prerelease
复选框)
下载LocalizationSample
here并解压缩该文件。
在LocalizationPipeline\
复制LocalizedFontDescription.cs
和LocalizedFontProcessor.cs
下进入类库
构建类库,以便输出LocalizationPipeline.dll
文件。
打开Myfont.spritefont
并将其资产类型更改为LocalizationPipeline.LocalizedFontDescription
然后添加资源<ResourceFiles><Resx>..\strings.resx</Resx></ResourceFiles>
(这些文件应包含我们想要绘制的字符串)
打开Content.mgcb
并引用LocalizationPipeline.dll
将MyFont.spritefont
的处理器设为LocalizedFontProcessor
重建项目。
<强> 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> </Start>
<End>~</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
...
<强>来源强>
LocalizationSample(感谢@Groo给我这个链接。)