Microsoft xna как сделать игру

Добавил пользователь Дмитрий К.
Обновлено: 19.09.2024

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

Ранее, мы уже научились использовать BasicEffect для рисования графических примитивов и моделей. Теперь мы сможем перейти к использованию собственных шейдеров. На самом деле, BasicEffect предоставляет достаточно большое количество возможностей, однако проблема его использования заключается в том, что его использовать совместно с какими-либо более сложными техниками. Это утверждение относится не только к BasicEffect, но и к любому эффекту. Например, Вы подготовили шейдер для анимации и другий шейдер для освещения, оказывается, что Вы никаким образом не сможете объединить их, не изменяя исходные коды шейдеров, то есть не сможете создать эффект одновременно с анимацией и освещением из Ваших готовых шейдеров. Однако, если BasicEffect устраивает Вас, можете использовать его, например, для вывода некоторых объектов в сцене.

В данной главе мы будем сначала использовать уже известный нам BasicEffect, а затем реализовывать аналогичную функциональность в наших собственных шейдерах.

Нашей задачей будет отображение квадрата на экране монитора.

Создадим новый проект, и добавим в него переменные:

Я использую VertexPositionColor поскольку для начала я не буду использовать текстуры.

Также мне понадобится новый метод CreateGeometry, в котором я создам геометрию (то есть опишу все вершины) для квадрата:

basicEffect = new
BasicEffect (GraphicsDevice, null );

vd = new
VertexDeclaration (GraphicsDevice, VertexPositionColor .VertexElements);

verts = new
VertexPositionColor [4];

verts[0].Position = new
Vector3 (-0.5f, -0.5f, 0);

verts[0].Color = Color .Red;

verts[1].Position = new
Vector3 (-0.5f, 0.5f, 0);

verts[1].Color = Color .Green;

verts[2].Position = new
Vector3 (0.5f, 0.5f, 0);

verts[2].Color = Color .Blue;

verts[3].Position = new
Vector3 (0.5f, -0.5f, 0);

verts[3].Color = Color .White;

Этот метод я буду вызывать в Initialize класса Game1, там же я инициализирую basicEffect.


basicEffect = new
BasicEffect (GraphicsDevice, null );

Теперь в методы Draw я напишу код, который будет рисовать квадрат на экране монитора:


protected
override
void Draw( GameTime gameTime)

GraphicsDevice.Clear( Color .CornflowerBlue);


// TODO: Add your drawing code here


Matrix World = Matrix .CreateScale(0.5f) * Matrix .CreateTranslation(-0.5f, 0.5f, 0);


Matrix View = Matrix .CreateLookAt( new
Vector3 (0, 0, 2), Vector3 .Zero, Vector3 .Up);


Matrix Projection = Matrix .CreatePerspectiveFieldOfView( MathHelper .ToRadians(45), GraphicsDevice.Viewport.AspectRatio, 0.1f, 5f);

GraphicsDevice.DrawUserIndexedPrimitives VertexPositionColor >( PrimitiveType .TriangleList, verts, 0, 4, indices, 0, 2);

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

Если сейчас запустить приложение, то мы увидим следующую картину:


Теперь, при помощи BasicEffect нарисуем текстурированный квадрат, для этого нужно добавить текстуру в проект (в папку Content) и создать нужные нам переменные.


Texture2D texture;


protected
override
void LoadContent()


// Create a new SpriteBatch, which can be used to draw textures.

spriteBatch = new
SpriteBatch (GraphicsDevice);


// TODO: use this.Content to load your game content here

Также мне понадобятся новые вешины, которые будут также содержать информацию о текстурных координатах. Индескы можно оставить прежние.

vd = new
VertexDeclaration (GraphicsDevice, VertexPositionColor .VertexElements);

verts = new
VertexPositionColor [4];

verts[0].Position = new
Vector3 (-0.5f, -0.5f, 0);

verts[0].Color = Color .Red;

verts[1].Position = new
Vector3 (-0.5f, 0.5f, 0);

verts[1].Color = Color .Green;

verts[2].Position = new
Vector3 (0.5f, 0.5f, 0);

verts[2].Color = Color .Blue;

verts[3].Position = new
Vector3 (0.5f, -0.5f, 0);

verts[3].Color = Color .White;


