Возможно вы искали: 'Fishie Fishie'

May 12 2025 01:26:46
  • Как сделать 8Gamers.Ru домашней страницей?
  • Игры
    • База данных по играх
    • Игровые новости
    • Игровая индустрия
    • Обзоры на игры
    • Прохождения игр
    • Гайды к играм
    • Превью о играх
    • Игровые тизеры
    • Игровые арты
    • Игровые обои
    • Игровые скриншоты
    • Игровые обложки
    • Игровые трейлеры
    • Игровое видео
    • Вышедшие игры
    • Ближайшие релизы игр
  • Кино и ТВ
    • База данных по кино
    • Статьи о кино
    • Постеры
    • Кадры из кино
    • Кино трейлеры
    • Сегодня в кино
    • Скоро в кино
  • Комиксы и манга
    • Манга по алфавиту
    • База данных по комиксах
    • Читать онлайн комиксы
    • Читать онлайн манга
    • База персонажей
  • Читы и коды
    • Чит-коды для PC игр
    • Чит-коды для консольных игр
    • Трейнеры
    • Коды Game Genie
  • Моддинг
    • Модификации
    • Карты к играм
    • Программы для моддинга
    • Статьи о моддинге
  • Геймдев
    • Всё о создании игр
    • Список движков
    • Утилиты в помощь игроделу
    • Конструкторы игр
    • Игровые движки
    • Библиотеки разработки
    • 3D-модели
    • Спрайты и тайлы
    • Музыка и звуки
    • Текстуры и фоны
  • Рецензии
    • Игры
    • Кино
    • Аниме
    • Комиксы
    • Мангу
    • Саундтреки
  • Саундтреки
    • Лирика
  • Файлы
    • Патчи к играм
    • Русификаторы к играм
    • Сохранения к играм
    • Субтитры к кино
  • Медиа
    • Видео
    • Фото
    • Аудио
    • Фан-арты
    • Косплей
    • Фото с виставок
    • Девушки из игр
    • Рисунки
    • Рисуем онлайн
    • Фотохостинг
  • Юмор
    • Анекдоты
    • Афоризмы
    • Истории
    • Стишки и эпиграммы
    • Тосты
    • Цитаты
  • Флеш
    • Азартные
    • Аркады
    • Бродилки
    • Гонки
    • Для девочек
    • Для мальчиков
    • Драки
    • Квесты
    • Леталки
    • Логические
    • Мультфильмы
    • Открытки
    • Приколы
    • Разное
    • Спорт
    • Стратегии
    • Стрелялки
Статистика

Статей: 87772
Просмотров: 96030355
Игры
Injustice:  Gods Among Us
Injustice: Gods Among Us
...
Dark Souls 2
Dark Souls 2
Dark Souls II - вторая часть самой хардкорной ролевой игры 2011-2012 года, с новым героем, сюжето...
Battlefield 4
Battlefield 4
Battlefield 4 - продолжение венценосного мультиплеер-ориентированного шутера от первого ли...
Кино
Steins;Gate
Steins;Gate
Любители японской анимации уже давно поняли ,что аниме сериалы могут дать порой гораздо больше пи...
Ку! Кин-дза-дза
Ку! Кин-дза-дза
Начинающий диджей Толик и всемирно известный виолончелист Владимир Чижов встречают на шумной моск...
Обзоры на игры
• Обзор Ibara [PCB/PS2] 18346
• Обзор The Walking ... 18789
• Обзор DMC: Devil M... 19864
• Обзор на игру Valk... 15867
• Обзор на игру Stars! 17754
• Обзор на Far Cry 3 17935
• Обзор на Resident ... 16012
• Обзор на Chivalry:... 17495
• Обзор на игру Kerb... 17970
• Обзор игры 007: Fr... 16604
Превью о играх
• Превью к игре Comp... 17946
• Превью о игре Mage... 14451
• Превью Incredible ... 14706
• Превью Firefall 13462
• Превью Dead Space 3 16325
• Превью о игре SimC... 14717
• Превью к игре Fuse 15432
• Превью Red Orche... 15532
• Превью Gothic 3 16334
• Превью Black & W... 17345
Главная » Статьи » Всё о XNA » Оформление игр

Оформление игр

