MindBlaster - Російський Coding 4 Fun

У цій статті Брайєн Пік описує свій проект на PDC 2009 – гру MindBlaster на платформі XNA, яка використовує Nintendo Wii Remote у поєднанні з гарнітурою MindSet від Neurosky, що дозволяє зчитувати електромагнітні коливання мозку за принципом електроенцефалограми.

Необхідний час:багато годин

Витрати:близько $250 на необхідне обладнання

Обладнання:контролер Wiimote, гарнітура MindSet від Neurosky, інфрачервоний світлодіод або Wireless Sensor Bar

MindBlaster – досить проста гра, написана із застосуванням XNA і здатна працювати на ПК під керуванням Windows у поєднанні з гарнітурою MindSet та контролером Nintendo Wiimote. Суть гри така: ви повертаєте голову, щоб переміщати приціл на екрані і наводити його на ворожі кораблі прибульців, потім зосереджуєте свою увагу на вибраному кораблі, щоб розжарити його і зрештою підірвати. Чим більше ви концентруєтеся, тим швидше вибухає ворожий корабель. Але чим більше ворогів ви знищуєте, тим інтенсивніше вони ведуть вогонь у відповідь по вам, що забезпечує дуже бурхливий геймплей до тих пір, поки атака не посилюється настільки, що ви не витримуєте натиску і вас знищують.

Давайте обговоримо деякі компоненти, які були використані для створення MindBlaster, і те, як вони були інтегровані у фінальну версію гри.

Як я вже казав, Mindset – це гарнітура від Neurosky, здатна зчитувати альфа-, бета-, тета- та гамма-хвилі, що випромінюються мозком, через чотири сухі датчики, три з яких розміщуються на лівій частині гарнітури, що прикриває вухо, і один – на кріпленні, що стосується чола. Крім того, цей пристрій містить мікрофон і навушники, що робить його повноцінним.аудіогарнітурою.

Пристрій підключається до ПК через Bluetooth і з'являється в системі як послідовний порт Bluetooth. А це означає, що ми можемо дуже легко взаємодіяти з цим пристроєм. Однак Neurosky також надає власний API із простою оболонкою на C#, яка ще більше полегшує розробку під .NET. Поверх нього я написав нескладний API, який частково імітує мою Managed Wiimote Library, яку можна завантажити окремо від цієї програми; цей API ще трохи спрощує розробку із застосуванням Mindset у середовищі .NET.

Одна з цікавих особливостей MindSet - від вас не потрібно знати, що таке хвилі, що випромінюються мозком, або як все це працює. Я гадки не маю, чим відрізняється альфа-хвиля від тета-хвилі, але все одно зміг створити більш-менш пристойну гру, в якій вони використовуються. Neurosky розробила свій (закритий) алгоритм, який набуває значення мозкових хвиль і перетворює їх на єдиний показник «уваги» та «споглядання» від 1 до 100. Це дозволяє дуже легко визначати, наскільки сконцентрована чи розслаблена людина.

Використовувати API, що надається, теж досить просто. Ось фрагмент коду, який виконує підключення до гарнітури та витягує у циклі значення мозкових хвиль. Ви навряд чи захочете безпосередньо використовувати це у своїй програмі, але цей фрагмент ілюструє деякі важливі моменти:

Цей код, використовуючи API, отримує ідентифікатор з'єднання, відкриває з'єднання з гарнітурою по наданому COM-порту, а потім цикл зчитує всі пакети даних, що надходять від гарнітури, і отримує поточний стан запитаних значень.

Я створив дуже просту бібліотеку, яка є інтерфейсом гарнітури, і зробив її окремим завантаженням. Якщо вас просто цікавить використання цієїгарнітури в середовищі .NET, прочитайте статтю про цю бібліотеку за наведеним раніше посиланням.

Nintendo Wiimote кріпиться догори дригом до верхньої частини гарнітури, його інфрачервона камера використовується для відстеження повороту голови у двомірній площині. Для конференції PDC я витяг начинку Wiimote з корпусу і змонтував прямо на гарнітурі, додавши акумуляторний відсік від Radio Shack, що закріплюється. Реальної потреби в цьому не було, і ви можете закріпити свій Wiimote у корпусі.

російський

Wiimote містить камеру з роздільною здатністю 1024х768 пікселів, яка здатна розпізнавати до чотирьох джерел інфрачервоного випромінювання (ІЧ). У цьому додатку мені потрібна була лише одна ІЧ-джерело, оскільки нахил мене не цікавив. Як джерело я використав Nyko Wireless Sensor Bar.

За допомогою своєї Managed Wiimote Library я можу опитувати поточний стан ІЧ-камери, щоб отримувати координати X та Y ІЧ-джерела та транслювати їх у позицію прицілу на екрані.