vd2 = new
VertexDeclaration (GraphicsDevice, VertexPositionTexture .VertexElements);

verts2 = new
VertexPositionTexture [4];

verts2[0].Position = new
Vector3 (-0.5f, -0.5f, 0);

verts2[0].TextureCoordinate = new
Vector2 (0, 1);

verts2[1].Position = new
Vector3 (-0.5f, 0.5f, 0);

verts2[1].TextureCoordinate = new
Vector2 (0, 0);

verts2[2].Position = new
Vector3 (0.5f, 0.5f, 0);

verts2[2].TextureCoordinate = new
Vector2 (1, 0);

verts2[3].Position = new
Vector3 (0.5f, -0.5f, 0);

verts2[3].TextureCoordinate = new
Vector2 (1, 1);

Теперь нам осталось только изменить метод Draw следующим образом:


protected
override
void Draw( GameTime gameTime)

GraphicsDevice.Clear( Color .CornflowerBlue);


// TODO: Add your drawing code here


Matrix World = Matrix .CreateScale(0.5f) * Matrix .CreateTranslation(-0.5f, 0.5f, 0);


Matrix View = Matrix .CreateLookAt( new
Vector3 (0, 0, 2), Vector3 .Zero, Vector3 .Up);


Matrix Projection = Matrix .CreatePerspectiveFieldOfView( MathHelper .ToRadians(45), GraphicsDevice.Viewport.AspectRatio, 0.1f, 5f);

GraphicsDevice.DrawUserIndexedPrimitives VertexPositionColor >( PrimitiveType .TriangleList, verts, 0, 4, indices, 0, 2);


World = Matrix .CreateScale(0.5f) * Matrix .CreateTranslation(0.5f, 0.5f, 0);

GraphicsDevice.VertexDeclaration = vd2;

basicEffect.VertexColorEnabled = false ;

basicEffect.World = World;

basicEffect.Texture = texture;

basicEffect.TextureEnabled = true ;

basicEffect.Begin();

basicEffect.CurrentTechnique.Passes[0].Begin();

GraphicsDevice.DrawUserIndexedPrimitives VertexPositionTexture >( PrimitiveType .TriangleList, verts2, 0, 4, indices, 0, 2);

basicEffect.CurrentTechnique.Passes[0].End();

basicEffect.End();

basicEffect.TextureEnabled = false ;

Тут я пересоздал матрицу World для того, чтобы новый квадрат рисовался в правом верхнем углу, а также написал код, который рисует текстурированный квадрат. Обратите также внимание на то, что необходимо менять значение параметров TextureEnabled и VertexColorEnabled у basicEffect для корректной отрисовки примитивов.

Если сейчас запустить приложение, то мы увидим следующую картинку:


Теперь пришло время создавать свой собственный шейдер, добавим в проект (в папку Content) новый файл с эффектом и назовем его, скажем, myEffect.fx и начнем редактировать файл.

// TODO: add effect parameters here.


float4 Position : POSITION0 ;


// TODO: add input channels such as texture


// coordinates and vertex colors here.


float4 Position : POSITION0 ;


// TODO: add vertex shader outputs such as colors and texture


// coordinates here. These values will automatically be interpolated


// over the triangle, and provided as input to your pixel shader.

VertexShaderOutput VertexShaderFunction(VertexShaderInput input)


float4 worldPosition = mul (input.Position, World);


float4 viewPosition = mul (worldPosition, View);

output.Position = mul (viewPosition, Projection);


// TODO: add your vertex shader code here.

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0


// TODO: add your pixel shader code here.


// TODO: set renderstates here.


VertexShader = compile
vs_1_1 VertexShaderFunction();


PixelShader = compile
ps_1_1 PixelShaderFunction();

Сейчас вершинный шейдер не передает никакой информации о цвете пикселя, следовательно, в пиксельном шейдере невозможно определить цвет. Модифицируем код шейдера так, чтобы он передавал информацию о цвете из вершинного шейдера в пиксельный. Для этого нам понадобится изменить структуры, соответствующие входным и выходным параметрам вершинного шейдера. После этого нужно обязательно заполнить информацию о новых элементах выходной структуры в вершинном шейдере. Для того, чтобы заполнить информацию о цвете в выходной структуре вершинного шейдера я просто передам туда значение из входной структуры.


