Створюємо двомірну гру Перший проект Xbox 360 - Розробка ігор - Ігрові статті - Статті про ігри
//============================================= ============================ /// /// Лістинг 5.1 /// Вихідний код до книги: /// «Програмування ігор для приставки Xbox 360 у XNA Game Studio Express» /// Автор книги: Горнаков С. Г. /// Глава 5 /// Проект: FirstProject /// Клас: Program /// Створення першого проекту /// //================== ================================================== ===== using System; namespace FirstProject < static class Program < static void Main(string[] args) < using (Game1 game = new Game1()) < game.Run(); > > > >
//============================================= ============================ /// /// Лістинг 5.2 /// Вихідний код до книги: /// «Програмування ігор для приставки Xbox 360 у XNA Game Studio Express» /// Автор книги: Горнаков С. Г. /// Глава 5 /// Проект: FirstProject /// Клас: Game1 /// Створюємо перший проект /// //================== ================================================== ===== #region Using Statements 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; using Microsoft.Xna.Framework.Storage; #endregion namespace FirstProject < public class Game1 : Microsoft.Xna.Framework.Game < GraphicsDeviceManager graphics; ContentManager content; /// /// Конструктор /// public Game1() < graphics = new GraphicsDeviceManager(this); content = new ContentManager(Services); > /// /// Ініціалізація /// protectedoverride void Initialize() < base.Initialize(); > /// /// Завантаження компонентів гри /// protected override void LoadGraphicsContent(bool loadAllContent) < if (loadAllContent) < > > /// /// Визволяємо ресурси /// protected override void UnloadGraphicsContent(bool unloadAllContent) < if (unloadAllContent == true) < content.Unload(); > > /// /// Оновлюємо стан гри /// protected override void Update(GameTime gameTime) < 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); base.Draw(gameTime); > > >
public Game1() < graphics = new GraphicsDeviceManager(this); content = new ContentManager(Services); >
Тут відбувається створення двох оголошених раніше об'єктів стандартним чином XNA. Фактично об'єкт graphics класу GraphicsDeviceManager замінив усю ту низку викликів різних функцій у DirectX, необхідних для ініціалізації та налаштування графічного пристрою. За конструктором класу Game1() слід визначення методу Initialize().
protected override void Initialize() < // тут слідує код ініціалізації base.Initialize(); >
Цей метод призначений для ініціалізації різних компонентів гри, які вам знадобляться перед першим стартом гри. З цього методу ви можете передавати управління та інші методи, пов'язані з ініціалізацією різних початкових даних (позиції на екрані, ініціалізація різнихзмінних і т. д.). Єдині обмеження цього методу полягають у тому, що в даному методі не можна завантажувати графічні компоненти гри (текстури, моделі), для цього служить метод LoadGraphicsContent().
protected override void LoadGraphicsContent(bool loadAllContent) < if (loadAllContent) < // тут завантажуються моделі та графічні елементи > >
Метод LoadGraphicsContent() необхідний для завантаження графічної складової вашої гри, використовуючи при цьому всю потужність XNA Content Pipeline, що дозволяє завантажити в один рядок коду будь-яку 3D-модель або графіку певного формату. Підтримуваних форматів багато, але про це у наступному розділі, коли ми з цим безпосередньо зіткнемося. Наступним у вихідному коді йде метод UnloadGraphicsContent(), який в автоматичному режимі здійснює вивантаження завантажених 3D-моделей та графіки на етапі виходу з гри. Це свого роду менеджер вивантаження компонентів гри, який працює на автоматі і звільняє захоплені ресурси системи за сигналом виходу з програми. У стандартному використанні завантажувача додавати до методу UnloadGraphicsContent() додатковий вихідний код не потрібно. Але якщо застосовуються різні додаткові завантажувачі, вивантаження завантажених елементів у методі UnloadGraphicsContent() необхідно прописати явно. Потім у вихідному коді класу Game1 розташовується метод Update() з наступним вихідним кодом:
protected override void Update(GameTime gameTime) < if(GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); // код гри base.Update(gameTime); >
< graphics.GraphicsDevice.Clear(Color.CornflowerBlue); // тут малюємо графіку base.Draw(gameTime); >
4.Після цих дій екран телевізора кілька разів блимне чорним кольором. Якщо зв'язок з Інтернетом не дуже хороший, то можлива навіть поява на кілька секунд екрану чорного кольору. На даний момент приставка Xbox 360 з'єднується з відповідними сервісами клубу XNA Creator Club та ідентифікує вас як користувача. Далі відкриється головне вікно програми XNA Game Launcher (рис. 5.8), де вам необхідно вибрати курсором джойстика команду Conect to Computer і натиснути кнопку А. Поточна картинка на екрані зміниться новою картинкою, зображеною на мал. 5.9. У цей момент приставка ще раз з'єднається з Xbox Live, а потім відкриється нове вікно, що вказує на готовність Xbox 360 отримати файли з комп'ютера (рис. 5.10).
5. Тепер вам необхідно повернутися до комп'ютера і у вікні інструментарію Visual C# Express і відкритого проекту FirstProject натиснути правою кнопкою миші на назву проекту, у контекстному меню вибрати команду Deploy, що означає передати файли на приставку (рис. 5.11). У цей момент приставка почне отримувати файли від комп'ютера, а на екрані телевізора ви зможете спостерігати за процесом передачі файлів на консоль (рис. 5.12). Якщо програма дуже велика, то дочекайтеся передачі всіх файлів. Сигналом закінчення передачі даних є повернення до показу на екрані телевізора заставки, що очікує на прийом нових даних (мал. 5.10). А на комп'ютері в інструментарії Visual C# Express у його нижній частині рядка станів має з'явитися напис Deploy Suc ceeded. Тепер комп'ютер можна відключити від мережі та Інтернету, оскільки проектні дані вже передані на приставку.
6. На приставці з вікна очікування передачі вам необхідно повернутися в головне меню програми XNA Game Launcher (натисніть на джойстику кнопку з літерою B), де необхідновибрати команду My XNA Games (рис. 5.8). Вибір цієї команди відкриє вікно My XNA Games зі списком встановлених або переданих раніше програм з комп'ютера (рис. 5.13). На рис. 5.13 ви бачите, що крім переданого на приставку проекту FirstProject у мене на приставці вже встановлені всі приклади (і навіть більше), що вивчаються в цій книзі. У зв'язку з цим я вам гарантую повну працездатність всіх проектів, що розглядаються в цій книзі на приставці Xbox 360! Далі на приставці у вікні My XNA Games оберіть курсором назву проекту FirstProject і натисніть на джойстику кнопку з літерою A. У новому вікні FirstProject (яке в даному випадку представляє програму, що тестується) запустіть проект, вибравши команду Launch (рис. 5.14).
7. Після запуску проекту на екрані ви побачите роботу програми у повноекранному режимі, як показано на рис. 5.15. На цьому всі кроки з перенесення або передачі даних на приставку закінчені, і ви можете насолоджуватися програмою або грою. Не забувайте, що приставка обов'язково має бути підключена до сервісу Xbox Live під час тестування програми.
Для того, щоб задати колір числовими значеннями, використовуйте наступний рядок коду: graphics.GraphicsDevice.Clear(new Color(123, 56, 34);
Сенс механізму зафарбовування екрану кольором у тому, щоб перед показом нового кадру (фрейму) прати вміст екрану однією з кольорів і малювати графіку знову. Тобто якщо ви малюєте на екрані якийсь об'єкт і потім бажаєте його перемістити по екрану, необхідно спочатку стерти цей об'єкт зі старого місця і намалювати вже в новому місці. Метод Clear() виступає як пральна гумка, очищаючи екран телевізора чи монітора. Якщо не прати екран кольором, то за об'єктом, що рухається, буде залишатися великийшлейф, що складається із попередніх сформованих кадрів. Більш того, крім первинної поверхні екрана, існує ще й вторинна поверхня, або так званий вторинний буфер. Кожен наступний кадр гри формується не так на первинній поверхні екрана, а у вторинному буфері. Коли настає час показу чергового кадру, то відбувається своєрідне перемикання між буферами, а старий буфер стирається кольором, і в ньому виводиться наступний кадр гри і т. д. Швидкість перемикання або зміни буферів величезна і дорівнює тим самим FPS, тобто …30– 60... кадрів за секунду. Цей механізм дозволяє створювати в додатках плавну анімацію всього ігрового процесу і називається подвійною буферизації. Кількість додаткових неекранних поверхонь може сягати кількох штук. Перемикання між поверхнями відбувається автоматично на рівні системи, тому слідкувати за тим, який із буферів в даний момент увімкнений, а який вимкнений, необхідності немає.
В Vicual C# Express є така функція, як створення шаблону на базі поточного проекту. Якщо у відкритому проекті Vicual C# Express виконати команди Export Template, то поточний проект додасться до шаблонів інструментарію і надалі при формуванні проекту, у діалоговому вікні створення проекту в області MyTemplates з'явиться ваш шаблон. Створення нового проекту на базі такого ось шаблону збереже в новому проекті ваш старий GUID, відповідно переносячи на приставку новий проект, ви зітріть будь-який інший раніше встановлений проект, створений на базі цього шаблону.
Таблиця 5.1. Роздільна здатність екранів телевізорів і типи сигналівРоздільна здатністьТип сигналу720 × 540Std. NTSC 601720 × 534Std. NTSC DV/DVD864 × 480Wide NTSC DV/DVD864 × 486WideNTSC 601640 × 480, 768 × 576 ...Std. PAL1024 × 576Wide PAL1280 × 720HDTV 720p1920 × 1080HDTV 1028i/1028p
Як очевидно з табл. 5.1, для стандарту HD роздільна здатність екранів дорівнює величинам 1280 × 720 пікселів (720p) або 1920 × 1080 пікселів (1080i). Ще є формат 480p, але він в основному застосовується у маленьких телевізорах. Ці дозволи для стандарту HD є загальноприйнятою специфікацією. Всі виробники зобов'язані забезпечити на своїх виробах з підтримкою HDTV щонайменше відображення картинки у форматі 720p або 1080i, або й те й інше разом. Формат запису 720p та 1080i має своє технічне визначення. Так, цифри в цих позначеннях представляють кількість рядків на екрані телевізора. У свою чергу, англійські літери p і i позначають відповідно черезрядкову (interlaced) та прогресивну (progressive) розгортку екрана телевізора. Черезрядкова розгортка намагається представляти на екрані телевізора одночасно 60 кадрів за секунду. Але оскільки всі аналогові телевізійні сигнали були раніше розраховані на 30 кадрів на секунду, то через рядкову розгортку доводиться робити сигнал на непарні та парні рядки і показувати їх в одну секунду по тридцять разів кожну. Наше око з'єднує парні та непарні рядки в один кадр, і на виході ми маємо ті самі 60 кадрів за одну секунду. Прогресивна розгортка технічно дозволяє показувати всі 60 кадрів за секунду. Цьому типу розгортки не потрібно дробити рядки на парні та непарні, а виведення рядків відбувається послідовно від першого до останнього рядка. Як правило, якість картинки в прогресивній розгортці значно краща і чіткіша. Об'єкти в цьому випадку не тремтять, а їхні рухи виглядають набагато плавнішими. Більше інформації на цю тему ви зможете знайтив українськомовному Інтернеті. Наприклад, на форумі сайту http://www.xboxrussia.ru або http://www.xboxland.net, де є маса рекомендацій щодо вибору телевізора або монітора для Xbox 360. На сайті http://www.xbox360 .com є також пояснення формату HD, але, щоправда, англійською мовою (рис. 5.18).
Таблиця 5.2. Роздільна здатність екранів для Xbox 360ПозначенняРоздільна здатністьAV (Composite)640×480480p (Normal)640× 480480p (Widescreen)640×480720p (Widescreen)1280×7201080i/1080p (Widescreen)1920× 1080
Щоб встановити роздільну здатність екрана в 720p, до вихідного коду розглянутого в цьому розділі проекту додайте два нові рядки.
public Game1() < graphics = new GraphicsDeviceManager(this); content = new ContentManager(Services); graphics.PreferredBackBufferWidth = 1280; graphics.PreferredBackBufferHeight = 720; >
Цими новими рядками вихідного коду ми встановлюємо відповідно ширину та висоту екрана в 1280 та 720 пікселів. Цікавою особливістю Xbox 360 є автоматична зміна розмірів графіки під роздільну здатність екрана. Так, якщо ви намалювали своїх героїв під 1080i, а потім спробуєте виставити і запустити гру на 720p, то Xbox 360 в автоматичному режимі зменшить без втрат (або з мінімальними втратами) всі графічні елементи сцени і намагатиметься уявити їх у вигідному світлі.
Для Windows-програм, написаних у XNA Game Studio Express 1.0 Refresh, також можливе використання вищеописаного механізму, але виконання команди на виконання просто запустить програму на комп'ютері користувача.