Мар 212009
 

Те кто заинтересовался созданием приложений с использованием XNA, столкнулись с проблемой вывода текста в кириллице. Дело в том, что XNA — инструмент, а не набор готовых средств и многие решения придется реализовывать самому. В XNA есть возможность создания своего контент процессора, чем мы и займемся.

Для начала создадим новый проект WindowsGameN,  у меня это WindowsGame4. Думаю в картинках нет смысла показывать ).
Далее в дереве проекта добавим выбираем папку Content и добавляем новый объект SpriteFont1.spritefont, его можно открыть любым текстовым редакторов и внести изменения типа размер шрифта, наклон,… с этим разберетесь сами, ничего сложного простой xml файл.
Теперь создаем экземпляр класса SpriteFont на основе нашего SpriteFont1


GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;

SpriteFont m_SFont;

protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
m_SFont = Content.Load("SpriteFont1");
}

Если сейчас попробывать что-либо написать с использованием кириллицы то увидим ошибку.

Собственно, устранение которой мы займемся) Добавляем к имеющемуся солюшену новый проекту WindowsGameLibrary1.
Добавляем класс ContentProcessor1 и переписываем подобным образом:

using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Content.Pipeline;
using Microsoft.Xna.Framework.Content.Pipeline.Graphics;
using Microsoft.Xna.Framework.Content.Pipeline.Processors;

using TInput = System.String;
using TOutput = System.String;
using System.ComponentModel;
using System.IO;

namespace WindowsGameLibrary1
{
[ContentProcessor(DisplayName = "MyCharacterSetFontProcessor")]
public class Class1 : FontDescriptionProcessor
{
public override SpriteFontContent Process(FontDescription input, ContentProcessorContext context)
{
string fullPath = Path.GetFullPath(MessageFile);
context.AddDependency(fullPath);

string letters = File.ReadAllText(fullPath, System.Text.Encoding.UTF8);

foreach (char c in letters)
{
input.Characters.Add©;
}

return base.Process(input, context);
}

[DefaultValue("messages.txt")]
[DisplayName("Message File")]
[Description("Файл с символами которые будут автоматически добавлены в шрифте.")]
public string MessageFile
{
get { return messageFile; }
set { messageFile = value; }
}

private string messageFile = "..\\messages.txt";
}
}
}
}

В файле messages.txt содержатся нужные нам символы. Вкратце, мы читаем символы из файла и добавляем их в текущий процессор шрифта.
В файле могут содержаться как набор символов так и строки с фразами которые планируется выводить, повторяющиеся символы автоматически будут проигнорированы.
Мой файл выглядит так:

йцукенгшщзхъэждлорпавыфячсмитьбюЙЦУКЕНГШЩЗХЪЭЖДЛОРПАВЫФЯЧСМИТЬБЮ

после этого нужно добавить зависимость проекта от библиотеки, для этого выбираем в дереве наш WindowsGameN, в контекстном меню выбираем Project Dependencies… и указываем зависимость от WindowsGameLibrary1

Добавляем референс на библиотеку.
Выбираем наш SpriteFont1.spritefont и в свойстве Content Processor выбираем наш MyCharacterSetFontProcessor.

Вот и все.
Далее тест:

protected override void Draw(GameTime gameTime)
{
graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

string message = "Все работает!";
Vector2 viewportSize = new Vector2(GraphicsDevice.Viewport.Width,
GraphicsDevice.Viewport.Height);
Vector2 textSize = m_sFont.MeasureString(message);
Vector2 textPosition = (viewportSize - textSize) / 2;

spriteBatch.Begin();
spriteBatch.DrawString(m_sFont, message, textPosition, Color.Black);
spriteBatch.End();

base.Draw(gameTime);

}

Вот и все, классы и проекты назвать ттолько нужно по человечески )

 Posted by at 14:33

  19 Responses to “Использование кириллицы в XNA на основе своего кентент процессорае”

  1. Я извиняюсь конечно, но чем не подходит, прописать в файле .spritefont в теге региона символов прописать регион для кириллицы

    К
    Ұ

  2. Start — К
    End — Ұ

  3. Упорно не хочет XML теги отображать, короче начало региона 1050, конец 1200

  4. можно и в .spritefont прописать,
    но я хотел показать на примере кириллицы как реализовать контент процессор.
    .
    .
    [lang=’xml’]

    А
    я

    [/lang]

  5. По поводу ошибки, все просто в диапазоне 1050-1200 отсутствуют спецсимволы и цифры 1234567890/\:;<>., и т.д., а так же пробел тоже их следует добавлять в messages.txt

  6. Спасибо за статью! Надеюсь, автор не против, если я использую это для своей курсовой.

  7. Огромное спасибо! Очень помогла ваша информация!!!)))))))))))

  8. Не зачёт

  9. почему?

  10. Ну прям нет слов…

  11. Очень четко написано, очень понравилось. Не жалею что прочитал

  12. Господа!
    Может быть, я что-то делал не так, но у меня ничего не получилось… Может мне кто рассказать о подстановках, если у тебя шрифт Monotype Corsiva? Или какой другой?

    С уважением
    Влад, wlad@df.ru

  13. wlad
    Фсе норм работает.
    должно быть так:
    FontNamе Monotype Corsiva
    Stylе Italic

  14. Очень оригинально, надо будет друзьям об этом рассказать.

  15. А как сделать все то же самое, не создавая проект WindowsGame?
    Я использую компонент XnaViewer в проекте WindowsForms, так что там нет папки Content и выбирать контент-процессор соответственно тоже негде и не из чего. Реально это обойти?

  16. домой приду напишу посмотрю.

  17. А я видел гдето подобную инфу, кто что скажет по этому поводу?

 Leave a Reply

(required)

(required)


шесть + = 7

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>