Как нарисовать все символы со спрайт-шрифтом в моногаме
Я новичок в моногам и пытаюсь сделать .spritefont
файл, чтобы нарисовать строку с выбранным шрифтом.
Строки с английскими символами могут хорошо отображаться на экране, но я хочу рисовать строки на нескольких языках, таких как японский и китайский.
Итак, я попытался загрузить все символы в многоязычный шрифт "Microsoft JhengHei".
Первый символ шрифта !(U+0021)
и последний ○(U+FFEE)
,
Но когда я попытался скомпилировать программу, компилятор выдал мне ошибку:
... / Content / MyFont.spritefont: ошибка: в импорте 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>!</Start>
<End>○</End>
</CharacterRegion>
</CharacterRegions>
</Asset>
</XnaContent>
Я искал решение в течение нескольких дней, но тщетно, любая помощь приветствуется.
1 ответ
Поскольку обработка всех 65 тысяч символов занимает слишком много времени. Мы должны обрабатывать только те символы, которые используем.
Так что самый простой способ - это сделать MonoGame Custom Content Pipeline
и загрузить символы, которые мы используем некоторыми .resx
файлы.
Мне потребовалось так много времени в поисках этого решения. Поэтому я опубликую, как мне это удалось, надеюсь, что это поможет кому-то, у кого тот же вопрос в будущем.
Пошаговое руководство
Создать библиотеку классов.
Ссылка на
MonoGame.Framework.Content.Pipeline.Portable
использование пакетаNuGet
, (Убедитесь, что вы проверили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 за предоставленную мне ссылку.)
Мне не удалось воспроизвести шаги принятого ответа от J3soon в Monogame 3.7.1.
Однако в Monogame 3.7.1 больше нет необходимости использовать Custom Content Pipeline, потому что инструмент конвейера теперь изначально содержит LocalizedFontProcessor.
Мои шаги были:
- Установите для процессора.spritefont значение LocalizedFontProcessor в инструменте конвейера.
- В.spritefont укажите путь к файлу resx.
- В.spritefont замените Asset Type="Graphics:FontDescription" на Asset Type="Graphics:LocalizedFontDescription".
- Восстановить содержимое
Я бы подумал, что шаг №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