Быть может кто-то из Вас знает игру 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. вы может видеть справочный экран.