float4 Position : POSITION0 ;

float4 Color : COLOR0 ;


float4 Position : POSITION0 ;

float4 Color : COLOR0 ;

VertexShaderOutput VertexShaderFunction(VertexShaderInput input)


float4 worldPosition = mul (input.Position, World);


float4 viewPosition = mul (worldPosition, View);

output.Position = mul (viewPosition, Projection);

output.Color = input.Color;

После этих операций пиксельный шейдер обладает достаточной информацией для получения итогового цвета пикселя. Модифицируем его следующим образом:

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0


return input.Color;

Теперь осталось применить новый шейдер для рисования нашего квадрата. Вернемся к Game1 и там добавим новую переменную типа Effect (этот класс отвечает за работу с шейдерами в XNA) и инициализируем ее, как и для всех остальных видов ресурсов это делается при помощи ContentManager:


protected
override
void LoadContent()


// Create a new SpriteBatch, which can be used to draw textures.

spriteBatch = new
SpriteBatch (GraphicsDevice);


// TODO: use this.Content to load your game content here

В методе Draw напишем код, который отображает квадрат с использованием нового шейдера в нижнем левом углу.


protected
override
void Draw( GameTime gameTime)

GraphicsDevice.Clear( Color .CornflowerBlue);


// TODO: Add your drawing code here


Matrix World = Matrix .CreateScale(0.5f) * Matrix .CreateTranslation(-0.5f, 0.5f, 0);


Matrix View = Matrix .CreateLookAt( new
Vector3 (0, 0, 2), Vector3 .Zero, Vector3 .Up);


Matrix Projection = Matrix .CreatePerspectiveFieldOfView( MathHelper .ToRadians(45), GraphicsDevice.Viewport.AspectRatio, 0.1f, 5f);

GraphicsDevice.DrawUserIndexedPrimitives VertexPositionColor >( PrimitiveType .TriangleList, verts, 0, 4, indices, 0, 2);

World = Matrix .CreateScale(0.5f) * Matrix .CreateTranslation(0.5f, 0.5f, 0);

GraphicsDevice.DrawUserIndexedPrimitives VertexPositionTexture >( PrimitiveType .TriangleList, verts2, 0, 4, indices, 0, 2);


World = Matrix .CreateScale(0.5f) * Matrix .CreateTranslation(-0.5f, -0.5f, 0);

GraphicsDevice.VertexDeclaration = vd;

effect.Begin();

effect.CurrentTechnique.Passes[0].Begin();

GraphicsDevice.DrawUserIndexedPrimitives VertexPositionColor >( PrimitiveType .TriangleList, verts, 0, 4, indices, 0, 2);

effect.CurrentTechnique.Passes[0].End();

effect.End();

Обратите внимание на то, что для класса Effect не определены свойства такие как имели в BasicEffect, например World или View. Для задания параметров эффекта нужно использовать свойство Parameters, которое является коллекцией параметров эффекта. Для обращения к конкретному параметру нужно использовать строковые идентификаторы, соответствующие названию параметра. Как Вы помните, сейчас в шейдере используется три переменные – World, View, Projection. Именно их значения мы и установили в методе Draw при помощи вызова метода SetValue.

Также нужно установить технику, которую необходимо использовать

Рисование примитивов осуществляется алалогично тому, как это делалось для BasicEffect.

Запустив приложение, мы увидим новый квадрат, который нарисован уже с помощию нашего собственного шейдера!


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

Теперь создадим собственный шейдер для текстурирования объекта, для этого создадим новый файл с шейдером, загрузим его в проект и начнем изменять шейдер.

Для того чтобы определять цвет каждого пикселя нам понадобятся текстурные координаты в пиксельном шейдере. Сейчас у нас не учитываются текстурные координаты во входной и выходной структуре данных вершинного шейдера. Добавим их самостоятельно.


float4 Position : POSITION0 ;

float4 TexCoords : TEXCOORD0 ;


float4 Position : POSITION0 ;

float4 TexCoords : TEXCOORD0 ;

VertexShaderOutput VertexShaderFunction(VertexShaderInput input)


float4 worldPosition = mul (input.Position, World);


float4 viewPosition = mul (worldPosition, View);

output.Position = mul (viewPosition, Projection);

output.TexCoords = input.TexCoords;

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

