如何在单游戏中用精灵字体绘制每个角色
本文关键字:字体 精灵 体绘制 角色 单游戏 游戏 | 更新日期: 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>!</Start>
<End>○</End>
</CharacterRegion>
</CharacterRegions>
</Asset>
</XnaContent>
我寻找了几天的解决方案,但徒劳无功,任何帮助都值得赞赏。
我无法在 Monogame 3.7.1 中重现 J3soon 接受的答案的步骤。
但是,在 Monogame 3.7.1 中,不再需要使用自定义内容管道,因为管道工具现在本机包含本地化字体处理器。
我的步骤是:
- 在管道工具中将 .spritefont 处理器设置为 LocalizedFontProcessor
- 在 .spritefont 中,包括 resx 文件的路径。
- 在 .spritefont 中,将 Asset Type="Graphics:FontDescription" 替换为 Asset Type="Graphics:LocalizedFontDescription">
- 重新构建内容
我本以为步骤 #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> </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
因为处理所有 65,000 个字符需要太多时间。我们应该只处理我们使用的字符。
因此,最简单的方法是制作一个MonoGame Custom Content Pipeline
并通过一些.resx
文件加载我们正在使用的字符。
我花了很多时间寻找这个解决方案。所以我会发布我是如何成功的,希望它可以帮助将来有同样问题的人。
分步教程
创建类库。
使用
NuGet
引用MonoGame.Framework.Content.Pipeline.Portable
包。(确保您选中了Include Prerelease
复选框(在此处下载
LocalizationSample
并解压缩文件。在"
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
...
来源
第 1 部分 为 MonoGame 管线创建自定义内容导入器
如何:创建本地化游戏
本地化示例(感谢@Groo给我这个链接。