Невозможно пройти тесты, в окне с вопросами пусто |
Работа с текстом в XNA
Цель работы: Научиться работать с текстами в XNA.
10.1. Работа с текстом в XNA
Для организации вспомогательных подсистем игры важно уметь работать с текстами. В XNA можно использовать несколько подходов к выводу текстовых сообщений. Во-первых – можно воспользоваться стандартными средствами вывода текста одним из шрифтов, установленных в системе. Таким способом удобно выводить на экран большие объемы текстов.
Во-вторых – можно создать нужные надписи в виде изображений и выводить их как обычные спрайты. Этот подход удобен при создании системы меню и других надписей, которые нет необходимости модифицировать в ходе работы игровой программы. Причем, такие надписи можно анимировать теми же способами, которые используются для анимации спрайтов. Обычно системы меню в компьютерных играх создаются именно таким способом.
Третий способ вывода текста – это создать нечто вроде алфавита – спрайта, содержащего изображения букв и, разработав систему вывода нужных участков этого спрайта с необходимыми символами, выводить любые тексты таким способом.
В любом случае, нужно учитывать, что даже используя стандартные средства вывода текстов, изображения символов шрифта встраиваются в проект в виде спрайтов. То есть, для распространения подобного проекта, например, игры, вы должны владеть правом распространения данного шрифта. Существуют несколько шрифтов Ascender Corporation, на которые Microsoft предоставлена именно такая лицензия – то есть в проектах их можно использовать без ограничений. Это такие шрифты, как, например, Kootenay, Lindsey, Miramonte, Pescadero, Pericles, Segoe UI Mono.
Чисто технически, в XNA-проекте можно использовать любой подходящий шрифт, установленный в системе, но, делая это, всегда следует помнить о правовых ограничениях. Подробнее ознакомиться с вопросом о лицензировании шрифтов можно здесь: http://www.paratype.ru/, http://www.adobe.com/ru/aboutadobe/antipiracy/ff_faq.html.
Рассмотрим способ вывода обычного текста в XNA. Создадим новый проект P4_1. Прежде чем заниматься выводом текста, нужно создать ресурс типа .SPRITEFONT. Это – XML-файл, который содержит параметры шрифта, используемого для вывода. Для того, чтобы создать этот файл, выполните следующие действия.
Щелкните правой кнопкой мыши на проекте Content и выберите в появившемся меню пункт Добавить > Создать элемент.
В появившемся окне добавления нового элемента выберите объект Шрифт спрайта (рис. 10.1).
Дайте файлу подходящее имя. Мы выбрали имя MyFont. Это имя будет соответствовать имени игрового актива, это понадобится нам при загрузке шрифта в проекте.
Нажмите кнопку Добавить и файл будет добавлен в проект. Для того, чтобы управлять свойствами шрифта, нам понадобится редактировать этот файл. Чтобы открыть его для редактирования в XML-редакторе, встроенном в Visual Studio, достаточно сделать двойной щелчок по этому файлу (рис. 10.2).
Этот файл состоит из множества документированных разделов, которые позволяют настраивать свойства шрифта. По умолчанию предлагается использовать шрифт Segoe UI Mono размером 14. Эти, и другие, параметры, можно изменить, редактируя файл. Мы, например, задали размер шрифта, равный 16.
Обратите внимание на раздел файла CharacterRegions. Он используется для задания диапазона символов, которые будут доступны в шрифте. По умолчанию это символы латинского алфавита, этот раздел выглядит так, как показано на рис. 10.2. Если шрифт, который вы собираетесь использовать, поддерживает и кириллицу, и вы хотите выводить надписи на русском языке в игровом окне XNA, данный раздел следует привести к такому виду:
<CharacterRegions> <CharacterRegion> <Start> </Start> <End>~</End> </CharacterRegion> <CharacterRegion> <Start>А</Start> <End>я</End> </CharacterRegion> </CharacterRegions>
Мы добавили здесь еще одну группу CharacterRegion с указанием в качестве символа начала последовательности – символ "А", окончания – "я". Если шрифт, заданный в файле, не поддерживает кириллицу, проект будет создан, но для отображения кириллических символов будут использованы символы стандартного шрифта, о чём будет сообщено в окне Список ошибок. Опасность такого поведения системы, в первую очередь, в лицензионной чистоте получаемого продукта, во-вторых, страдает внешний вид решения, так как символы русскоязычных и англоязычных надписей, выполненных разными шрифтами выглядят по-разному.
В нашем случае, при использовании шрифта Segoe UI Mono кириллические символы заменяются при выводе символами из другого шрифта, поэтому, помня о лицензионных ограничениях, в нашем примере мы ограничимся выводом надписи на английском.
Теперь все готово для использования шрифта в программе. Ниже, в листинге 10.1. приведен код класса Game1, реализующий вывод на экран строки текста.
using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Input.Touch; using Microsoft.Xna.Framework.Media; namespace P4_1 { /// <summary> /// Это главный тип игры /// </summary> public class Game1 : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; //Строка для вывода string text = "Hello, XNA for Windows Phone 7!"; //Для хранения позиции вывода текста Vector2 textPosition; //Для хранения шрифта SpriteFont MyFont; //Для нахождения центра строки Vector2 stringOrigin; public Game1() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; //Отображение игрового окна на полный экран, без строки состояния graphics.IsFullScreen = true; // Частота кадра на Windows Phone по умолчанию — 30 кадров в секунду. TargetElapsedTime = TimeSpan.FromTicks(333333); // Дополнительный заряд аккумулятора заблокирован. InactiveSleepTime = TimeSpan.FromSeconds(1); } /// <summary> /// Позволяет игре выполнить инициализацию, необходимую перед запуском. /// Здесь можно запросить нужные службы и загрузить неграфический /// контент. Вызов base.Initialize приведет к перебору всех компонентов и /// их инициализации. /// </summary> protected override void Initialize() { // ЗАДАЧА: добавьте здесь логику инициализации base.Initialize(); } /// <summary> /// LoadContent будет вызываться в игре один раз; здесь загружается /// весь контент. /// </summary> protected override void LoadContent() { // Создайте новый SpriteBatch, который можно использовать для отрисовки текстур. spriteBatch = new SpriteBatch(GraphicsDevice); //Загружаем шрифт MyFont = Content.Load<SpriteFont>("MyFont"); //Устанавливаем позицию вывода шрифта в центре экрана textPosition = new Vector2(graphics.GraphicsDevice.Viewport.Width / 2, graphics.GraphicsDevice.Viewport.Height / 2); //Находим центр строки stringOrigin = MyFont.MeasureString(text) / 2; // ЗАДАЧА: используйте здесь this.Content для загрузки контента игры } /// <summary> /// UnloadContent будет вызываться в игре один раз; здесь выгружается /// весь контент. /// </summary> protected override void UnloadContent() { // ЗАДАЧА: выгрузите здесь весь контент, не относящийся к ContentManager } /// <summary> /// Позволяет игре запускать логику обновления мира, /// проверки столкновений, получения ввода и воспроизведения звуков. /// </summary> /// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param> protected override void Update(GameTime gameTime) { // Позволяет выйти из игры if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); // ЗАДАЧА: добавьте здесь логику обновления base.Update(gameTime); } /// <summary> /// Вызывается, когда игра отрисовывается. /// </summary> /// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param> protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); // ЗАДАЧА: добавьте здесь код отрисовки spriteBatch.Begin(); //Выводим строку spriteBatch.DrawString(MyFont, text, textPosition, Color.Red, 0, stringOrigin, 1.0f, SpriteEffects.None, 0.5f); spriteBatch.End(); base.Draw(gameTime); } } }Листинг 10.1. Код класса Game1
Как видите, вывод текста очень похож на вывод изображений. Для хранения шрифта используется переменная типа SpriteFont, метод DrawString объекта типа SpriteBatch отвечает за прорисовку текста на игровом экране:
spriteBatch.DrawString(MyFont, text, textPosition, Color.Red, 0, stringOrigin, 1.0f, SpriteEffects.None, 0.5f);
Рассмотрим параметры вызова этого метода в табл. 10.1.
Позиционирование строк осуществляется аналогично позиционированию спрайтов – левый верхний угол строки относительно левого верхнего угла экрана.
На рис. 10.3 вы можете видеть игровой экран проекта P4_1.
Обратите внимание на то, что в данном проекте, в конструкторе, мы применили команду graphics.IsFullScreen = true;
Это привело к тому, что при запуске приложения на телефоне строка состояния оказалась скрытой, в итоге, изображение игрового экрана заняло всю поверхность дисплея.
10.2. Выводы
В этой лабораторной работе была рассмотрена методика вывода надписей в игровое окно XNA. Для настройки шрифта используется XML-файл формата SPRITEFONT, изображения, сгенерированные на основе символов выбранного шрифта, встраиваются в исполняемый файл. Для использования шрифта в проектах, которые вы планируете распространять, у вас должно быть право на распространение шрифта.
10.3. Задание
Выведите на экран XNA несколько надписей, выясните, что произойдёт, если вывести их одна над другой. Поэкспериментируйте с различными шрифтами, изучите материалы по лицензированию шрифтов.