2013年7月2日 星期二

[Note] XNA (4.0 )程式基本架構、運作流程 (C#)


一個遊戲架構,可以很清楚地去做程式部份的設計。

透過模組化設計,除錯、整合的困難度也下降了許多。

這裡我們要來討論XNA的內部架構以及開發流程。


首先,我們先開啟一個專案, 可以參考msdn教學

我們先了解到打開專案之後的Game1.cs 裡面的命名空間以及宣告。

大部分皆來自 Microsoft.Xna.Framework ; 其餘後面引用命名空間可以直接從英文名稱得知。

這裡指出特別的部分。

如 :

Microsoft.Xna.Framework.Content ; //內容輸出相關

Microsoft.Xna.Framework.GameServices ; //玩家權限相關

Microsoft.Xna.Framework.Graphics ; // 繪圖相關


接下來我們來了解Game1.cs 裡面包含的六個函數。

這裡是 微軟MSDN的定義 :

  • The Initialize method is where you can initialize any assets that do not require a GraphicsDevice to be initialized.
  • The LoadContent method is where you load any necessary game assets such as models and textures.
  • The UnloadContent method is where any game assets can be released. Generally, no extra code is required here, as assets will be released automatically when they are no longer needed.
  • The Update loop is the best place to update your game logic: move objects around, take player input, decide the outcome of collisions between objects, and so on.
  • The Draw loop is the best place to render all of your objects and backgrounds on the screen.

































上圖則為六個函數的流程,也是整個XNA的遊戲架構。

接下來瞭解基本元件以及六個函數的介紹。

在Game1類別中可以看到

GraphicsDeviceManager graphics; //set video card

SpriteBatch spriteBatch; //draw 2D graph


上述一個是設定顯示卡 ,一個是畫2D圖。

GraphicsDeviceManager( 類別請點我)

然而在Gam1類別裡面有提供Content屬性,至於Content內容可以從以下去做資源管理,

以及取得應用。

ContentManager 屬性(請點我)


在這裡可以看到Content可以取得資源。

AudioImporters 音效檔案

EffectImporter 讀入著色器相關

FBXImporter 如入3D模型相關

TextureImporter 讀入2D圖形檔案

VideoImporter 讀入video檔案

XImporter 讀入.x 3D模型檔案








接下來介紹Game1.cs 裡面很重要的執行流程

1. Initialize() 遊戲初始化 

所有的初始化、建構者皆在此部分完成,並且遊戲初始化指令也可放置此。

2. LoadContent() 上傳資源檔案

此部分皆用於載入程式之中所需要的2D、3D模型,音效等。在程式執行時,預先載入資源,即可用於LoadContent();之中。

spriteBatch = new SpriteBatch(GraphicsDevice); //載入顯示卡、繪圖卡

以下介紹載入方法

(e.g)

Texture2D obj2d ; //宣告2D物件

obj2d = Content.Load<Texture2D> ("jpg-sample"); // 上傳2D圖

Model obj3d ; //宣告3D物件

obj3d = this.Content.Load<Model>("model-sample"); //上傳3D模型



3. UnloadContent() 資源釋放

在程式結束前,當離開遊戲迴圈,即會呼叫此函數,釋放記憶體空間。在一般程式語言裡面,即為 Garbage Collector。

4. Update() 輸入、邏輯更新

此函數,在遊戲執行流程之中,是在Loop裡一直被執行的。與Draw一樣,不斷地被呼叫,直到跳出遊戲執行迴圈。

通常基本預設為每秒更新60次,在手機上則為每秒更新30次。當然,程式可以去更改次數。

我們可以在建構者的時候就更換更新時間。如以下

this.TargetElapsedTime = new TimeSpan(0,0,0,0,33); // 1/30秒

如果要更改時間為持續更新,也是在建構者裡面設定,這樣做的效果,會以最快速度執行,提高遊戲流暢度,當然耗費的效能也是最高。

加入以下程式碼

this.IsFixedTimeStep = false ;

因為硬體有可能造成遊戲執行效率畫面的不同,所以必須加入GameTime參數,來控制相關變數更新。

(e.g)使用override

protected override void Update(GameTime gameTime){

    double elapsedTime = gameTime.ElapsedGameTime.TotalMilliseconds;

    modelTotation += 0.01f * (float) elapsedTime;

    base.Update(gameTime);

}


使用鍵盤的Esc離開程式。

(e.g)

KeyboardState State_new ; //宣告keyboard結構變數

state_new = Keyboard.GetState(); // 得到鍵盤狀況

if(state_new.IsKeyDown(Key.Escape))
    this.Exit();


4. Draw() 繪圖、繪出

用來繪出2D圖形以及3D模型的部分。

GraphicsDevice.Clear(Color.CornflowerBlue); //找到繪圖卡,並且繪出顏色


參考資料來源 :

1.MSDN

2.XNA4遊戲程式設計

沒有留言:

張貼留言