Статьи

XNA в Windows 8 — от мечты к реальности

Просто чтобы перепостить мой собственный блог (действительно сделал это неправильно Улыбка с открытым ртом), вот мое вступление в конкурс Intel App-Up, который сейчас проводится на codeproject. Если у вас есть идея для приложения или игры для Windows 8, вам следует Напишите небольшую статью для вашей компании о вашей идее, и вы можете даже уйти с бесплатным Intel Ultrabook, чтобы создать его.

отказ

Эта статья является записью в конкурсе AppInnovation . Статьи в этом подразделе не обязательно должны быть полными, поэтому при голосовании следует соблюдать осторожность.

Вступление

С появлением задачи Intel App-Up я решил разорвать соглашение и попробовать что-то, что, казалось бы, раньше не предпринималось в Windows 8, запустить и запустить игру XNA с использованием родной XNA. Если вы просто используете текущий проект XNA в Windows 8, у вас будет доступ только к вводу с клавиатуры / мыши и геймпада (без сенсорного или акселерометра), вы также не сможете использовать любые другие устройства / функции Windows 8.

Взяв свой первоначальный проект Starter 3D XNA, я строю его с нуля с помощью Visual Studio 2012 и, выйдя за его рамки, сделаю его более полноценной игрой.

Не желая останавливаться на достигнутом, я стремлюсь выйти за рамки и использовать все возможности Windows 8, включая:

  • Поддержка NFC, позволяющая игрокам играть вместе
  • Поддержка местоположения, чтобы принести реальный мир в игры
  • Поддержка акселерометра, позволяющая игрокам размахивать планшетами / ультрабуками, чтобы управлять кораблем (особенно полезно на новых уровнях Warp)
  • Услуги определения местоположения для лидеров

В дальнейшем проект также будет включать в себя некоторые из следующих действий:

  • Поддержка PlayTo, чтобы показать ваши навыки игры
  • Сеть UDP, чтобы играть против телефонных игроков
  • Голосовая поддержка

Итак, то, что начнется с этой статьи, закончится развивающейся статьей по созданию игр для XNA Desktop в Windows 8.

* Примечание: для опыта работы в Магазине Windows (Metro) разработчикам XNA все равно нужно будет использовать MonoGame для публикации там, но это еще один набор публикаций.

Создание этого для Windows 8 сопряжено со своими собственными проблемами. Самым большим из них является конвейер контента. Старые проекты, построенные на VS2010, просто не сработают, поэтому мы должны создавать наш контент и в VS 2012, покупатель остерегается.

Фон

Я веду блог / экспериментирую с XNA с тех пор, как до бета-версии XNA сессия Starter 3D началась в первые дни «Coding 4 Fun», которые я взял и пошел дальше и дальше, перенеся его на телефон, а теперь и на Windows 8.

В его основе лежит полное руководство для начинающих по созданию игр 3D XNA, охватывающее основы:

  • Загрузка конвейера контента
  • Рисование текстур
  • Обработка и рисование 3D моделей
  • Воспроизведение аудио
  • Обработка ввода и преобразование экрана в мировое пространство
  • Основы обнаружения столкновений

Учебник транслировался в нескольких группах пользователей и даже в серии веб-трансляций разработчиков AT & T.

Его двоюродный брат серии XNA 2D также был очень популярен в моем блоге.

Теперь я мог бы просто перекомпилировать проект Visual Studio 2010 и представить его с улучшениями для конкурентов, но я не покатился, я решил взять на себя задачу получить этого зверя изначально в мире Windows 8.

Почему вы должны использовать его на Ultrabook?

Почему? Потому что взрывать камни и инопланетян на вашем ультрабуке — это весело, и просто почему бы вам не захотеть, вы также сможете присоединиться к друзьям и взорвать их!

ТЫ ЗНАЕШЬ, ЧТО ХОЧЕШЬ!

Слово к мудрым

Одна большая заметка об этой статье. Часть контента (особенно вокруг Content Builder) немного продвинута и может быть недоступна для начинающих. Не беспокойтесь, когда проект будет завершен, я поделюсь всем контентом / инструментами и всем, что я создаю здесь и в моем блоге.

Я просто такой парень! : D

Взрыв в космос?

Игра Starter 3D основана на оригинальной игре под названием «Астероиды». Вы — дерзкий космический пилот, посланный, чтобы очистить астероиды и предотвратить их падение на Землю.