sampler mySampler = sampler_state

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0


return
tex2D (mySampler, input.TexCoords);

Шейдер готов и можно приступать к его использованию в Game1, для этого добавим все необходимое.


protected
override
void LoadContent()


// Create a new SpriteBatch, which can be used to draw textures.

spriteBatch = new
SpriteBatch (GraphicsDevice);


// TODO: use this.Content to load your game content here


protected
override
void Draw( GameTime gameTime)

GraphicsDevice.Clear( Color .CornflowerBlue);


// TODO: Add your drawing code here


Matrix World = Matrix .CreateScale(0.5f) * Matrix .CreateTranslation(-0.5f, 0.5f, 0);


Matrix View = Matrix .CreateLookAt( new
Vector3 (0, 0, 2), Vector3 .Zero, Vector3 .Up);


Matrix Projection = Matrix .CreatePerspectiveFieldOfView( MathHelper .ToRadians(45), GraphicsDevice.Viewport.AspectRatio, 0.1f, 5f);

GraphicsDevice.DrawUserIndexedPrimitives VertexPositionColor >( PrimitiveType .TriangleList, verts, 0, 4, indices, 0, 2);

World = Matrix .CreateScale(0.5f) * Matrix .CreateTranslation(0.5f, 0.5f, 0);

GraphicsDevice.DrawUserIndexedPrimitives VertexPositionTexture >( PrimitiveType .TriangleList, verts2, 0, 4, indices, 0, 2);

World = Matrix .CreateScale(0.5f) * Matrix .CreateTranslation(-0.5f, -0.5f, 0);

GraphicsDevice.DrawUserIndexedPrimitives VertexPositionColor >( PrimitiveType .TriangleList, verts, 0, 4, indices, 0, 2);

World = Matrix .CreateScale(0.5f) * Matrix .CreateTranslation(0.5f, -0.5f, 0);

GraphicsDevice.VertexDeclaration = vd2;

effect2.Begin();

effect2.CurrentTechnique.Passes[0].Begin();

GraphicsDevice.DrawUserIndexedPrimitives VertexPositionTexture >( PrimitiveType .TriangleList, verts2, 0, 4, indices, 0, 2);

effect2.CurrentTechnique.Passes[0].End();

effect2.End();

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

Лабораторная работа №1: Введение в XNA Game Studio 2.0/3.0

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

  • научиться работать со стандартным игровым проектом
  • Создать стандартный игровой проект
  • Изучить его устройство
  • Изучить содержимое и особенности файла Program.cs
  • Ознакомиться с упрощенной схемой работы игры
  • Изучить назначение методов стандартного игрового проекта и особенности подключаемых к нему пространств имен (файл Game1.cs)

Перед выполнением этой лабораторной работы убедитесь, что на ПК установлена среда разработки Visual Studio и XNA 2.0.



Рис. 1.1. Выбор типа создаваемого проекта

В левой части окна выберем пункт XNA Game Studio 2.0., в правой – Windows Game (2.0.). Имя проекта, сгенерированное автоматически (поле Name) заменим на имя P1_1.
После нажатия на кнопку OK шаблонный проект будет создан. Вот как выглядит окно среды разработки после его создания (рис. 1.2.).



Рис. 1.2. Среда разработки после создания шаблонного проекта

Если вы выполняете сейчас эту лабораторную работу, то вы, скорее всего, имеете опыт работы с Visual Studio. Можно заметить, что внешний вид среды разработки выглядит вполне традиционно. Правую часть окна занимают панели Solution Explorer и Properties, в нижней части окна можно видеть окно Error List, основное пространство занято окном редактора кода.

