MindBlaster - Руско кодиране 4 Fun

В тази статия Brian Peek описва своя проект PDC 2009, MindBlaster, базирана на XNA игра, която използва Nintendo Wii Remote в комбинация със слушалките MindSet на Neurosky, които четат електромагнитните вълни на мозъка, използвайки принципа на ЕЕГ.

Необходимо време:много часове

Разходи:около $250 за необходимото оборудване

Хардуер:Wiimote контролер, Neurosky MindSet слушалки, IR LED или безжична сензорна лента

MindBlaster е доста проста игра, написана на XNA и може да работи на компютър с Windows, когато е сдвоена със слушалки MindSet и контролер Nintendo Wiimote. Същността на играта е следната: завъртате главата си, за да преместите мерника на екрана и да го насочите към вражеските извънземни кораби, след което фокусирате вниманието си върху избрания кораб, за да го осветите и евентуално да го взривите. Колкото повече се концентрирате, толкова по-бързо експлодира вражеският кораб. Но колкото повече врагове унищожавате, толкова по-интензивно те отвръщат на огъня срещу вас, което осигурява много насилствена игра, докато атаката не се увеличи толкова много, че не можете да издържите на атаката и бъдете унищожени.

Нека обсъдим някои от компонентите, използвани за създаването на MindBlaster и как са интегрирани във финалната игра.

Както казах, Mindset е слушалка от Neurosky, която може да чете алфа, бета, тета и гама вълни, излъчвани от мозъка чрез четири сухи сензора, три от които са поставени от лявата страна на слушалките, които покриват ухото, и един на стойката, която докосва челото. Освен това това устройство съдържа микрофон и слушалки, което го прави завършенаудио слушалки.

Устройството се свързва с компютъра чрез Bluetooth и се показва в системата като Bluetooth сериен порт. А това означава, че можем да взаимодействаме с това устройство изключително лесно. Въпреки това, Neurosky предоставя и собствен API с проста C# обвивка, която прави .NET разработката още по-лесна. Освен това написах прост API, който донякъде имитира моята управлявана Wiimote библиотека, която може да бъде изтеглена отделно от това приложение; този API прави разработката с Mindset още по-лесна в .NET.

Едно от страхотните неща на MindSet е, че не е нужно да знаете какво представляват мозъчните вълни или как работят. Нямам представа как алфа вълната се различава от тета вълната, но все пак успях да създам повече или по-малко прилична игра, която ги използва. Neurosky са разработили свой собствен (затворен) алгоритъм, който взема стойности на мозъчни вълни и ги преобразува в един резултат за „внимание“ и „съзерцание“ от 1 до 100. Това прави много лесно да се определи колко фокусиран или отпуснат е човек.

Използването на предоставения API също е доста лесно. Ето кодов фрагмент, който се свързва със слушалки и извлича стойностите на мозъчните вълни в цикъл. Вероятно не искате да използвате това директно във вашето приложение, но този фрагмент илюстрира някои от важните точки:

Този код, използвайки API, получава идентификатора на връзката, отваря връзка към слушалките на предоставения COM порт, след което преминава през всички пакети данни, идващи от слушалките, и получава текущото състояние на заявените стойности.

Създадох много проста библиотека, която служи като интерфейс за слушалки, и я направих самостоятелно изтегляне. Ако просто се интересувате от използването на товаслушалки в .NET среда, прочетете статията за тази библиотека на предоставената по-рано връзка.

Nintendo Wiimote е монтиран с главата надолу върху слушалките и неговата инфрачервена камера се използва за проследяване на движението на главата в 2D равнина. За конференцията на PDC премахнах хардуера на Wiimote от кутията и го монтирах директно към слушалките, като добавих гнездо за батерия от Radio Shack. Нямаше реална нужда от това и можете да монтирате своя Wiimote в кутията.

руско

Wiimote съдържа 1024×768 пикселна камера, способна да открива до четири инфрачервени (IR) източника. В това приложение имах нужда само от един IR източник, тъй като наклонът не ме интересуваше. Използвах безжичната сензорна лента Nyko като източник.

С моята управлявана Wiimote библиотека мога да направя запитване за текущото състояние на IR камерата, за да получа координатите X и Y на източника на IR и да ги преведа в позицията на мерника на екрана.