Текущая версия — это просто современная версия этой классики, в которую вы вонзились в середину астероидного поля, и он выстрелит или будет раздавлен.

clip_image002 [4] clip_image004 [4]

 

В дальнейшем я собираюсь расширить это, чтобы добавить некоторых обычных подозреваемых к смеси, например:

  • Улучшения
  • Baddie Aliens (который, очевидно, начал все это безобразие)
  • Космический мусор

Но, как я всегда люблю делать, думая из коробки, я также хочу добавить:

  • Фоновая история плюс миссии
  • Отдельная динамика уровня, которая включает в себя прохождение варпа / туннеля, чтобы доставить вас из одной области миссии в другую (или просто очень быстрый полет в стиле спидвея)
  • Ресурсы и возможность питания вашего корабля
  • Мультиплеер и / или кооператив

Одна из сумасшедших идей заключается в том, что не должно быть все сразу, это должно быть эпизодическим и расширяться со временем, но нам просто нужно подождать и посмотреть на это.

Содержание Кто-нибудь?

Теперь перейдем к хорошему материалу. Первое, что нужно для начала работы над проектом, — это контент, а с VS2010 это было легко, потому что у нас есть XNA Game Studio (набор расширений для Visual Studio) для создания контента (модели). , Аудио, изображения и т. Д.).

С VS2012 у нас ничего этого нет, поэтому мы должны вернуться к чертежной доске или нет? К счастью, ответ — НЕТ.

Используя некоторые старые методы, уже существующие в XNA Game Studio, можно использовать MS Build (внутреннюю среду Visual Studio для компиляции ваших приложений), чтобы преобразовать ваш контент в файлы XNB (формат файлов, используемый Content Pipeline в XNA). даже возможно сделать это с пользовательскими импортерами контента (которые разработчики написали, чтобы улучшить или обойти некоторые ограничения импортеров и процессоров контента по умолчанию).

Поэтому, после долгих поисков и вооружения собственных примеров Microsoft, я собрал элементарный Content Builder в Visual Studio 2012, задачей которого было исключительно создание текущего контента из Starter 3D Game.

*Запись

Если вы задаетесь вопросом «почему я беспокоюсь о перестройке контента в VS2012, почему бы просто не использовать мои уже существующие файлы XNB из VS2010, ведь именно этим занимаются парни из Mono / MonoGame», ответ прост: файлы контента: Зависимость от платформы, поэтому для использования в собственных решениях VS2012 они должны быть встроены в VS2012. Это настоящая боль, и я спросил почему, но, похоже, это из-за производительности. (Я тоже не мудрый) В любом случае.

Для нормального создания контента требуются некоторые подробные знания о том, как работает процесс MS Build, но с примерами, предоставленными командой XNA, у нас есть достаточно вооружений, чтобы получить их, они оснащены классом Content Builder, который имеет все Gubbins, чтобы заставить нас работать, однако несколько изменений необходимы, а именно:

Расширение кода параметра для учета «пользовательских параметров» плюс перегрузка, чтобы не пришлось делать другие мои построения контента (важно, когда я масштабирую свои модели)

/// <summary>
/// Adds a new content file to the MSBuild project. The importer and
/// processor are optional: if you leave the importer null, it will
/// be autodetected based on the file extension, and if you leave the
/// processor null, data will be passed through without any processing.
/// </summary>
public void Add(string filename, string name, string importer, string processor)
{
        Add(filename, name, importer, processor, null);
}
 
public void Add(string filename, string name, string importer, string processor, params string[] args)
{            ProjectItem item = buildProject.AddItem("Compile", filename)[0];
 
        item.SetMetadataValue("Link", Path.GetFileName(filename));
        item.SetMetadataValue("Name", name);
 
        if (!string.IsNullOrEmpty(importer))
               item.SetMetadataValue("Importer", importer);
 
        if (!string.IsNullOrEmpty(processor))
               item.SetMetadataValue("Processor", processor);
        if (args != null)
        {
               foreach (var arg in args)
               {
                       var argitem = arg.Split('|');
                       item.SetMetadataValue(argitem[0], argitem[1]);
               }
        }
 
        projectItems.Add(item);
}

Это позволяет мне указать дополнительные параметры для каждого файла содержимого по мере их загрузки, таким образом:

