XNA

**Microsoft XNA** ("**X**NA's **N**ot **A**cronymed")，完全支援受控代碼的運行環境，由微軟提供用以幫助電腦遊戲開發、電腦軟體開發及管理的一些工具。XNA 把遊戲設計員從「反覆刻版編程」中解放出來，還把遊戲開發上的所有需要結合到一個系統之中。XNA 工具集在 2004 年 3 月 24 日在美國加州聖荷西市的遊戲開發者大會首次亮相，第一個公開技術預覽在 2006 年 3 月 14 日推出，最新版本 3.0 在 2008 年 10 月 30 日推出。

## 概觀

### XNA Framework

XNA Framework 是建置於.NET Framework 2.0 上，XNA 將 DirectX 的功能以受控代碼的方式封裝運作（因此微軟終止了 Managed DirectX 9.0 的開發，所以有人稱 XNA 為 Managed DirectX 2.0），另外還加入了一些專注於遊戲開發上類別庫，在指定的平台上使「程式碼重用」達之最大效果。XNA Framework 在一個特別為有管理式遊戲運行的通用語言運行庫（Common Language Runtime）版本上運行。這個執行層支援 Windows XP、Windows Vista、Windows 7、Windows Phone 7 和 XBox 360。由於遊戲是開發在執行層上，使得遊戲能在所有支援 XNA Framework 的平台上只要很少甚至不需要任何更改便能運行。現時所有在 XNA Framework 上的遊戲必需使用 C #和 XNA Game Studio Express IDE 開發。

XNA 的程式都是繼承自 Game class，它包含了所有重要的遊戲組件，比如圖形裝置（Graphic Device）、窗口設定以及內容管理器，你也可以添加 GameComponent class 到你的 Game class。XNA Framework 把所有用作遊戲編程的低階技術封裝起來，例如 XNA 提供了 Effect（BasicEffect）類別來處理大部分繪圖著色相關的工作，開發人員不需再理會「矩陣變數」相乘，只要指定物件的 World、View、Projection 即可，其相乘效果由 Shader 檔自動處理。Effect 本身還能用於載入和編譯 shader, Effect.CurrentTechnique 可用於指定 technique, 像是 AmbientLight; Effect.SetValue 可以用來設定 Shader 的參數。一個 effect 包含一個或多個 technique，一個 technique 包含一個以上的 pass。在 pass 裡面可能還有 VertexShader, PixelShader，這些元素構成一份 effect 檔案，這也就是極簡化後的 HLSL 程式碼。因此，遊戲開發員就可以專注於遊戲內容開發而不用關心遊戲移植至不同平台上的問題，遊戲只要開發於 XNA 的平台上，所有硬體只要支援 XNA 都能運行。XNA Framework 還內建一些工具，例如 XACT 以幫助遊戲內容開發。這些工具還能幫助開發視覺和聽覺效果和和像真度很高的模型製作。

XNA Framework 同時支援 2D 和 3D 的遊戲開發也支援 XBox 360 的控制器和震動效果。Content Pipeline 被用來匯入.fbx 格式，而且載入像紋理（Texture）、3D 模型、著色器（shader）。Shader 指令經過編譯之後，直接載入到顯示卡上的 GPU 來執行。Xbox Live 賣場可以升級開發者的 XNA Game Studio Express 以使能把他們開發的遊戲用於 Xbox 360 上。

### XNA 的流程簡介

首先，讓我們看看 Programs.cs 檔案的摘要內容:

```
   using System;
   namespace WindowsGame1
   {
   #if WINDOWS || XBOX
   static class Program
   {
      
       static void Main(string[] args)
       {
           using (Game1 game = new Game1())
           {
               game.Run();
           }
       }
   }
     #endif
   }
```

首先要使用 System 名稱空間，並且判斷執行環境是否在 Windows 或是 Xbox360 下

並寫了一個靜態類別 **Program** 裡面的 static void Main (string [] args){...}

