Почему XNA, а не OpenGL или DirectX? Чтобы проникнуться, рекомендую изучить вебкаст от Microsoft: Visual C# Soup to Nuts. Part 21: Visual C# and Game Development.
Для начала нужно убедиться, что драйвер видеокарты поддерживает DX 9.0, а сама видеокарта поддерживает пиксельные шейдеры версии 1.1 или более. GeForce 4 MX не пойдет, проверено. Если не выполнить эти условия, проявляется исключение (exception): “Could not find a Direct3D device that has a Direct3D9-level driver and supports pixel shader 1.1 or greater.”
Итак, установка XNA. Затем, последний DirectX. Если не установить один из последних DX’ов, то легко «ловится» странное исключение: “Exception from HRESULT: 0×8007007E”.
Нас тройка
Пора кодить, но сначала настройка проекта. Открываю «студию» (C# Express вполне подходит) и создаю пустой проект. Называю «DummyGame».
В «Solution Explorer’е» выбираю Properties проекта.
Меняю «Output Type» на «Windows Application».
Основа проекта готова. Добавляю ссылки (references) на сборки XNA.
Всего понадобятся две сборки:
- Microsoft.Xna.Framework.dll
- Microsoft.Xna.Framework.Game.dll
На этом этапе есть большой подводный камень. Если XNA framework «встал» удачно, то ссылки спокойно добавляются с помощью вкладки «.NET», если же сборки не находятся, то придется немного сплясать с бубном. Следующее описание пропускается, если сборки благополучно найдены в GAC’е.
Для начала, создаю в проекте каталог «lib».
Теперь иду в каталог:
…\WINDOWS\assembly\GAC_32\Microsoft.Xna.Framework\1.0.0.0__xxx\
и нахожу там: Microsoft.Xna.Framework.dll. Копирую его в подготовленный каталог проекта «lib».
Иду в каталог:
…\WINDOWS\assembly\GAC_MSIL\Microsoft.Xna.Framework.Game\1.0.0.0__xxx\
и повторяю действие описанное выше, но уже с Microsoft.Xna.Framework.Game.dll.
Теперь возвращаюсь к пункту с назначением ссылок и проделываю это через вкладку «Browse».
У меня получилось нечто подобное скриншоту ниже:
Ближе к коду
Создаю класс DummyGame.cs.
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
namespace DummyGame
{
class DummyGame : Microsoft.Xna.Framework.Game
{
const int ScreenWidth = 800;
const int ScreenHeight = 600;
GraphicsDeviceManager graphics;
public DummyGame()
{
graphics = new GraphicsDeviceManager(this);
graphics.PreferredBackBufferWidth = ScreenWidth;
graphics.PreferredBackBufferHeight = ScreenHeight;
}
/// <summary>
/// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input and playing audio.
/// </summary>
/// <param name=”gameTime”>Provides a snapshot of timing values.</param>
protected override void Update(GameTime gameTime)
{
// Allows the default game to exit on Xbox 360 and Windows
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
base.Update(gameTime);
}
/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name=”gameTime”>Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
// Clear frame-buffer:
graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
base.Draw(gameTime);
}
}
}
Создаю класс Program.cs.
using System;
namespace DummyGame
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main(string[] args)
{
DummyGame theGame = new DummyGame();
theGame.Run();
}
}
}
Готово. F5!