Ранее мы создавали демонстрационные игры, которые содержали лишь компоненты, имеющие непосредственное отношение к игровому процессу. Теперь, когда мы освоили уже достаточно материала для создания простых компьютерных игр, пришло время изучить еще один важный вопрос – оформление игры. Эта лабораторная работа посвящена разработке системы оформления игры.

Цель работы

  • Научиться создавать правильно оформленные игры

Задачи работы

  • Разработать стартовый экран игры
  • Разработать систему меню игры
  • Разработать игровой экран
  • Разработать систему игровой справки
  • Научиться работать с текстом

Работа с текстом

Для организации вспомогательных подсистем игры важно уметь работать с текстами. В 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, реализующий вывод на экран строки текста.

Листинг 9.1. Код класса Game1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
 
namespace P9_1
{
 
    public class 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";
        }
 
        protected override void Initialize()
        {
            OutString = "Score: 12345";
            base.Initialize();
        }
 
 
        protected override void 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;
        }
 
        protected override void UnloadContent()
        {
        }
 
        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
 
            base.Update(gameTime);
        }
 
 
        protected override void 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 отвечает за прорисовку текста на игровом экране:

spriteBatch.DrawString(MyFont, OutString, StringPosition, Color.Red, 0, StringOrigin, 1.0f, SpriteEffects.None, 0.5f);

Рассмотрим параметры вызова этого метода в табл. 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.


Рис. 9.4. Окно Project Explorer проекта P9_2

В листинге 9.2. приведен код класса Game1.

Листинг 9.2. Код класса Game1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
 
