|
Быть может кто-то из Вас знает игру Sims, к какому жанру она относиться? Жизненная симуляция, ролевая игра, там можно и дома строить..... |
Оформление игры
| Параметр вызова метода | Описание параметра |
|---|---|
| MyFont | Переменная типа SpriteFont – шрифт, которым выводится текст |
| OutString | Переменная типа String – текст для вывода |
| StringPosition | Переменная типа Vector2 – позиция текста |
| Color.Red | Цвет текста |
| 0 | Поворот текста в радианах относительно точки привязки координат текста |
| StringOrigin | Переменная типа Vector2 – точка привязки координат объекта |
| 1.0f | Коэффициент масштабирования объекта |
| SpriteEffects.None | Эффект спрайта |
| 0.5f | Глубина текста – положение относительно других графических объектов |
На рис. 13.3. вы можете видеть игровой экран проекта P9_1.
Оформление игры
Создадим новый проект P9_2. На его примере рассмотрим приемы работы, освоение которых вынесено в задачи данной работы.
Задача оформления игры сводится к созданию нескольких игровых экранов с определенной функциональностью и к разработке системы перемещения между этими экранами.
На рис. 13.4. вы можете видеть окно Project Explorer проекта P9_2.
В листинге 13.2. приведен код класса Game1.
using System;
using System.Collections.Generic;
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.Net;
using Microsoft.Xna.Framework.Storage;
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();
}
}
}
Листинг
13.2.
Код класса Game1
В листинге 13.3. вы можете видеть код класса Classes.Menu
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Storage;
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;
}
}
}
Листинг
13.3.
Код класса Classes.Menu
В листинге 13.4. приведен код класса Screen – этот класс является базовым для классов игровых экранов. Он содержит методы для активации и деактивации игровых экранов.
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Storage;
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;
}
}
}
Листинг
13.4.
Код класса Screen
На рис. 13.5. вы можете видеть экран игрового меню.
В листинге 13.5. приведен код класса MenuScreen.
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Storage;
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);
}
}
}
Листинг
13.5.
Код класса MenuScreen
На рис. 13.6. вы может видеть справочный экран.



