Навигация
· XNA FAQ
· С чего начать
· Конкурсы
· Обратная связь
· XNA Блоги
Сейчас на сайте
· Гостей: 1

· Пользователей: 0

· Всего пользователей: 3,684
· Новый пользователь: headron
Последние фото
Эх, чуть не проспал закрытие.
Эх, чуть не проспал ...
Альбом: XNA Engine

GB
GB
Альбом: XNA Engine

South Park Coon & Friends
South Park Coon & Fr...
Альбом: XNA Games

Блоги
yavshoke
» XboxOne - интерес...
dampirik
» Push уведомления ...
dampirik
» Реклама,статистик...
Chort
» XNA и StartCoroutine
Chort
» Curve Class
dampirik
» Реклама, статисти...
dampirik
» Увеличение скорос...
dampirik
» Реклама, статисти...
general
» Распаковка DxtCom...
general
» Как работать с XN...
Поддержка
microsoft.com
1gb.ru - Дом для вашего сайта
Статистика посещений:

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

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

Цель работы

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

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

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

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

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

Задание

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



Материал публикуется с разрешения авторов - Ю.В. Дашко, А.А. Заика

Студенческий блог MS Russia
Интернет-Университет Информационных технологий - курс разработан по гранту от Microsoft и ИНТУИТ
сайт ИУБиП

Комментарии
#1 | artkor 07.05.2010 19:50:28
Может кто выложить исходники?))
Нужна графика)
#2 | mike 07.05.2010 23:40:47
это графика кирпича, тут трудно претендовать на реалистичноть
#3 | starostin 27.05.2010 16:40:04
Как то вроде пошло, в классе Game1 вся логика меню, а логика игры в GameScreen, не красивей ли было бы в MenuScreen это вынести?
#4 | PINEgrosbeak 09.05.2011 01:02:16
Спасибо большое, статья очень помогла.
#5 | Misha_xD 18.05.2011 17:03:10
У меня вопрос возник в другом, подскажите, метод GetKey у menu, что в нем?
#6 | Misha_xD 18.05.2011 17:47:50
А глупый, нашел...
Добавить комментарий
Пожалуйста, залогиньтесь для добавления комментария.
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Авторизация
Логин

Пароль



Вы не зарегистрированы?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Мини-чат
Вы должны авторизироваться, чтобы добавить сообщение.

27.08.2014
Я умею немного на asp.net + html и css

22.08.2014
на ASP mvc 3 есть пару проектов. Могу помочь, если нужно. Обидно, если закроется Frown

21.08.2014
я тоже ноль

21.08.2014
Я в вебе только с php занимался да и то на уровне чтоб работало.

21.08.2014
Я в вебе полный ноль…

21.08.2014
Переводить его надо, хоть на ту же азуру. И двиг менять на что-то современное. Если есть веб-разрабы - можем скооперироваться. Один делать не буду.

21.08.2014
не знаю всех нюансов по оплате и все хорошее когда нибудь заканчивается

21.08.2014
А что случилось?

21.08.2014
похоже сайт будет работать до 28го числа

09.08.2014
Апи пока не видел. Но есть приложение в магазине Live Lock Screen BETA, так что думаю скоро будет

08.08.2014
Я про API для Update1. На нем работает это

08.08.2014
А что именно нужно? Чтото и сейчас открыто http://msdn.micro.
...105).aspx

06.08.2014
Кто-нибудь слышал об открытии доступа к Lock Screen Api?

31.07.2014
VPDExpress на базе MVS 2012, ни в какую не ловит исключения. Даже если их сам создаешь. И всех так?

25.07.2014
С днем системного администратора причастных к этой профессии! По случаю - тортик от жены

RSS каналы сайта
XNA - Новости
XNA - Статьи
XNA - Форум
XNA - Галерея
XNA - Файлы
Время загрузки: 0,06 секунд 8,709,475 уникальных посетителей