namespace P9_2
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        //Экран справки
        HelpScreen help;
        Texture2D helpBack;
        Texture2D helpText;
        //Экран меню
        MenuScreen menu;
        Texture2D menuBack;
        Texture2D menuGameName;
        Texture2D menuTxtStartGame;
        Texture2D menuTxtHelp;
        Texture2D menuTxtExit;
        //Текущий элемент меню
        int currentItem;
        //Интервал задержки переключения между элементами меню
        int interval;
        //Игровой экран
        GameScreen newGame;
        Texture2D gameBat;
 
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
 
        protected override void Initialize()
        {
            //При запуске игры активным устанавливается первый элемент меню
            currentItem = 1;
            interval = 0;
            base.Initialize();
        }
 
        protected override void LoadContent()
        {
            //Загружаем элементы игры и создаем игровые экраны
            spriteBatch = new SpriteBatch(GraphicsDevice);
            Services.AddService(typeof(SpriteBatch), spriteBatch);
            helpBack = Content.Load<Texture2D>("helpBack");
            helpText = Content.Load<Texture2D>("helpText");
            help = new HelpScreen(this, helpBack, helpText,
                new Rectangle(0, 0, this.Window.ClientBounds.Width, this.Window.ClientBounds.Height),
                new Rectangle((this.Window.ClientBounds.Width - helpText.Width)/2, 
                (this.Window.ClientBounds.Height - helpText.Height)/2, 
                helpText .Width , helpText .Height ));
            Components.Add(help);
            gameBat = Content.Load<Texture2D>("BallandBats");
            newGame = new GameScreen(this, ref gameBat, new Rectangle(18, 9, 17, 88), 
                new Vector2(100, 100));
            Components.Add(newGame);
            menuBack = Content.Load<Texture2D>("menuBack");
            menuGameName = Content.Load<Texture2D>("menuGameName");
            menuTxtStartGame = Content.Load<Texture2D>("menuTxtStartGame");
            menuTxtHelp = Content.Load<Texture2D>("menuTxtHelp");
            menuTxtExit = Content.Load<Texture2D>("menuTxtExit");
            menu = new MenuScreen(this, menuBack, menuGameName, menuTxtStartGame, menuTxtHelp,
                menuTxtExit, new Rectangle(100, 300, 400, 50), new Rectangle(100, 350, 400, 50), 
                new Rectangle(100, 400, 400, 50));
            Components.Add(menu);
            //Отображаем меню, остальные элементы скрыты
            menu.Show();
        }
 
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }
 
        //Обработка нажатий на клавиши
        void KeyboardHandle()
        {
            //считаем состояние клавиатуры
              KeyboardState kbState = Keyboard.GetState();
            //Если прошло 4 игровых цикла
            interval ++;
            if (interval >=4)
            {
                //Обнуляем счетичик
                interval = 0;
 
                //Если выбран экран меню
                if (menu.Enabled)
                {
                    //Если нажата клавиша вверх
                    if (kbState.IsKeyDown(Keys.Up))
                    {
                        //Уменьшить на 1 счетчик, отвечающий за
                        //смену пунктов меню
                        currentItem--;
                        //Если в момент нажатия был активен самый верхний
                        //пункт
                        if (currentItem < 1)
                        {   
                            //Делаем текущим третий пункт
                            currentItem = 3;
                            //Вызов процедуры для отображения смены пункта меню
                            menu.GetKey(currentItem);
                        }
                            //если при уменьшении номера пункта
                            //он не меньше 1, вызываем процедуру
                            //отображения смены пункта
                        else
                        {
                            menu.GetKey(currentItem);
                        }
                    }
                    //При нажатии клавиши вниз
                    if (kbState.IsKeyDown(Keys.Down))
                    {
                        //Увеличим счетчик
                        currentItem++;
                        //Если он больше 3 - активируем первый пункт
                        if (currentItem > 3)
                        {
                            currentItem = 1;
                            menu.GetKey(currentItem);
                        }
                            //Если не меньше 3 - переходим на следующий пункт
                        else
                        {
                            menu.GetKey(currentItem);
                        }
                    }
                    //При нажатии клавиши Enter
                    //выполняем команду, соответствующую текущему пункту меню
                    if (kbState .IsKeyDown (Keys .Enter))
                    {
                        //Первый пункт - скрываем экран меню
                        //и отображаем игровой экран
                        if (currentItem == 1)
                        {
                            menu.Hide();
                            newGame.Show();
                        }
                        //Скрываем меню и
                        //отображаем экран справки
                        if (currentItem ==2) 
                        {
                            menu.Hide();
                            help.Show ();
                        }
                        //Выходим из игры
                        if (currentItem == 3)
                        {
                            this.Exit();
                        }
                    }
 
 
                }
            }
            //Если активен экран справки
                if (help.Enabled)
                {
                    //При нажатии Esc закрываем экран справки
                    //И открываем меню
                    if (kbState.IsKeyDown(Keys.Escape))
                    {
                        help.Hide();
                        menu.Show();
                    }
                }
            //Если активен игровой экран
            //При нажатии Esc закрываем его 
            //и открываем меню
            //Обработка нажатий клавиш, необходимых для работы игрового экрана
            //проводится в объекте, соответствующем этому экрану
                if (newGame.Enabled)
                {
                    if (kbState.IsKeyDown(Keys.Escape))
                    {
                        newGame.Hide();
                        menu.Show();
                    }
                }
        }
 
        protected override void Update(GameTime gameTime)
        {
            //Обработка нажатий на клавиши
            KeyboardHandle();
            base.Update(gameTime);
        }
 
        protected override void Draw(GameTime gameTime)
        {
            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
            spriteBatch.Begin();
            base.Draw(gameTime);
            spriteBatch.End();
        }
    }
}

В листинге 9.3. вы можете видеть код класса Classes.Menu

Листинг 9.3. Код класса Classes.Menu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Content;
 
namespace P9_2.Classes
{
    //Класс для хранения данных об элементах меню
    public class 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 – этот класс является базовым для классов игровых экранов. Он содержит методы для активации и деактивации игровых экранов.

Листинг 9.4. Код класса Screen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Content;
 
namespace P9_2
{
//Базовый класс, на основе которого создаются игровые экраны
    public class 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));
        }
        //Процедура для отображения и активации объекта
        public void Show()
        {
            Visible = true;
            Enabled = true;
        }
        //Процедура для скрытия и отключения объекта
        public void Hide()
        {
            Visible = false;
            Enabled = false;
        }
    }
}

 

На рис. 9.5. вы можете видеть экран игрового меню.


Рис. 9.5. Экран игрового меню

В листинге 9.5. приведен код класса MenuScreen.

Листинг 9.5. Код класса MenuScreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Content;
 
