- Знакомство с XNA и написание первой музыкальной игры
- XNA – Быстрый старт
- Так что же такое XNA?
- Почему XNA?
- C чего начать?
- Минимальный проект
- Ближе к делу
- Загрузка контента
- Вывод графики
- Вывод 2D графики и текста при помощи SpriteBatch
- Вывод 3D графики
- Управление
- Аудио
- Запуск игры на машине пользователя
- Ccылки
- Microsoft xna Framework redistributable
- Где можно скачать?
- Обновление microsoft xna framework redistributable
- Распространенные ошибки при работе с программой
- Xna framework как установить
- Создание кроссплатформенной игры на ПК, Xbox и WP7 с XNA Framework Game Studio
- Что вам нужно
- Что мы будем строить
- Шаг 1: Сборка Windows Phone 7 XNA Framework Игра
- Давайте начнем с небольшой теории …
- Давайте импортируем некоторые текстуры в наш проект …
- Приступая к коду …
Знакомство с XNA и написание первой музыкальной игры
Привет всем начинающим геймдевелоперам и просто хорошим людям. Сегодня, я хочу познакомить вас с замечательным фреймворком XNA (набор инструментов с управляемой средой времени выполнения dotNet). Программировать мы будем на C#.
Для того, чтобы познакомить вас с XNA ближе, я предлагаю написать простую «музыкальную» 2D игрушку. Остальное под катом.
Краткое описание на википедии
Microsoft XNA (англ. XNA’s Not Acronymed) — набор инструментов с управляемой средой времени выполнения (.NET), созданный Microsoft, облегчающий разработку и управление компьютерными играми. XNA стремится освободить разработку игр от написания «повторяющегося шаблонного кода»
Что для этого нам будет нужно?
Что предполагается разобрать и сделать на этом уроке?
Какую игру мы будем реализовывать?
Механика игры проста до безумия. Смысл будет построен на музыке, в случае с этой игрой, будет использована композиция Исаака Шепарда — Leaves in the Wind. Нужно будет ловить мышкой «ноты», скорость и кол-во которых будут зависимы от текущей позиции в музыки, грубо говоря игровой «визуализатор». Для разнообразия существуют 5 тип нот: обычные, красные (враги), пурпурные (мощь), мигающие (превращает все в желтые), желтые (увеличивает скорость набора очков и размеры).
Собираем вещи пустой проект
Проект music_catch — «логика» нашего приложения.
Game1.cs — главный класс приложения, унаследован он от Microsoft.Xna.Framework.Game
Program.cs — «точка входа» в приложение, он нам не интересен.
Проект music_catchContent — «контент» нашего приложения, туда мы будем складывать ресурсы.
Более подробно взглянем на Game1.cs
В нем можно выделить основные функции, такие как:
Game1() — конструктор класса.
Initialize() — инициализация приложения.
LoadContent() — загрузка контента.
UnloadContent() — выгрузка контента.
Update(GameTime gameTime) — обновление логики приложения (например физики, etc)
Draw(GameTime gameTime) — отрисовка игры. ВНИМАНИЕ, любые операции с рисованием нужно проводить тут и только тут.
Пустой проект собран, идем дальше, добавляем ресурсы в приложение, все нужные ресурсы «кидаем» в папку music_catch\music_catchContent. В нашем случае — пять PNG файлов и одно музыкальное сопровождение. Добавляем это все в проект:
Там же создаем шрифт, в теле SpriteFont1.spritefont указываем имя и размер:
Создаем переменные для будущего контента:
И грузим его в LoadContent():
Кстати, подгружается контент следующим образом: вызывается Content.Load<>(«asset»);
В треугольных скобках указывается процессор контента, в нашем случае это Texture2D, Song, SpriteFont. Можно использовать свои процессоры, об этом я расскажу как-нибудь потом.
Контент подгружен, идем в конструктор Game1() и пишем:
Пишем «игровую логику»
Теперь нам нужно создать контроллер системы частиц и сами частицы (ноты), которые мы будем виртуозно ловить мышкой.
Создаем два класса: Catcher (сами частицы) и CatcherHolder (система частиц).
Листинг Catcher с комментариями:
Листинг CatcherHolder с комментариями:
Объясню, что за загадочный аккумулятор и зачем он нужен. Поговорим о «музыкальном» спектре.
Музыкальный сигнал – пища для аудиосистемы. Точнее – не так. Динамики музыку не слушают, ее восстанавливает наш мозг, получая сложный сигнал, содержащий множество частотных составляющих.
Дак вот, идея такая, слушать «частоты» каждый Update и записывать их в какой-нибудь, например, VisualizationData. Проще говоря, в массив из 128 элементов, которые изменяются от 0f до 1f.
Как этим можно воспользоваться?
Каждый Update: значения в массиве меняются в соответствии с музыкой, нам нужно проверить все 128 элементов, если значение элемента больше чем 0.6f, вызываем Beat-функцию и передаем ей Wave (индекс элемента массива, в котором произошло событие). Все бы хорошо, можно в Beat создавать частичку-ноту. Но представим, что у нас выполняется три Update’а подряд, в котором в одном и том же индексе — значение > 0.6f, как итог будет 100500 частичек за секунду. Чтобы таких вещей не происходило, можно использовать аккумулятор. Смысл его прост: при Beat’е у ячейки массива-аккумулятора соотвествующего индексу Wave отнимается константа BEAT_COST. Каждый Update ко всем элементам аккумулятора прибавляется ACCUMULATE_SPEED. Перед тем, как вызвать Beat проверяется выполняется ли условие — значение аккумулятора > ACCOMULATOR_REACTION, если да, то вызываем Beat. Это решает проблему.
Кстати, BEAT_REACTION — значение, после которых нужно проверять, стоит ли вызывать Beat.
Дальше приведу полный листинг GameLogic (Game1). Много кода, но постараюсь расписать в комментариях.
Вот такая простенькая игрушка получается. На конечной машине пользователя должен быть установлен XNA 4.0 и .NET;
Скриншот:
XNA – Быстрый старт
Наша задача, быстро ввести вас в курс дела, — что такое XNA, как его использовать. Статья рассчитана на людей уже имеющих определённый опыт программирования (но не знакомых собственно с XNA), и желающих кратко ознакомиться с платформой.
Так что же такое XNA?
Само название шутливый рекурсивный акроним «не являющийся акронимом». XNA — XNA’s Not Acronymed.
При помощи XNA на данный момент можно разрабатывать игры для Windows (XP, Vista, 7), XBOX360, а также ZUNE (но только 2D, так как текущие модели ZUNE не поддерживают 3D).
Почему XNA?
C чего начать?
Вам нужно иметь уже установленную Microsoft Visual Studio 2008 или же бесплатную версию – Microsoft Visual C# 2008. Должна быть в наличии видеокарта с поддержкой DirectX 9.0c и как минимум шейдеров версии 1.1. (разработчики XNA отказались от фиксированного графического конвейера, в связи с чем минимальная версия шейдеров 1.1 является обязательным требованием). В добавок желательно иметь свежую версию DirectX, например за ноябрь 2008 года вполне подходит. Если эти условия выполнены, можете наконец перейти к установке XNA Game Studio (в конце статьи приведены ссылки на актуальные версии).
Собственно, минимальные проекты игр для разных платформ и минимальные проекты библиотек, с уже подключёнными референсами на сборки библиотек XNA. Кроме того, в зависимости от версии XNA Game Studio в типах проектов будут также доступны «starter-kits» — маленькие примеры готовых игр.
Минимальный проект
Как уже было сказано, XNA включает готовый каркас игрового приложения. Минимальный проект XNA игры в самом начале уже умеет инициализировать окно приложения и инициализировать устройства.
Основа каркаса – это класс Game, который используется как базовый в основе каждой игры. Класс Game содержит абстрактные методы типа – Draw, Update, LoadContent, UnloadContent, Initialize и так далее. То есть, каждая конкретная игра наследуется от этого класса и переопределяет важные методы (события сущности Game) своим кодом. Кроме того свойствами базового класса Game выступают такие класы как GameWindow, GraphicDevice и другие.
Минимальный проект обычно уже умеет крутить игровой цикл, производить очистку экрана заливая приятным цветом, а также закрываться при нажатии определённой кнопки. Далее вам лишь необходимо заполнить методы Update и Draw своим кодом. И осуществить загрузку контента на LoadContent.
Ближе к делу
Будем разбирать по порядку.
Загрузка контента
Одна из главных особенностей XNA — специфическая система работы с контентом.
Заключается она в наборе специальных «контент процессоров» и «контент импортеров» (кроме использования стандартных вы можете добавлять и свои).
Задача контент импортеров — превращение (на этапе компиляции) контента из внешнего поддерживаемого формата во внутреннее привычное для XNA представление.
Проще говоря, к примеру добавленные в проект текстуры в формате dds, bmp и png в момент компиляции будут все переведены в один общий для текстур внутренний формат. Такой подход позволяет не зависеть от того в каком виде изначально представлен контент, скажем если вам вдруг понадобилось использовать модели формата Quake3 (.md3), вам нужно будет только написать дополнительный контент импортер, а в конечном виде модели не будут иметь ничего общего с изначальным форматом.
Задача контент процессоров — преобразование контента из внутреннего представления (файлов), в объекты управляемого (managed) кода. То есть, по сути сама загрузка контента в память на этапе исполнения.
Если вам это кажется излишни сложным для начала — не стоит беспокоится, XNA уже содержит готовые импортеры и процессоры для основных типов контента.
Обычно контент добавляется в проект через Solution Explorer студии, в специальную папку “Content”. Там же для каждого файла назначается (панель Properties при выборе конкретного файла) тот или иной процессор и импортер. Таки образом студия берёт на себя автоматизацию процесса компиляции контента.
Со стороны управляемого кода контент уже представлен классами Texture, Texture2D, Model, ModelMesh, Effect и другими.
Саму загрузку в коде следует осуществлять при помощи класса ContentManager (уже представленый полем Content класса Game), и советуют её осуществлять в методе LoadContent класса Game (точнее вашего класса — предка Game).
Особняком стоит также система аудио контента на базе Microsoft XACT, но начиная с версии XNA 3.0 кроме этого подхода также обеспечивается параллельно стандартный (такой же как для текстур и моделей) способ работы со звуками.
Вывод графики
Помимо того, что вам доступен GraphicsDevice — по сути то же Direct3D устройство, доступное «любителям попрограммировать на DirectX под с++», у нас также есть несколько готовых инструментов от XNA.
Для 3D — это группа состоящая из классов: ModelMesh, Model и Effect. А для 2D это специальный класс SpriteBatch.
Далее коротко обо всём.
Вывод 2D графики и текста при помощи SpriteBatch
Делается очень просто по средствам класса SpriteBatch. Всё что вам нужно сделать, это создать экземпляр SpriteBatch (в минимальном проекте обычно уже есть один такой).
Метод SpriteBatch.Draw() — по сути, рисует всю текстуру или её фрагмент на экране.
В качестве параметров SpriteBatch.Draw() может принимать позицию на экране, где будет выведена текстура, поворот, наклон, масштаб. Также класс SpriteBatch поддерживает автоматическую сортировку по Z координате. Сама текстура передаётся в метод SpriteBatch.Draw() в виде референса на класс Texture2D которые вы предварительно должны были получить, в результате загрузки контента.
SpriteBatch также содержит метод DrawString(), который аналогичен методу Draw(), за исключением того, что вместо текстуры он принимает как параметр растровый шрифт (объект класса SpriteFont), а также строчку текста, которую необходимо вывести.
Вывод 3D графики
Разработчики XNA решили избавиться от фиксированного графического конвейера, который широко использовался в MDX и MDX2. В XNA используется программируемый графический конвейер, то есть в основе процесса рендеринга — шейдер (по правде говоря, и в середине SpriteBatch лежит надстройка над конвейером и свой специальный шейдер). Как результат, если вы знакомы с данным подходом, работа с 3Д в XNA для вас не будет сложна.
Итак, за рендеринг у нас должен отвечать шейдер. К счастью в XNA уже реализован простой шейдер BasicEffect (практически обеспечивает тот минимум, что был доступен с фиксированным конвейером).
Предварительно добавив модель в контент, и загрузив её, вы уже должны иметь объект класса Model. Такая модель в свою очередь содержит набор мешей (класс ModelMesh).
Всё, что нам нужно сделать, это перебрать все объекты класса ModelMesh в нашей модели, назначить (обычно он уже назначен) в качестве шейдера — BasicEffect. Далее, передать в шейдер необходимые параметры (в обязательном порядке — матрицы View, Projection и World). И в конце вызвать у каждого ModelMesh’а метод Draw.
Управление
Тут всё предельно просто. Набор классов со статическими методами, и несколько перечислений. А именно — классы Keyboard, Mouse, GamePad, каждый их них отвечает за своё устройство. У каждого из них есть метод GetState(), который возвращает соответственно KeyboardState, MouseState, GamePadState, содержащие информацию о состоянии устройств ( к примеру позиция Х, Y курсора мыши, или состояние кнопки клавиатуры в текущий момент).
Всё, что вам нужно — в Update проверять состояние устройства, и соотвественно работать с игровой моделью.
Аудио
Тут у нас хитрая история. Изначально звук в XNA (1.0-2.0) был возможен только при помощи XACT проектов.
Они создавались в отдельном редакторе, идущем вместе с XNA Game Studio. Такой проект содержал набор аудио файлов(точнее относительных ссылок на них, на диске), набор поименованных сущностей – звуков, каждый соответствовал тому или иному аудио файлу, а то и нескольким (случайный выбор конечного звука по таблице с вероятностями). Привязка звуков к группам (например, «Музыка» и «Эффекты», с отдельной регулировкой громкости на каждую). Ну, и так далее.
После чего XACT проект добавлялся в игру через специальный процессор и импортер, и работа дальше шла через специальный класс XNA – AudioEngine.
В версии XNA 3.0 появились новые классы: Song, SoundEffect. Новый контент процессор и импортер к ним (за одно и поддержка mp3 как внешнего формата). Появился класс MediaPlayer для воспроизведения музыки (с поддержкой очереди песен).
Работа со звуком упростилась, и в принципе стала на уровень с текстурами и моделями. Всё, что нужно – добавить звук в контент, установить нужный контент процессор/импортер, установить нужное имя (asset name), в коде загрузить в объект нужного типа, когда нужно – воспроизвести.
На этом с основными частями всё, конечно, каждый пункт можно раскрыть подробней, что возможно и будет сделано в будущем.
Напоследок ещё пару важных пунктов.
Запуск игры на машине пользователя
Кроме того, пользователь должен обладать видео-картой с поддержкой шейдеров 1.1 минимум.
Ccылки
Последняя версия XNA Game Studio на данный момент, а именно 3.1, доступна тут.
XNA 3.1 Redistrubutable — необходимый конечному пользователю, тут.
Microsoft xna Framework redistributable
Microsoft XNA framework — набор инструментов, с простой и управляемой средой непосредственно времени исполнения, который создан компанией Microsoft. Именно данная программа позволит не только упрощать разработку, но и управлять компьютерными играми.
Важно. Именно это программное обеспечение позволит освободить разработчика игр от повторений шаблонного в игре кода, объединив в себе самые разные аспекты, игровые наработки в единой системе.
Где можно скачать?
На данный момент microsoft xna framework redistributable представлена в таких версиях — 2.0, 3.0, 3.1, 4.0, 4.5. И все они доступны для бесплатного скачивания непосредственно на нашем сайте – заходите и выбираете та, которая нужна пользователю. И если не запускается на персональном компьютере та или иная игра либо приложение, но при условии, что скачены, установлены все драйвера и компоненты – данная программа позволит решить саму проблему.
Обновление microsoft xna framework redistributable
Для скачивания и установки обновлений – необходимо посетить наш сайт и выбрав последнюю версию программы кликнуть на ней. После этого следовать такому поэтапному алгоритму в последовательности действий:
Если не намерены сохранять ранее скаченную программу – просто кликнуть на кнопке Cancel (Отмена). Далее система сама запустит все необходимые процессы сохранения либо отмены в инстанции скаченной программы. От пользователя важно изначально прописать путь, куда система будет направлять и где сохранять его.
Распространенные ошибки при работе с программой
Так основные ошибки и сбои в работе выбранной программы могут проявляться в виде невозможности открыть или запустить выбранную игру или приложение. И причин на это может быть несколько – сами данные файлы повреждены или удалены, либо удалены с персонального компьютера.
Но к самым распространенным ошибкам в данной программе разработчики и пользователи относят следующие:
Если стоит задача исправить ошибку – в самом начале стоит отключить антивирусник и перезапустить систему. Когда проблема кроется в dll-файлах – стоит загрузить на ПК DllKit, далее запустить сканирование системы. И уже по завершению – программное обеспечение поможет устранить ошибки.
Xna framework как установить
Что же всё-таки представляет собой XNA framework (далее просто XNA)?
XNA это надстройка над неуправляемым (классическим) DirectX. Во всяком случае такую картину можно наблюдать для операционной системы Windows. Дело в том, что XNA является кроссплатформенной библиотекой.
Библиотека разрабатывалась корпорацией Microsoft с целью создания единого инструмента для разработки игр на двух не совместимых платформах, принадлежащих той же компании. А именно: Microsoft Windows и Microsoft XBOX360.
В связи с этим XNA framework не является банальным враппером.
Во-первых, XNA предоставляет такие возможности, которые в DirectX в принципе не нужны. Например, работа с файловой системой в DirectX-приложениях происходит с помощью использования стандартных библиотек ОС Windows. В XNA же для этих целей предусмотрены специальные классы, которые так же легко работают на XBOX360, как и на Windows.
Во-вторых, математические классы XNA не являются обвёртками над неуправляемым DirectX, а полностью реализованы с нуля. Что, в большинстве случаев, позволяет добиться производительности на уровне классического DirctX.
В-третьих, используя специализированные классы библиотеки программист может лишить себя «удовольствия» писать обработчики на такие задачи, как обработка потери устройства, загрузка/выгрузка контента (модели, текстуры и др.), организация игрового цикла и многие другие «прелести», которые очень сильно омрачали жизнь каждому начинающему игроделу (профи от них, наверное, тоже не в восторге).
В-четвёртых, для этой библиотеки имеется среда разработки XNA Game Studio. При этом Express Edition (бесплатная версия) содержит, кроме основного функционала, так называемые Starter Kit’ы заготовки в виде простых игр, которые можно использовать, как для обучения, так и для принятия их за основу своих игр.
Подробнее о возможностях XNA Game Studio я расскажу в следующих статьях. А сейчас только скажу, что для написания статей я использую XNA Game Studio Express Edition v2.0 Так же необходимо указать, что XNA Game Studio требует для своей работы установленный Visual C# 2005 Express Edition с обновлениями до SP1
На что способен XNA framework?
На многое. Что бы не разводить болтологию и дать читателю первое представление о возможностях библиотеки, я решил в эту статью включить таблицу с описанием основных пространств имён XNA framework
Но не думайте, что я описал хоть десятую часть всех пространств имён библиотеки или всех её возможностей. В дальнейшем мы будем подробней рассматривать те или иные возможности XNA.
И на последок я хотел бы ответить на такой вопрос.
Какие технические характеристики и требования XNA framework?
Ну, во-первых, XNA построена полностью на принципе программированного конвеера. То есть разработчики полностью отказались от фиксированного конвеера и тем самым ужесточили требования к аппаратному обеспечению компьютера. А именно, библиотека может функционировать только если видеокарта поддерживает, как минимум, Pixel Shader v1.1. Но это не сильно должно нас волновать, так как поддержка этой технологии есть у видеокарт начиная с Geforce 2 (кроме серий MX)
Во-вторых, XNA поддерживает фрагментные (пиксельные) шейдеры от версий 1.1 до 3.0 Это объясняется тем, что основа XNA DirectX 9.0c, а так же тем фактом, что XBOX360 поддерживает шейдеры только до версии 3.0 В связи с этим, в ближайшее время, не предполагается добавление поддержки шейдеров 4-ой версии (DirectX 10)
Что же относительно остального, то возможности XNA практически такие же, как и у DirectX 9.0c
Так же следует указать, что официально XNA Game Studio поддерживает только такие операционные системы: Windows XP SP2 и Windows Vista
Ну и на последок, я думаю, тут не помешает несколько ссылок на тематические сайты.
Создание кроссплатформенной игры на ПК, Xbox и WP7 с XNA Framework Game Studio
Что вам нужно
Прежде всего, если вы еще этого не сделали, посетите сайт http://create.msdn.com/ и найдите бесплатную загрузку Visual Studio 2010 и XNA Game Studio 4.0. Следуйте инструкциям по установке.
Что мы будем строить
Мы собираемся создать очень простую игру на основе XNA Framework, основной целью которой является демонстрация развертывания на нескольких платформах. По сути, игра будет перемещать мяч для гольфа в цель. На Windows Phone 7 мяч будет управляться с помощью акселерометра, на Xbox он будет перемещаться с помощью джойстика на контроллере, а на компьютере — с помощью клавиш со стрелками на клавиатуре. Когда пользователь перемещает мяч для гольфа в цель, игра сбрасывается. Просто!
Шаг 1: Сборка Windows Phone 7 XNA Framework Игра
Давайте начнем с небольшой теории …
Далее нам нужно начать кодирование нашего проекта. Позвольте мне начать с краткого описания работы XNA Framework на более высоком уровне. На приведенной ниже диаграмме показан ход работы приложения XNA Game Studio на высоком уровне.
Код начинается с ввода конструктора, инициализации переменных, загрузки любого содержимого в ContentManager и, наконец, входа в игровой цикл. Игровой цикл — это то, где будет существовать большая часть кода. Игровой цикл запускается так часто, как хотелось бы. По умолчанию приложение Windows Phone 7 XNA Framework работает со скоростью 30 кадров в секунду. Это означает, что игровой цикл вызывается 30 раз в секунду. Игровой цикл на самом деле состоит из двух функций, названных Update () и Draw ().
Давайте импортируем некоторые текстуры в наш проект …
Поэтому, прежде чем мы начнем кодировать, давайте импортируем некоторые текстуры, которые мы можем использовать для нашей игры. Я создал текстуры для мяча для гольфа и текстур Target, которые вы можете использовать в своем проекте. Есть два разрешения для каждой текстуры. Причина этого в том, что в зависимости от платформы, на которой вы запускаете игру, разрешение может отличаться. Таким образом, я предоставил два изображения; одна предназначена для разрешения высокого разрешения на Xbox, а другая — версия с более низким разрешением для Windows Phone и ПК.
Приступая к коду …
Итак, теперь мы на очень высоком уровне понимаем, как работает приложение XNA Framework, и у нас фактически есть некоторые текстуры, которые мы можем использовать для создания нашего приложения, мы можем начать кодировать.
1. Начните с переименования Game1.cs внутри проекта CrossPlatformXNA FrameworkGame в «GolfGameMain.cs»
2. Откройте GolfGameMain.cs и определите следующие переменные, которые будут использоваться для наших двух текстур, а также информацию о местоположении и скорости.
3. Внутри метода Initialize () добавьте следующую строку кода, чтобы установить скорость нашего мяча для гольфа
4. Напишите функцию с именем ResetGame (), которая инициализирует переменные скорости и положения. Метод должен выглядеть следующим образом. Мы разместим мяч вначале немного правее верхнего левого угла, а цель — чуть левее правого нижнего угла. Скорость мяча начнется с нуля.
5. Загрузите текстуры, которые мы импортировали, в ContentManager, добавив следующие строки кода в метод LoadContent (). После того, как мы загрузили наш контент, мы можем вызвать ResetGame () для позиционирования объектов.