//Build Fonts
contentBuilder.Add(contentPath + @"\Fonts\SpriteFont1.spritefont", "SpriteFont1", "FontDescriptionImporter", "FontDescriptionProcessor");
 
//Build Audio
contentBuilder.Add(contentPath + @"\Audio\EngineSound.wav", "EngineSound", "WavImporter", "SoundEffectProcessor");
 
//Build Textures
contentBuilder.Add(contentPath + @"\Textures\asteroid1.tga", "asteroid1", "TextureImporter", "TextureProcessor");
 
//Build Models
contentBuilder.Add(contentPath + @"\Models\Corsair.fbx", "Corsair", "FbxImporter", "ModelProcessor", "ProcessorParameters_Scale|0.09");
contentBuilder.Add(contentPath + @"\Models\asteroid1.x", "asteroid1", "XImporter", "ModelProcessor", "ProcessorParameters_Scale|0.009", "ProcessorParameters_PremultiplyTextureAlpha|False");

 

Запуск игры?

После изучения всех вариантов, которые я могу придумать, кажется, что лучший (только?) Способ — пойти по маршруту WinForms. В XNA 4.0 / VS2010 команда XNA неохотно раскрыла часть секретного соуса для запуска XNA внутри WinForms, другие взломали и ударили по нему с некоторым успехом, но теперь с примерами это было просто проще. Основной причиной этого были инструменты, поэтому не было никакого реального вызова для запуска игр из WinForm, потому что скомпилированные проекты XNA запускались прямо с рабочего стола, WinForms просто использовались разработчиками для разработки собственных редакторов / дизайнеров уровня.

Однако это открывает путь к Windows 8, поскольку у нас нет встроенной в VS2012 возможности для создания программ запуска XNA для настольных компьютеров, мы можем использовать WinForms для размещения наших игр.

Процесс не такой быстрый и простой, как обычная игра XNA, так как нам нужно обойти обычный режим работы приложений WinForms, для этого необходимо создать отдельную оболочку вокруг графического устройства, чтобы использовать все возможности XNA, но, как я уже сказал перед тем, как команда XNA написала примеры, которые показывают нам путь путем реализации:

· Абстракция класса Game, в котором используется графическое устройство

· Абстракция конвейера содержимого для загрузки содержимого

· Абстракция коллекции игровых сервисов / МОК

В реальной реализации есть еще кое-что, но это основы.

Используя их, мы можем спроектировать элемент управления, который будет действовать как наша графическая поверхность, загрузить наш контент и позволить игре разорваться таким образом:

Инициализация графического устройства:

// Initialize the graphics device.
graphicsDeviceService = GraphicsDeviceService.AddRef(Handle, ClientSize.Width,ClientSize.Height);
 
// Register the service, so components like ContentManager can find it.
services.AddService<IGraphicsDeviceService>(graphicsDeviceService);
 
Load Content:
//Load Fonts
Font = contentManager.Load<SpriteFont>(@"Fonts\SpriteFont1");
 
//Load Audio
Music = contentManager.Load<SoundEffect>(@"Audio\Music");
 
//Load Textures
BulletTexture = contentManager.Load<Texture2D>(@"Textures\pea_proj");
 
//Load Models
BulletModel = contentManager.Load<Model>(@"Models\pea_proj");

(как вы можете видеть, так как мы все еще используем конвейер содержимого, загрузка содержимого точно такая же)

Получить рисунок:

/// <summary>
/// Draws the control.
/// </summary>
protected override void Draw()
{
        if (model != null)
        {
               // Compute camera matrices.
               float rotation = (float)timer.Elapsed.TotalSeconds;
 
               Vector3 eyePosition = modelCenter;
 
               eyePosition.Z += modelRadius * 2;
               eyePosition.Y += modelRadius;
 
               float aspectRatio = GraphicsDevice.Viewport.AspectRatio;
 
               float nearClip = modelRadius / 100;
               float farClip = modelRadius * 100;
 
               Matrix world = Matrix.CreateRotationY(rotation);
               Matrix view = Matrix.CreateLookAt(eyePosition, modelCenter, Vector3.Up);
               Matrix projection = Matrix.CreatePerspectiveFieldOfView(1, aspectRatio,
                                                                                                           nearClip, farClip);
 
               // Draw the model.
               foreach (ModelMesh mesh in model.Meshes)
               {
                       foreach (BasicEffect effect in mesh.Effects)
                       {
                               effect.World = boneTransforms[mesh.ParentBone.Index] * world;
                               effect.View = view;
                               effect.Projection = projection;
 
                               effect.EnableDefaultLighting();
                              effect.PreferPerPixelLighting = true;
                               effect.SpecularPower = 16;
                       }
 
                       mesh.Draw();
               }
        }
}