namespace P9_2
{
//Экран меню
    public class MenuScreen : Screen 
    {
        //Элементы меню будем хранить в массиве типа Menu
        //тип данных Menu хранит информацию об элементах меню
        Classes.Menu[] menu;
        //Текстуры и прямоугольники для вывода элементов меню
        Texture2D menuTxtStartGame;
        Texture2D menuTxtHelp;
        Texture2D menuTxtExit;
        Rectangle menuTxtStartGameR, menuTxtHelpR, menuTxtExitR;
        Texture2D menuBack, menuGameName;
        Rectangle menuBackR, menuGameNameR;
 
        public MenuScreen(Game game, Texture2D _menuBack, Texture2D _menuGameName, 
            Texture2D _menuTxtStartGame, Texture2D _menuTxtHelp, Texture2D _menuTxtExit,
            Rectangle _menuTxtStartGameR,Rectangle _menuTxtHelpR, Rectangle _menuTxtExitR)
            : base(game)
        {
            menuBack = _menuBack;
            menuGameName = _menuGameName;
            menuBackR = new Rectangle(0, 0, 800, 600);
            menuGameNameR = new Rectangle(0, 0, 800, 200);
            menuTxtStartGame = _menuTxtStartGame ;
            menuTxtStartGameR = _menuTxtStartGameR;
            menuTxtHelp = _menuTxtHelp;
            menuTxtHelpR = _menuTxtHelpR;
            menuTxtExit = _menuTxtExit;
            menuTxtExitR = _menuTxtExitR;
            //Создаем массив из 3-х элементов
            menu = new P9_2.Classes.Menu[3];
            //Инициализируем элементы массива
            //Элемент с номером 0 активен
            menu[0]=new P9_2.Classes.Menu (game, menuTxtStartGame, menuTxtStartGameR ,Color.Magenta);
            menu[1] = new P9_2.Classes.Menu(game, menuTxtHelp, menuTxtHelpR, Color.White);
            menu[2] = new P9_2.Classes.Menu(game, menuTxtExit, menuTxtExitR, Color.White);
 
        }
        //Метод вызывается для отображения смены пункта меню
        public void GetKey(int i)
        {
            //i=1 - первый пункт
            //i=2 - второй пункт
            //i=3 - третий пункт
            if (i == 1)
            {
                menu[0].color = Color.Magenta;
                menu[1].color = Color.White;
                menu[2].color = Color.White;
 
            }
            if (i == 2)
            {
              menu[0].color = Color.White;
              menu[1].color = Color.Magenta;
              menu[2].color = Color.White;
            }
            if (i == 3)
            {
                menu[0].color = Color.White;
                menu[1].color = Color.White;
                menu[2].color = Color.Magenta;
 
            }
        }
        //Рисование элементов
        public override void Draw(GameTime gameTime)
        {
            //Вывод фона и названия игры
            sprBatch.Draw(menuBack, menuBackR, Color.White);
            sprBatch.Draw(menuGameName, menuGameNameR, Color.White);
            //Вывод элементов меню
            for (int i=0;i<3;i++)
                sprBatch.Draw(menu[i].imageTexture, menu[i].imageRectangle, menu[i].color);
            base.Draw(gameTime);
        }
    }
}

На рис. 9.6. вы может видеть справочный экран.


Рис. 9.6. Экран игровой справки

В листинге 9.6. вы можете найти код класса HelpScreen.

Листинг 9.6. Код класса HelpScreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Content;
 
namespace P9_2
{
    //Экран справки
    public class HelpScreen : Screen 
    {
        //Текстуры для фона и справочной надписи
        Texture2D backTexture;
        Rectangle backRectangle;
        Texture2D helpTexture;
        Rectangle helpRectangle;
 
        public HelpScreen(Game game, Texture2D _back, Texture2D _help, Rectangle _backRec, Rectangle _helpRec)
            : base(game)
        {
            backTexture = _back;
            helpTexture = _help;
            backRectangle = _backRec;
            helpRectangle = _helpRec;
        }
        public override void Draw(GameTime gameTime)
        {
            //Выводим изображения
            sprBatch.Draw(backTexture, backRectangle, Color.White);
            sprBatch.Draw(helpTexture, helpRectangle, Color.White);
            base.Draw(gameTime);
        }
    }
}

 

На рис. 9.7. вы можете видеть игровой экран.


Рис. 9.7. Игровой экран

