2014年12月18日 星期四

XNA 2.0 遊戲架構簡解

xna-header
我這次要談的是 XNA 2.0 的基本遊戲架構
為什麼特別說是 2.0 呢?
因為我不知道 MS 在以後的版本會不會改成其他的架構
科技日新越益,日後說不定有更好的架構也說不定
(本主題使用 Visual Studio 2005 以及 XNA 2.0)
XNA 2.0 的遊戲架構:
1.初始化 圖像、輸入裝置、聲音
2.載入 資源
3.開始遊戲循環,在每個循環中做以下四件事
  -抓取使用者輸入訊號
  -處理需要的計算 (像是 AI,動作,碰撞偵測 或是其他)
  -檢查是否達成遊戲結束的條件 - 如果是的話則跳出這個循環
  -繪圖至螢幕,產生音效,遊戲控制器的回饋
4.結束 圖像、輸入裝置、聲音
5.釋放資源
(翻譯自 Beginning XNA 2.0 Game Programming)
我想這個架構應該很容易明瞭吧?我這邊就不多加解釋,除非有人提出需求。
廢話不多說,先開啟程式編輯器 VS 2005
打開我在說明 XNA 2.0 的安裝 時所建立的專案
2008-11-19_160528
看右邊的「方案總管」(Solution Explorer)
2008-11-19_160721
您可以看到 Game1.cs 和 Program.cs
這兩個程式檔包含了 XNA 2.0 的主要架構,也是這次我要談的項目
先開啟 Program.cs
您可以看到
static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main(string[] args)
    {
        using (Game1 game = new Game1())
        {
            game.Run();
        }
    }
}
這是整個程式的主要進入點,在以 Game1 建立了 game 物件之後,即呼叫其函式 game.Run();
再開啟 Game1.cs
這篇主題既設為簡解,我也不想放太多的程式碼,讓大家看了霧煞煞
因此僅就我剛寫的遊戲架構說明各個流程執行的項目
在 Program.cs 建立了 game 物件之後
程式會執行 Game1.cs 的建構式以及 Initialize() 及 LoadContent() protected override void Initialize()
{
    // TODO: Add your initialization logic here

    base.Initialize();
}

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
}
Initialize() 中是做流程 「1.初始化 圖像、輸入裝置、聲音」 的動作
LoadContent() 是做流程 「2.載入 資源」 的動作
(您可能對於 GraphicsDeviceManager 及 SpriteBatch 有疑問,請容我另開主題說明)
再來進入流程「3.開始遊戲循環」
在 Game1.cs 中會執行的函式為 Update(GameTime gameTime) 及 Draw(GameTime gameTime)
protected override void Update(GameTime gameTime)
{
    // Allows the game to exit
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
        this.Exit();

    // TODO: Add your update logic here

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

    // TODO: Add your drawing code here

    base.Draw(gameTime);
}
Update(GameTime gameTime) 是做以下的動作
  -抓取使用者輸入訊號
  -處理需要的計算 (像是 AI,動作,碰撞偵測 或是其他)
  -檢查是否達成遊戲結束的條件 - 如果是的話則跳出這個循環
  -產生音效,遊戲控制器的回饋
Draw(GameTime gameTime) 是做以下的動作
  -繪圖至螢幕
我們在 Update() 裡面看到if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
    this.Exit();
如果達成設定的條件,則會離開遊戲
在執行了 this.Exit() 動作之後,會跑到流程「5.釋放資源」 protected override void UnloadContent()
{
    // TODO: Unload any non ContentManager content here
}
UnloadContent() 中您需要寫入之前在 LoadContent() 中所載入的資源
您可能會覺得奇怪,怎麼流程「4.結束 圖像、輸入裝置、聲音」不見了
因為 XNA 的內部關閉例行工作及 XNA 的垃圾回收機制會幫您執行這些工具
當程式結束之後,也會將這些東西關掉
最後做一個總結,您可以發現到按照我開頭所寫的架構,程式是這樣跑的
Game1() 遊戲物件初始化
Initialize() 初始化圖像之外的物件
LoadContent() 初始圖像物件
Run() 進入遊戲循環,每個循環執行 Update() 及 Draw()
    Update() 處理玩家輸入訊息、邏輯演算、畫面中的圖像動作、碰撞…等等
    Draw() 繪圖至螢幕
UnloadContent() 釋放在 LoadContent() 所載入的資源
大致上是如此,重點就在於最前面寫的架構和最後寫的這個函式流程。

沒有留言:

張貼留言