Опять же, поскольку мы используем XNA, в нашем коде отрисовки мало что изменилось.

Гоча

Теперь, как и в случае с любым «новым трюком» (или старым в данном случае), всегда есть несколько предостережений, к счастью, здесь только несколько (но могут быть способы обойти их, поскольку мои исследования продолжаются).

Если вы уже отделили свою игровую логику от базовой реализации XNA (НЕ используя, где это возможно, типы XNA, реализуя свою собственную механику), тогда вы будете в основном делать XNA в Windows 8 таким образом. Если нет, то вам лучше провести рефакторинг, чтобы сохранить чистоту в мире WinForms, лучше всего управлять собственным кодом игры из отдельной библиотеки.

Кроме того, WinForms имеет свой собственный способ обновления экрана с помощью метода «Paint», который управляется базовой платформой, с абстракциями команды XNA, это было решено, так что они и XNA, и WinForms хорошо играют вместе, но это может быть не так Как бы это ни было, время покажет.

Наконец, доступен процесс Content Build, как отмечено в разделе «Содержимое» выше, полный механизм, однако, поскольку мы используем необработанные задачи MSBuild для создания содержимого, может потребоваться некоторое обнаружение, чтобы получить все необходимые параметры, но есть немало статьи, которые помогают, смотрите раздел интересов ниже.

Краткое описание того, как использовать статью или код. Имена классов, методы и свойства, любые хитрости или советы.

Будущее Перспектива / Проблемы

Выходя за рамки этой игры, я бы хотел, чтобы сборка контента стала более дружелюбной для пользователей VS2012, которые знают, что это также может помочь ребятам из Mono сломать кандалы VS 2010 (или дальше, поскольку некоторые из моих коллег продолжают подталкивать меня) Я на самом деле не парень по инструменту, но посмотрим.

Более того, я хотел бы сделать этот процесс XNA еще более легким для других, при условии, что Intel собирается разместить свой собственный магазин приложений, который больше ориентирован на настольные приложения (или мне так сказали), так что это может сделать XNA для игры более привлекательным, если производительность идет в ногу.

Открывать все новые функции Windows 8 для XNA — это почти как мечта, от которой я не хочу просыпаться, единственное ограничение — это то, что настольный компьютер только на данный момент, но давайте посмотрим, что ждет нас в будущем. Не бойтесь также попробовать MonoGame, если она находится на ранней стадии разработки с Windows 8, но это очень многообещающе, как показывают некоторые из ее демонстрационных игр.

Точки интереса

Во время моего путешествия я нашел следующие ссылки бесценными:

· Ресурсы библиотеки MSDN по стандартным импортерам и обработчикам контента

http://msdn.microsoft.com/en-us/library/bb447762.aspx

· Руководство по Content Pipeline API для MSDN (очень полезно для поиска скрытых атрибутов)

http://msdn.microsoft.com/en-us/library/bb195587.aspx

· Подробное сообщение на форуме (довольно старое, но все еще очень актуальное) по задачам / параметрам MS Build Content Pipeline

http://xboxforums.create.msdn.com/forums/p/42119/248952.aspx

· Также полезно — статья в MSDN о структуре файла XNB (спасибо @The_ZMan)

http://xbox.create.msdn.com/en-US/sample/xnb_format

· Образцы Клуба Создателей для использования WinForms

Графика — http://xbox.create.msdn.com/en-US/sample/winforms_series1

Построение контента — http://xbox.create.msdn.com/en-US/education/catalog/sample/winforms_series_2

Скоро

В качестве небольшого промежутка, но все же в соответствии с моей следующей серией статей о фьючерсах на XNA, я немного подробнее расскажу о каждом из вышеперечисленных компонентов, начиная с Content Builder, это довольно сложный вопрос сам по себе, поэтому может потребоваться немного с моей текущей рабочей нагрузкой