В листинге 9.7. приведен код игрового экрана – класса GameScreen. Мы использовали простой код для перемещения объекта из проекта P3_4.

Листинг 9.7. Код класса GameScreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Content;
 
namespace P9_2
{
    //Игровой экран
 
    public class GameScreen :Screen
    {
        private Texture2D sprTexture;
        private Rectangle sprRectangle;
        private Vector2 sprPosition;
        private Rectangle scrBounds;
 
 
        public GameScreen(Game game, ref Texture2D newTexture,
            Rectangle newRectangle, Vector2 newPosition)
            : base(game)
        {
            sprTexture = newTexture;
            sprRectangle = newRectangle;
            sprPosition = newPosition;
            scrBounds = new Rectangle(0, 0,
                game.Window.ClientBounds.Width,
                game.Window.ClientBounds.Height);
        }
 
        public override void Initialize()
        {
            // TODO: Add your initialization code here
 
            base.Initialize();
        }
 
        public override void Update(GameTime gameTime)
        {
 
                KeyboardState kbState = Keyboard.GetState();
                if (kbState.IsKeyDown(Keys.Up))
                {
                    sprPosition.Y -= 5;
                }
                if (kbState.IsKeyDown(Keys.Down))
                {
                    sprPosition.Y += 5;
                }
                if (kbState.IsKeyDown(Keys.Left))
                {
                    sprPosition.X -= 5;
                }
                if (kbState.IsKeyDown(Keys.Right))
                {
                    sprPosition.X += 5;
                }
 
                if (sprPosition.X < scrBounds.Left)
                {
                    sprPosition.X = scrBounds.Left;
                }
                if (sprPosition.X > scrBounds.Width - sprRectangle.Width)
                {
                    sprPosition.X = scrBounds.Width - sprRectangle.Width;
                }
                if (sprPosition.Y < scrBounds.Top)
                {
                    sprPosition.Y = scrBounds.Top;
                }
                if (sprPosition.Y > scrBounds.Height - sprRectangle.Height)
                {
                    sprPosition.Y = scrBounds.Height - sprRectangle.Height;
                }
 
                base.Update(gameTime);
 
        }
        public override void Draw(GameTime gameTime)
        {
            sprBatch.Draw(sprTexture, sprPosition, sprRectangle, Color.White);
            base.Draw(gameTime);
        }
    }
}

Задание

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

1378 Прочтений •  [Оформление игр] [08.08.2012] [Комментариев: 0]
Добавил: Ukraine Vova
Ссылки
HTML: 
[BB Url]: 
Похожие статьи
Название Добавил Добавлено
• Оформление игр Ukraine Vova 08.08.2012
Ни одного комментария? Будешь первым :).
Пожалуйста, авторизуйтесь для добавления комментария.

Проект входит в сеть сайтов «8Gamers Network»

Все права сохранены. 8Gamers.NET © 2011 - 2025

Статьи
Рецензия на Pressure
Рецензия на Pressure
Чтобы обратить на себя внимание, начинающие маленькие разработчики, как правило, уходят в жанры, ...
Рецензия на Lost Chronicles of Zerzura
Рецензия на Lost Chron...
Игры, сделанные без любви и старания, похожи на воздушный шар – оболочка есть, а внутри пусто. Lo...
Рецензия на The Bridge
Рецензия на The Bridge
«Верх» и «низ» в The Bridge — понятия относительные. Прогуливаясь под аркой, можно запросто перей...
Рецензия на SimCity
Рецензия на SimCity
Когда месяц назад состоялся релиз SimCity, по Сети прокатилось цунами народного гнева – глупые ош...
Рецензия на Strategy & Tactics: World War 2
Рецензия на Strategy &...
Название Strategy & Tactics: World War II вряд ли кому-то знакомо. Зато одного взгляда на ее скри...
Рецензия на игру Scribblenauts Unlimited
Рецензия на игру Scrib...
По сложившейся традиции в информационной карточке игры мы приводим в пример несколько похожих игр...
Рецензия на игру Walking Dead: Survival Instinct, The
Рецензия на игру Walki...
Зомби и продукция-по-лицензии — которые и сами по себе не лучшие представители игровой биосферы —...
Обратная связь | RSS | Донейт | Статистика | Команда | Техническая поддержка