Цялостната архитектура на играта и нейният дисплей използва части от примера за управление на състоянието на играта от XNA Creators Club. Всеки екран се поставя в собствен обект със собствени методиUpdate,Draw,LoadContentи т. н. Това ви позволява да запазите заглавния екран, екрана с настройки, екрана на играта и екрана с крайните резултати като отделни „обекти“, за да опростите разработката.

Нека поговорим малко за всеки екран и да подчертаем най-важното в тях.

Докато разработвах у дома и демонстрирах резултата в PDC, имах нужда от евтин и евтин екран за настройки, който да ми позволи бързо да активирам и деактивирам различни функции на играта. Например, когато разработвах, наистина нямаше нужда да нося слушалки през цялото време, така че написах някакъв код, който да използваммишка вместо истинско устройство. Екранът с настройки просто ми даде възможност лесно да превключвам такива неща. За тази цел създадох обект, който наследява класаMenuScreenот примера за управление на състоянието на играта. Елементите от менюто в този случай се създават по следния начин:

Този код създава елемент, свързва своя манипулатор на събития с него и добавя елемента към списъка. В манипулатора на събития можете да правите каквото ви е необходимо: да активирате / деактивирате команда, да увеличите или намалите определена стойност и т.н.

Заглавният екран просто показва начален екран и текста „Натиснете Старт“ или всеки допълнителен текст, ако слушалките са деактивирани, Wiimote е прекъснат или е открита някаква друга грешка.

Тук се случва цялата магия. Може да ви изненада, но самият файлGamePlayScreen.csизобщо не съдържа много код. Логиката на играта е доста проста: преместете мерника въз основа на позицията, отчетена от IR камерата на Wiimote, проверете дали удря враг; ако е така, намаляваме точките за живот на врага и ако това ниво падне под 0, взривяваме вражеския кораб. Освен това враговете летят по екрана и изстрелват ракети по играча. Нека разгледаме по-подробно някои елементи на играта.

Всеки чертожен обект в играта наследява от базовия класDrawable2DилиDrawable3D. Тези класове дефинират някои прости свойства, като позиция, произход, мащаб и т.н., и предоставят методи, които трябва да бъдат внедрени в производни класове, катоLoadContent,UpdateиDraw, съответстващи на архитектурата на стандартно XNA приложение. Ето как изглежда класътDrawable2D:

КласътDrawable3Dе почти идентичен с предишния, но пренася всичко в триизмерно пространство, използвайки за обозначаванепозицииВектор3. Той също така включва свойство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. Няма да говоря от името на всички, но лично аз предпочетох да взема назаем работещ, добре тестван двигател с частици (двигател с частици), вместо да отделям време за изграждането му от нулата, особено с толкова кратък срок, който трябваше да изпълня с този проект. По-рано вВ тази статия обясних как използвах примера за управление на състоянието на играта, за да получа основната екранна архитектура за моето приложение. Използвах и неговия класMenuScreenза горния екран с настройки.

Взех 2D двигателя на частиците от примера на NetRumble. Въпреки че моята игра всъщност е 3D, успях да я завъртя, така че ефектите на частици на екрана в 2D върху координатите на кораба в 3D да направят доста добро впечатление.

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

Следният метод, съдържащ се в класаDrawable3D, ви позволява да получите позицията в двуизмерното пространство на триизмерен обект в пространството на световните координати:

Той използва методаViewport.ProjectXNA, за да върне 2D позицията на 3D обект, като се има предвид текущата му позиция в 3D пространството, текущата проекционна матрица на камерата и матрицата на изгледа на камерата.

По този начин, когато вражески кораб експлодира или когато бъде изстреляна ракета, 2D позицията на 3D обекта се изчислява и 2D ефектът на частиците се показва в тази позиция.

Примерът за постпроцесор Bloom на сайта на 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 за всички 3D модели и дизайн на игри.
  • David Wallimann за всички звукови ефекти и музика в играта.
  • Рик Бараза за идеята да пренесе играта в открития космос. По-добре е от пътя, за който си мислех в началото... 🙂
  • Грег Хайвър и Джони Лиу от Neurosky за това, че ми предоставиха слушалки и оборудване за времетраенето на PDC.
  • Michelle Leavitt за безкрайни тестове.
  • Разработчиците на XNA, които написаха различни уроци и стартови комплекти, кодът, който ми спести много време при създаването на играта. Без тях най-вероятно все още щях да пиша двигатели на частици, шейдъри за размазване на изображения и други части... Много ми помогнахте!

">