Ранее мы создавали демонстрационные игры, которые содержали лишь компоненты, имеющие непосредственное отношение к игровому процессу. Теперь, когда мы освоили уже достаточно материала для создания простых компьютерных игр, пришло время изучить еще один важный вопрос – оформление игры. Эта лабораторная работа посвящена разработке системы оформления игры.
Цель работы
Научиться создавать правильно оформленные игры
Задачи работы
Разработать стартовый экран игры
Разработать систему меню игры
Разработать игровой экран
Разработать систему игровой справки
Научиться работать с текстом
Работа с текстом
Для организации вспомогательных подсистем игры важно уметь работать с текстами. В XNA можно использовать несколько подходов к выводу текстовых сообщений. Во-первых – можно воспользоваться стандартными средствами вывода текста одним из шрифтов, установленных в системе. Таким способом удобно выводить на экран большие объемы текстов.
Во-вторых – можно создать нужные надписи в виде изображений и выводить их как обычные спрайты. Этот подход удобен при создании системы меню и других надписей, которые нет необходимости модифицировать в ходе работы игровой программы. Причем, такие надписи можно анимировать теми же способами, которые используются для анимации спрайтов. Обычно системы меню в компьютерных играх создаются именно таким способом.
Третий способ вывода текста – это создать нечто вроде алфавита – спрайта, содержащего изображения букв и, разработав систему вывода нужных участков этого спрайта с необходимыми символами, выводить любые тексты таким способом.
Рассмотрим способ вывода обычного текста в XNA. Создадим новый проект P9_1. Прежде чем заниматься выводом текста, нужно создать ресурс типа .SPRITEFONT. Это – XML-файл, который содержит параметры шрифта, используемого для вывода. Для того, чтобы создать этот файл, выполните следующие действия.
1. Щелкните правой кнопкой мыши на папке Content и выберите в появившемся меню пункт Add?New Item. 2. В появившемся окне добавления нового элемента выберите объект Sprite Font (рис. 9.1.).
Рис. 9.1. Создание нового файла типа Spritefont
3. Дайте файлу имя, соответствующее имени одного из шрифтов, установленных в вашей системе. Например, обычно везде можно найти шрифт Courier New, Times New Roman, Arial. Мы выбрали шрифт Monotype Corsiva. Обратите внимание на то, что имя SPRITEFONT-файла должно соответствовать имени одного из установленных в системе шрифтов.
4. Нажмите кнопку Add и файл будет добавлен в проект. Для того, чтобы управлять свойствами шрифта, нам понадобится редактировать этот файл. Чтобы открыть его для редактирования в XML-редакторе, встроенном в Visual Studio, достаточно сделать двойной щелчок по этому файлу (рис. 9.2.).
Рис. 9.2. Редактирование Spritefont-файла
Этот файл состоит из множества документированных разделов, которые позволяют настраивать свойства шрифта. В частности, по умолчанию параметр Style установлен в Regular. Для шрифта Monotype Corsiva этот стиль отображения не определен, поэтому нам нужно заменить Regular на Italic.
Теперь все готово для использования шрифта в программе. Ниже, в листинге 9.1. приведен код класса Game1, реализующий вывод на экран строки текста.
usingSystem;usingSystem.Collections.Generic;usingMicrosoft.Xna.Framework;usingMicrosoft.Xna.Framework.Audio;usingMicrosoft.Xna.Framework.Content;usingMicrosoft.Xna.Framework.Graphics;usingMicrosoft.Xna.Framework.Input;namespace P9_1{publicclass Game1 : Microsoft.Xna.Framework.Game{ GraphicsDeviceManager graphics; SpriteBatch spriteBatch;//Для хранения шрифта SpriteFont MyFont;//Для хранения позиции вывода текста Vector2 StringPosition;//Строка для выводаstring OutString;//Для нахождения центра строки Vector2 StringOrigin;public Game1(){ graphics =new GraphicsDeviceManager(this); Content.RootDirectory="Content";}protectedoverridevoid Initialize(){ OutString ="Score: 12345";base.Initialize();}protectedoverridevoid LoadContent(){ spriteBatch =new SpriteBatch(GraphicsDevice);//Загружаем шрифт MyFont = Content.Load<SpriteFont>("Monotype Corsiva");//Устанавливаем позицию вывода шрифта в центре экрана StringPosition =new Vector2(graphics.GraphicsDevice.Viewport.Width/2, graphics.GraphicsDevice.Viewport.Height/2);//Находим центр строки StringOrigin = MyFont.MeasureString(OutString)/2;}protectedoverridevoid UnloadContent(){}protectedoverridevoid Update(GameTime gameTime){// Allows the game to exitif(GamePad.GetState(PlayerIndex.One).Buttons.Back== ButtonState.Pressed)this.Exit();base.Update(gameTime);}protectedoverridevoid Draw(GameTime gameTime){ graphics.GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin();//Выводим строку spriteBatch.DrawString(MyFont , OutString , StringPosition, Color.Red,0, StringOrigin, 1.0f, SpriteEffects.None, 0.5f); spriteBatch.End();base.Draw(gameTime);}}}
Как видите, вывод текста очень похож на вывод изображений. Для хранения шрифта используется переменная типа SpriteFont, метод DrawString объекта типа SpriteBatch отвечает за прорисовку текста на игровом экране:
Рассмотрим параметры вызова этого метода в табл. 9.1.
Таблица 9.1. Параметры метода DrawString объекта SpriteBatch
Параметр вызова метода
Описание параметра
MyFont
Переменная типа SpriteFont – шрифт, которым выводится текст
OutString
Переменная типа String – текст для вывода
StringPosition
Переменная типа Vector2 – позиция текста
Color.Red
Цвет текста
0
Поворот текста в радианах относительно точки привязки координат текста
StringOrigin
Переменная типа Vector2 – точка привязки координат объекта
1.0f
Коэффициент масштабирования объекта
SpriteEffects.None
Эффект спрайта
0.5f
Глубина текста – положение относительно других графических объектов
На рис. 9.3. вы можете видеть игровой экран проекта P9_1.
Рис. 9.3. Экран проекта P9_1
Оформление игры
Создадим новый проект P9_2. На его примере рассмотрим приемы работы, освоение которых вынесено в задачи данной работы. Задача оформления игры сводится к созданию нескольких игровых экранов с определенной функциональностью и к разработке системы перемещения между этими экранами.
На рис. 9.4. вы можете видеть окно Project Explorer проекта P9_2.
usingSystem;usingSystem.Collections.Generic;usingMicrosoft.Xna.Framework;usingMicrosoft.Xna.Framework.Audio;usingMicrosoft.Xna.Framework.Graphics;usingMicrosoft.Xna.Framework.Input;usingMicrosoft.Xna.Framework.Content;namespace P9_2.Classes{//Класс для хранения данных об элементах менюpublicclass Menu{public Texture2D imageTexture;public Rectangle imageRectangle;public Color color;public Menu(Game game, Texture2D _texture, Rectangle _rectangle, Color _color){ imageTexture = _texture; imageRectangle = _rectangle; color = _color;}}}
В листинге 9.4. приведен код класса Screen – этот класс является базовым для классов игровых экранов. Он содержит методы для активации и деактивации игровых экранов.
usingSystem;usingSystem.Collections.Generic;usingMicrosoft.Xna.Framework;usingMicrosoft.Xna.Framework.Audio;usingMicrosoft.Xna.Framework.Graphics;usingMicrosoft.Xna.Framework.Input;usingMicrosoft.Xna.Framework.Content;namespace P9_2{//Базовый класс, на основе которого создаются игровые экраныpublicclass Screen : Microsoft.Xna.Framework.DrawableGameComponent{//Для объекта SpriteBatch, который используется//для вывода изображений в классах-наследникахpublic SpriteBatch sprBatch;public Screen(Game game):base(game){//При создании объекта он по умолчанию //невидим и неактивен Visible = false; Enabled = false;//получим объект SpriteBatch sprBatch =(SpriteBatch)Game.Services.GetService(typeof(SpriteBatch));}//Процедура для отображения и активации объектаpublicvoid Show(){ Visible = true; Enabled = true;}//Процедура для скрытия и отключения объектаpublicvoid Hide(){ Visible = false; Enabled = false;}}}
На рис. 9.5. вы можете видеть экран игрового меню.