У загальній архітектурі гри та її виведення на екран використовуються частини прикладу Game State Management від XNA Creators Club. Кожен екран міститься у власний об'єкт зі своїми методамиUpdate,Draw,LoadContentта ін. Це дозволяє зберігати титульний екран, екран налаштувань, ігровий екран та екран фінальних результатів як окремі "сутності" для спрощення розробки.

Давайте трохи поговоримо про кожен екран і виділимо найголовніше в них.

Ведучи розробку вдома і демонструючи результат на PDC, мені потрібен був екран налаштувань, зроблений «дешево і сердито», який дозволяв би швидко включати та відключати різні функції гри. Наприклад, при розробці насправді не було потреби весь час носити гарнітуру, тому я написав деякий код, щоб користуватисямишею замість реального пристрою. Екран налаштувань таки давав мені можливість легко перемикати подібні речі. З цією метою я створив об'єкт, що успадковує від класу з прикладу Game State Management. Елементи меню у цьому випадку створюються так:

Цей код створює елемент, пов'язує з ним обробник подій і додає елемент до списку. В обробнику подій ви можете робити все, що вам знадобиться: включати/відключати команду, збільшувати або зменшувати значення і т.д.

На титульному екрані просто відображається графічна заставка та текст «Press Start» або будь-який додатковий текст у тому випадку, якщо вимкнуто гарнітуру, відключено Wiimote або виявлено якусь іншу помилку.

Ось тут і діється все диво. Можливо, вас це здивує, але в файліGamePlayScreen.csзовсім немає тонни коду. Логіка гри дуже проста: переміщуємо приціл на основі позиції, що повідомляється ІЧ-камерою Wiimote, перевіряємо, чи потрапляє він на ворога; якщо так, зменшуємо рівень життя (hit points) ворога, і якщо цей рівень падає нижче 0, вибухаємо ворожий корабель. Крім того, вороги літають екраном і обстрілюють гравця ракетами. Розгляньмо деякі елементи гри.

Кожен малюваний об'єкт у грі успадковує від базового класуDrawable2DабоDrawable3D. Ці класи визначають деякі прості властивості, наприклад позицію, початок координат, масштаб та ін, і надають методи, які повинні бути реалізовані у похідних класах, скажімо, LoadContent ,UpdateіDraw, що відповідають архітектурі стандартного XNA-додатку. Ось як виглядає класDrawable2D:

КласDrawable3Dмайже ідентичний попередньому, але переносить усе у тривимірний простір, використовуючи для позначенняпозиційVector3. Він також включає властивістьModelдля зберігання геометрії об'єкта та властивість, що містить поточну матрицю перетворенняWorld.

Ворожі кораблі та ракети були змодельовані у 3D Studio Max та експортовані у файловому форматі .X для використання конвеєром XNA Content Pipeline за допомогою kW X-port – безкоштовного плагіна для 3D Studio Max, який вміє експортувати моделі та анімації у формат .X із найрізноманітнішими налаштуваннями користувача.

Поворот та політ

Цей код використовує векторну математику для отримання напрямку випадкової точки щодо поточної орієнтації корабля. Потім обчислюється кут повороту, вісь, якою буде відбуватися реальний поворот залежно від місцезнаходження, і, нарешті, розраховується і повертається матриця обертання.

Ця матриця використовується для повороту корабля протягом короткого періоду із застосуванням методуVector3.SmoothStep, який інтерполює два значення, використовуючи кубічне рівняння (рівняння третього ступеня). Як тільки поворот до мети виконаний, корабель «плавно крокує» у свою кінцеву позицію, а потім повертається у бік камери за допомогою вже показаного вище методуRotateToTarget- цього разу цільовою є позиція камери.

Використання прикладів XNA

У грі MindBlaster я використав кілька прикладів із XNA Creators' Club. На мій погляд, на сайті є чудові приклади, які полегшують життя всім розробникам на платформі XNA. Не говоритиму за всіх, але особисто я вважав за краще запозичити працюючий, добре протестований двигун частинок (particle engine), а не витрачати час на його створення з нуля, особливо при таких стислих термінах, в які я повинен був вкластися з цим проектом. Раніше вцій статті я пояснив, як я використав приклад Game State Management, щоб отримати базову архітектуру екранів для своєї програми. Я також використовував його класMenuScreenдля описаного вище екрана налаштувань.

Двигун двомірних частинок я взяв із прикладу NetRumble. Хоча моя гра насправді тривимірна, я зміг вивернутися так, щоб ефекти частинок на екрані у двомірному просторі поверх координат корабля у тривимірному просторі справляли цілком пристойне враження.