Для тестового запуска игры служат команды Debug(Start Debugging и Debug(Start Without Debugging.
Если сейчас мы попытаемся запустить игру, мы увидим лишь пустое окно (рис. 1.3.).



Рис. 1.3. Окно шаблонного проекта

Это окно готово для ваших игровых экспериментов.
Рассмотрим важнейшие элементы содержимого панели Solution Explorer (рис. 1.4.).


Рис. 1.4. Панель Solution Explorer

Разбор кода стандартного игрового проекта

В листинге 1.1. приведено содержимое файла Program.cs.

Как видите, выглядит он вполне стандартно. В теле статического метода Main содержатся команды создания нового объекта класса Game1. Объекту присваивается имя game, после чего выполняется метод Run объекта Game, который и запускает игру.

Упрощенно структуру игрового проекта можно представить так (Табл. 1.1.).

Таблица 1.2. Методы стандартного игрового проекта

Game1() Общая инициализация. Game1() – это конструктор класса Game1, который выполняется при создании объекта Game в процедуре Main файла Program.cs
Initialize() Инициализация игры
LoadContent() Загрузка игровых ресурсов
Run() Запуск игрового цикла. Как было показано выше, метод Run() вызывается в процедуре Main файла Program.cs
Update() Игровой цикл в стандартном проекте состоит из двух методов. Первый из них – это метод Update(), в котором выполняется прием пользовательского ввода, все необходимые вычисления, проверка критериев останова игры.
Draw() Второй метод игрового цикла – это метод Draw(), который содержит код для визуализации игровой графики
UnloadContent() По окончании игрового цикла этот метод освобождает системные ресурсы.

Теперь, когда мы ознакомились с типичной структурой игры и назначением стандартных методов, рассмотрим код класса Game1 (Листинг 1.2.). В стандартном игровом проекте можно найти англоязычные комментарии. Здесь, для большей наглядности кода, они опущены. Комментарии, ключевые для понимания работы отдельных методов, приведены на русском языке.

Рассмотрим каждый из приведенных выше методов. В листинге 1.3. приведен код метода Game1().

Метод Game1() – это конструктор класса Game1.
Команда graphics = new GraphicsDeviceManager(this); создает новое игровое окно, а объект graphics используется для проведения различных графических операций. Например, с помощью этого объекта можно настраивать ширину и высоту окна, переводить игру в полноэкранный режим.

Команда Content.RootDirectory = "Content"; позволяет указать место (в нашем случае – это папка Content), где хранятся игровые ресурсы.

Помимо описанных команд, автоматически включаемых в стандартный игровой проект, конструктор может содержать и другие команды. Например, команды дополнительной настройки объекта graphics.

В листинге 1.4. приведен код метода Initialise().

Команда base.Initialize(); вызывает метод Initialise() базового класса. Сюда же добавляют команды для инициализации звуковой подсистемы игры, здесь же выполняются игровые настройки. Надо отметить, что в этом методе инициализируется все, кроме графических ресурсов игры. Для них существует метод LoadContent(), листинг 1.5.

SpriteBatch – это класс, который позвляет выводить изображения на устройство, задаваемое параметром GraphicsDevice. В этот же метод добавляют команды для загрузки графических ресурсов, шрифтов.
Метод UnloadContent() (листинг. 1.6.) предназначен для освобождения системных ресурсов.

Здесь размещают команды для выгрузки игровых ресурсов. В частности, в данном методе можно использовать команду base.UnloadContent(); - это метод базового класса, выгружающий ресурсы. Так же в этот метод добавляют команды для выгрузки шрифтов и других ресурсов.

Игровой цикл состоит из двух методов, выполняющихся циклически это методы Update() и Draw() – листинг 1.7.

Сначала выполняется метод Update(), потом – метод Draw().

Класс GameTime имеет несколько важных свойств. Свойство ElapsedGameTime позволяет узнать время, которое прошло после последнего вызова игрового цикла. TotalGameTime – игровое время, прошедшее с момента старта игры.
ElapsedRealTime – реальное время, прошедшее после последнего вызова игрового цикла. TotalRealTime – реальное время, прошедшее с момента старта игры.

Команда graphics.GraphicsDevice.Clear(Color.CornflowerBlue); метода Draw() очищает игровой экран, заливая его цветом CornflowerBlue. А команда base.Draw(gameTime); вызывает метод Draw() базового класса, который выводит на экран изображения.
Поговорим о пространствах имен (компонентах), которые подключены к стандартному проекту по умолчанию. В листинге 1.8. приведены их вызовы.

Пространство имен Audio содержит инструменты для работы со звуком. Для работы со звуком в XNA существует утилита XACT (Microsoft Cross-Platform Audio Creation Tool). Подготовка музыки и звуков осуществляется с помощью этой утилиты, создаётся специальный XACT-проект, который загружается в игру. Применение XACT позволяет использовать одно и то же звуковое оформление как в Windows-играх, так и в Xbox360-играх.

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

Пространство имен Input поддерживает работу со средствами ввода данных, в частности, это клавиатура, мышь и игровой манипулятор – джойстик. Как правило, при создании Windows-игр используют мышь и клавиатуру, при создании Xbox-игр – джойстик.

Пространство имен Storage содержит средства для работы с файловой системой. Именно инструменты из Storage позволяют, например, сохранять игровые данные в файлы, читать их и выполнять другие файловые операции.

Пространство имен Net поддерживает создание сетевых игр с помощью XNA. Реализация сетевого взаимодействия в XNA-играх осуществляется с помощью Windows LIVE.

Пространство имен Content содержит средства, обеспечивающие работу Content Pipeline. Content Pipeline – это очень важный механизм XNA Framework.

Пространство имен GamerService обеспечивает функции работы с сервисом LIVE – для игр под Xbox и Windows. Эти функции необходимы для создания сетевых игр. В частности, в GamerService находятся функции, позволяющие игроку регистрироваться для участия в игре, работать с информацией об игроке, хранить локальные пользовательские настройки для сетевых игр.

В разделе объявления свойств класса Game1 есть две переменных (листинг 1.9.).

Переменная graphics имеет тип GraphicsDeviceManager – она предназначена для управления графическим устройством, которое
используется для вывода информации.
Переменная spriteBatch имеет тип SpriteBatch – она нужна для вывода спрайтов на экран.

Что же всё-таки представляет собой XNA framework (далее просто XNA)?

На что способен 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

Ну и на последок, я думаю, тут не помешает несколько ссылок на тематические сайты.

Скачайте XNA Game Studio бесплатно и разрабатывайте собственные видеоигры. С XNA Game Studio вы сможете создавать забавные игры для Windows и даже Xbox 360

XNA Game Studio Изображение 1 Thumbnail
XNA Game Studio Изображение 2 Thumbnail
XNA Game Studio Изображение 3 Thumbnail
XNA Game Studio Изображение 4 Thumbnail
XNA Game Studio Изображение 5 Thumbnail

Microsoft предлагает пользователям Windows XNA Game Studio, набор инструментов для создания игр, совместимых с этой платформой и с Xbox 360. Эта утилита предназначена для студентов и любителей программирования, которые желают познакомиться со сложным миром разработки видеоигр, чтобы поиграть в них или поделиться своими собственными творениями.

Откройте ваш творческий потенциал и создавайте собственные видеоигры на ваш вкус благодаря XNA Game Studio.


Microsoft XNA Framework Redistributable 4.0 — компонент, необходимый для корректной работы некоторых игр (улучшает физику в некоторых игровых моментов).

Удалять компонент нежелательно.

Простыми словами: игра может создаваться, используя в том числе функции XNA. Если так — значит такая игра сможет корректно работать при наличии компонента XNA. Без него — скорее всего даже не запустится, или в лучшем случае графика будет более худшего качества.

Разбираемся

  1. Данный компонент XNA был создан компанией Майкрософт для разработчиков — облегчает процесс создания игр и качественной графикой, а также их управление. Компонент помогает избежать повторяющегося кода при написании игр.
  2. В чем фишка XNA? Как я понимаю, суть в том, что улучшается физика в игре. Майкрософт продемонстрировала возможности XNA — в ролике показала, как облако дыма подымается и меняет свою форму/направление движение из-за внешних факторов, то есть примерно так, как бы это происходило в реальной жизни. Второй пример — разрушение обьекта, части которого разлетались в разные стороны, направление и форма также зависело от типа/скорости разрушения. То есть XNA немного физику/поведение обьектов изменяет, делает более естественным.
  3. Изначально XNA был сделан чтобы облегчить создание игр для платформы Xbox и Windows.


Это окно Программы и компоненты, откуда можно удалить XNA. Если вы точно уверены что это нужно. PS: открыть данное окно можно следующим способом: зажмите клавиши Win + R > вставьте команду appwiz.cpl > нажмите ОК.


При установке игры данный компонент может поставиться автоматически. Кроме игр думаю его могут использовать и другой софт. Поэтому если он у вас присутствует — не спешите удалять, а если надумали, тогда лучше сделать заранее точку восстановления.

Надеюсь данная информация оказалась полезной. Удачи и добра, до новых встреч друзья!

Читайте также: