Как нарисовать все символы со спрайт-шрифтом в моногаме

Я новичок в моногам и пытаюсь сделать .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>&#x0021;</Start>
        <End>&#xFFEE;</End>
      </CharacterRegion>
    </CharacterRegions>
  </Asset>
</XnaContent>

Я искал решение в течение нескольких дней, но тщетно, любая помощь приветствуется.

1 ответ

Решение

Поскольку обработка всех 65 тысяч символов занимает слишком много времени. Мы должны обрабатывать только те символы, которые используем.

Так что самый простой способ - это сделать MonoGame Custom Content Pipeline и загрузить символы, которые мы используем некоторыми .resx файлы.

Мне потребовалось так много времени в поисках этого решения. Поэтому я опубликую, как мне это удалось, надеюсь, что это поможет кому-то, у кого тот же вопрос в будущем.

Пошаговое руководство

  1. Создать библиотеку классов.

  2. Ссылка на MonoGame.Framework.Content.Pipeline.Portable использование пакета NuGet, (Убедитесь, что вы проверили Include Prerelease флажок)

  3. Скачать LocalizationSample здесь и распакуйте файл.

  4. Под LocalizationPipeline\ копия LocalizedFontDescription.cs а также LocalizedFontProcessor.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 за предоставленную мне ссылку.)

Мне не удалось воспроизвести шаги принятого ответа от J3soon в Monogame 3.7.1.

Однако в Monogame 3.7.1 больше нет необходимости использовать Custom Content Pipeline, потому что инструмент конвейера теперь изначально содержит LocalizedFontProcessor.

Мои шаги были:

  1. Установите для процессора.spritefont значение LocalizedFontProcessor в инструменте конвейера.
  2. В.spritefont укажите путь к файлу resx.
  3. В.spritefont замените Asset Type="Graphics:FontDescription" на Asset Type="Graphics:LocalizedFontDescription".
  4. Восстановить содержимое

Я бы подумал, что шаг №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>&#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
Другие вопросы по тегам