Двигун частинок включає приклади ефектів для різних вибухів та димових хвостів. Я використав ці ефекти під час вибуху ворожого корабля, запуску ракет з кораблів та появі корабля в полі зору.

Отримати позицію у двовимірному просторі тривимірного об'єкта у просторі світових координат дозволяє наступний метод, що міститься у класіDrawable3D:

Він використовує XNA-методViewport.Projectдля повернення двовимірної позиції тривимірного об'єкта з урахуванням його поточної позиції в тривимірному просторі, поточної проекції матриці камери і матриці подання камери.

Таким чином, коли вибухає ворожий корабель або вистрілюється ракета, обчислюється двомірна позиція тривимірного об'єкта, і в цій позиції показується двомірний ефект частинок.

Приклад Bloom Postprocessor на сайті XNA Creators Club надаєDrawableGameComponent, що дозволяє дуже легко використовувати розпливання (bloom).DrawableGameComponent– це клас, що реалізує кілька методів, таких якUpdateтаDraw; він додається до наборуComponentоб'єктаGame. Під час створення кожного кадру викликаються відповідні методи, у результаті об'єкт оновлюється, та був малюється.

Розпливання – гарний ефект, якийвикликає спотворення джерел яскравого світла. Приблизно так само реагують ваші очі, коли ви виходите з темної кімнати надвір у яскравий сонячний день. Я активно застосовував цей ефект у грі, щоб при розжарюванні змінювався блиск кораблів. Крім того, коли ворожа ракета потрапляє в гравця, я на кілька мілісекунд заливаю екран білим; у поєднанні з розпливанням це справляє відмінний ефект, аналогічний тому, якби ви довго дивилися на яскраве світло, а потім швидко перевели погляд на щось темне.

ВикористовуватиBloomComponentнапрочуд легко. У методіInitializeгри вкажіть:

Тепер об'єкт підключається до поверхонь малювання та застосовує ефект до кожного кадру. У приклад входять кілька різних ефектів розпливання з різними параметрами, тому достатньо поекспериментувати зі своїми значеннями та підібрати те, що найкраще підходить для вашої гри.

Як встановити та грати

Переконайтеся, що у вас встановлена ​​програма XNA Game Studio 3.1 або редистрибутивний пакет XNA 3.1.

Для гри запустіть файл, що виконується, і налаштуйте параметри, що підходять для вашого варіанту. Наприклад, ви можете вимкнути Wiimote або гарнітуру, якщо у вас немає відповідного обладнання.

Стрілки вгору/вниз/вліво/вправо – навігація меню налаштувань

1 – включення налагоджувального висновку у грі

Page Up – скидання гри

Якщо ви відключили підтримку Wiimote на екрані налаштування, в якості приводу прицілу можна використовувати мишу. А якщо ви відключили підтримку гарнітури, рівень концентрації уваги можна буде збільшувати/зменшувати за допомогою лівої/правої кнопки миші.

Перемістіть приціл на ворога і концентруйте увагу на ворога, щоб збільшити силу впливу на корабель. Чим більша ця сила, тимшвидше корабель нагріється і вибухне. У міру гри вороги почнуть вогонь у відповідь. Переміщуйте приціл на ракети та підривайте їх аналогічним чином, поки вони не потрапили до вас.

Зрозуміло, у грі набагато більше важливих деталей, ніж було показано тут, але в одній статті неможливо описати кожен байт коду. Я намагався охопити важливі моменти та найважчі частини, а також показати, як зручно використати існуючі приклади для швидкого створення ігор на платформі XNA.

Якщо у вас є якісь питання або ж ви хотіли б отримати додаткові пояснення щодо певних частин гри, будь ласка, зв'яжіться з нами – я буду радий відповісти на запитання і, можливо, розширю цю статтю.

  • Джоуї Бучеку (Joey Buczek) за всі тривимірні моделі та дизайн гри.
  • Девіду Волліманну (David Wallimann) за всі звукові ефекти та музику у грі.
  • Ріку Барразе (Rick Barraza) за ідею перенесення гри у космічний простір. Це краще, ніж дорога, про яку я думав спочатку… 🙂
  • Грегу Хайверу (Greg Hyver) та Джонні Лью (Johnny Liu) з компанії Neurosky за надану мені гарнітуру та обладнання, видане на час проведення конференції PDC.
  • Мішель Лівітт (Michelle Leavitt) за безкінечне тестування.
  • Розробників XNA, які написали різноманітні навчальні посібники та набори для початківців, код з яких заощадив мені багато часу при створенні гри. Без них я швидше за все і зараз би ще писав движки частинок, шейдери розпливання зображень та інші частини. Ви дуже допомогли мені!

">