是程式的進入點 (C# 基本常識)，然後產生一個 Game1 物件 game，最後使用 Game1 物件的 run 方法執行遊戲。

後面介紹有關 Game1 物件的類別分段程式碼

```
  using System;
  using System.Collections.Generic;
  using System.Linq;
  using Microsoft.Xna.Framework;
  using Microsoft.Xna.Framework.Audio;
  using Microsoft.Xna.Framework.Content;  
  using Microsoft.Xna.Framework.GamerServices;
  using Microsoft.Xna.Framework.Graphics;
  using Microsoft.Xna.Framework.Input;
  using Microsoft.Xna.Framework.Media;
```

這裡是很基本的命名空間使用，簡介每個名稱空間的用途。

1. System C# 最基本的名稱空間
2. System,Collections.Generic 泛型的名稱空間
3. System.Linq Ling (一種嵌入式的資料庫查詢語言) 的名稱空間
4. Microsoft.Xna.Framework XNA 基礎名稱空間
5. Microsoft.Xna.Framework.Audio XNA 音效方面名稱空間
6. Microsoft.Xna.Framework.Content XNA 內容輸出入名稱空間
7. Microsoft.Xna.Framework.GamerServices XNA 玩家權限名稱空間
8. Microsoft.Xna.Framework.Graphics XNA 繪圖名稱空間
9. Microsoft.Xna.Framework.Input XNA 輸出入 (鍵盤、滑鼠) 名稱空間
10. Microsoft.Xna.Framework.Media XNA 多媒體名稱空間

```
  namespace WindowsGame1
  {
    .....
  }
```

首先設定了一個 WindowsGame1 的名稱空間，裡面包含著一個類別:

```
   public class Game1 : Microsoft.Xna.Framework.Game
   {
     ......
   }
```

Game1 類別，繼承 Microsoft.Xna.Framework.Game 類別

其中 Game1 類別裡面又有

 

```
       GraphicsDeviceManager graphics;
       SpriteBatch spriteBatch;
```

```
       public Game1()
       {
           graphics = new GraphicsDeviceManager(this);
           Content.RootDirectory = "Content";
       }
  
```

GraphicsDeviceManager 類別是管理有關繪圖卡方面的設定

SpriteBatch 類別則是有關 2D 圖片、文字的繪畫設定。

還可以看到一個建構式 public Game1 (){...}

裡面讓 graphics 物件先產生出來

並規定 Content 的目錄在 Content 資料夾之下

接下來

```
       protected override void Initialize()
       {
           base.Initialize();
       }
```

是一個覆寫原父類別的初始方法

因為 Microsoft 已經把繁複的初始內寫在父類別當中

變得相當簡化，直接呼叫 base (基底類別) 使用即可

所以可以讓製作者專心在遊戲重點的初始化

接下來

```
        protected override void LoadContent()
       {
           spriteBatch = new SpriteBatch(GraphicsDevice);
       }
```

這是覆寫讀取材質 音效...etc 的方法，先讓 spritBatch 物件透過繪圖裝置參數，而產生

然後製作者可以上載其想要的內容，寫法如下:

```
  Content.Load<T>("AssetName");
```

**T** 可以是很多種類型，像是 Texture2D、Model... 等，而 AssetName 則是內容名稱。

這裡主要是使用到了泛型

```
       protected override void UnloadContent()
       {
          
       }
```

這個覆寫方法是用來回收內容的。接下來

```
       protected override void Update(GameTime gameTime)
       {
           if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
               this.Exit();
           base.Update(gameTime);
       }
```

這是覆寫了邏輯更新的方法，也是整個遊戲的重心所在，GameTime 物件可以取得遊戲時間。
另外透過 GamePad 物件 可以得知玩家 1 是否按下了倒退鍵而結束遊戲
如果想透過鍵盤可以這樣寫:

```
   if (Keyboard.GetState().IsKeyDown(Keys.Back)){...}
```

 
最後會呼叫父類別 base.Update (gameTime);

接下來

```
       protected override void Draw(GameTime gameTime)
       {
           GraphicsDevice.Clear(Color.CornflowerBlue);
           base.Draw(gameTime);
       }
```

這部分是繪圖的部分，也需要遊戲時間確定畫面跟邏輯更新是同步的，
首先使用 GameDevice 物件 Clear 方法，把畫面清成淡藍色，同時也呼叫父類別進行運作。
Update 跟 Draw 會連續進行每秒鐘 60HZ 的更新速度來跑動遊戲，直到出現離開程式指令。

### XNA 中實現 Shader

BasicEffect 是 XNA 內建的 Shader, 支援 12 種彩現模型，ContentPipeline 根據 xnb 模型檔案說明，設定模型的 MeshPart 的 BasicEffect 參數。

XNA 中實現 Shader 很簡單。對 XNA 程式來說，Shader 是一個小程式，只要把 shader 檔案（.fx）匯入到 Contents 即可，會自動生成素材（material）。

```
 **technique** Technique1
 {
     **pass** Pass1
     {
        VertexShader = **compile** _vs\_2\_0_ VertexShaderFunction();
        PixelShader = **compile** _ps\_2\_0_ PixelShaderFunction();
     }
 }
```

再透過 XNA Effect class 來載入和編譯 shader。HLSL 可以在 XNA 或是 DirectX 使用。

```
 effect = Content.Load<Effect>("MyShader"); 
 effect.CurrentTechnique = effect.Techniques ["AmbientLight" ]; 
 effect.Begin(); 
 foreach (EffectPass pass in effect.CurrentTechnique.Passes) 
 {
    pass.Begin(); 
 ... 
    pass.End();
 }
 effect.End(); // 終止使用 effect
```

如果想要改用 BasicEffect 以外的 Shader, 你必須自己呼叫 DrawPrimitive ()。

### XNA Build

2006 年，Microsoft XNA Build March 2006 CTP 在 GDC 上被發布。XNA Build 是一工具，允許你管理複雜的編譯，類似 Msbuild 和 Ants，功能更強大。2006 年 8 月 30 日微軟宣布了 XNA Game Studio Express Beta1。2006 年 12 月微軟又發布了 XNA Game Studio Express 的正式版，該版本加入了內容管道（Content Pipeline）。

### XNA Game Studio

2010 年美國當地時間 3 月 15 日，微軟官方 XNA 發布了期待已久的 XNA 4.0 的社群預覽版和路線圖，包含在 Windows Phone Developer Tool CTP 中。目前只有英文版本，可以用於編寫 Silverlight 或 XNA for Windows Phone 遊戲，Xbox 遊戲，PC 遊戲，沒有 Zune 遊戲的開發模版。

#### XNA Game Studio Express

第一個 XNA Game Studio Express 的 beta 版本首度於 2006 年 8 月 30 日提供下載，2006 年 11 月 1 日有第二個版本推出。2006 年 12 月 11 日微軟首度提供正式版

2007 年 4 月 24 日，Microsoft 更新 **XNA Game Studio Express 1.0 Refresh**.

#### XNA Game Studio 2.0

**XNA Game Studio 2.0** 於 2007 年 12 月 13 日推出. **XNA Game Studio 2.0**Visual Studio 2005 亦實作有相同的特色與功能 (包括免費的 Visual C# 2005 Express Edition)。

#### XNA Game Studio 3.0

XNA Game Studio 3.0 (基於 Visual Studio 2008) 支援 Zune 的遊戲開發。beta 版在 2008 年 9 月推出.2008 年 10 月 30 日推出正式版. XNA Game Studio 3.0 目前可支援 C# 3.0, Visual Studio 2008 之上還支援 LINQ. 在 XNA3.0 中，SoundEffect 可以不透過 XACT 也可以做到特效的處理。

#### XNA Game Studio 3.1

XNA Game Studio 3.1 於 2009 年 6 月 11 日推出。可支援 video playback, 並修正了 Audio API, 還支援 Xbox LIVE Party system 並且可以使用 Xbox 360 Avatars。

#### XNA Game Studio 4

XNA Game Studio 4 最早 2010 年 3 月 9 日由 "Community Technical Preview" 在 GDC 上發布，並於 2010 年 9 月 16 日完整推出。XNA 4 整合了 Visual Studio 2010, 可支援 Windows Phone 7 平台 (包括：3D API 的硬體加速)。VertexDeclaration 在 XNA Game Studio 4.0 中略有改變，另外 SpriteBatch.Begin 也可以配合 pixel shader。

### XNA Framework Content Pipeline

XNA 架構素材管道（XNA Framework Content Pipeline）是一種可延伸的素材處理框架，素材（Content）是在 Visual C# Express 內進行管理。在添加素材時，需要選擇工具（importer），例如: **Autodesk FBX**，**.FX**, **.XAP**，這些工具用於接收資料，FBX 是一種轉移 3D（3D transport）檔案格式，將其標準化（normalize）。

### XDK Extensions

正式名稱是 XNA Game Studio Professional, XDK Extensions 是 XNA Game Studio 附加，可用於發展 Microsoft Xbox 360.

### XNA 批評

雖然已被世界上很多開發員採用，但 XNA 並未能真正發揮的作用，例如使遊戲編程更容易。這是因為他沒有一些重要的功能如骨骼動畫（Skeletal animation），對初學者而言還是比較複雜的編程。另一個問題是有人認為 XNA 沒讓開發者有太多控制權，這使得大多數的大型遊戲製件過還是用 C++ 直接調用 DirectX。

在程式編輯上，XNA 確實大幅改善了繁雜的程式設計。包括：資源回收系統、簡易聲音 API, 與背景保護程式的衝突改善等。但是由於企業界已經投入大量心力在 C++ 與 DirectX 上面，目前仍然鮮見有企業願意針對新語言 C# 還有新平台 XNA 進行投資。

## 注釋

## 參考文獻

## 外部連結

* Microsoft XNA official homepage （頁面存檔備份，存於網際網路檔案館）
* "XNA Game Studio Express Beta 2 Launches" （頁面存檔備份，存於網際網路檔案館） from _IGN_
* XNA Samples, Videos, GameComponents and Articles （頁面存檔備份，存於網際網路檔案館）