2016-02-08 6 views
0

Я новичок в monogame, и я пытаюсь создать файл .spritefont, чтобы нарисовать строку с выбранным шрифтом.Как нарисовать все символы с помощью spritefont в monogame

Строки с английскими символами могут хорошо отображаться на экране, но я хочу рисовать строки на нескольких языках, например, на японском и китайском.

Итак, я попытался загрузить все символы в многоязычном шрифте «Microsoft JhengHei».

Первый символ шрифта: !(U+0021), а последний - ○(U+FFEE).

Но когда я пытался скомпилировать программу, компилятор дал мне ошибку:

.../Content/MyFont.spritefont : error : Importer 'FontDescriptionImporter' had unexpected failure!

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.ArgumentException: CharacterRegion.End must be greater than 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>&#x0021;</Start> 
     <End>&#xFFEE;</End> 
     </CharacterRegion> 
    </CharacterRegions> 
    </Asset> 
</XnaContent> 

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

+0

Это не имеет смысла, так как 'CharacterRegion.End' и '.Start' являются типами' char', а '(char) 0xFFEE' больше, чем' (char) 0x0021'. Вы уверены, что проблема не проще, например, посмотреть на неправильный файл или что-то еще? Что произойдет, если вы измените «Конец» на « & # x0022; '? – Groo

+0

Да, он компилируется. Я думаю, что, возможно, ' & # xFFEE; 'слишком большой или что-то еще, потому что статьи в Интернете говорят, что Content Pipeline будет анализировать все символы в области символов в файл изображения. – J3soon

+0

@Groo Но сообщение об ошибке смутило меня, и я не знаю, что я могу сделать. – J3soon

ответ

1

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

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

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

Шаг за шагом Учебник

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

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

  3. Загрузите LocalizationSamplehere и распакуйте его.

  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 из Creating custom content importers for the MonoGame Pipeline

  2. How to: Create a Localized Game

  3. LocalizationSample (Спасибо @Groo за предоставленную мне эту ссылку.)