我這次要談的是 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 的安裝 時所建立的專案
看右邊的「方案總管」(Solution Explorer)
您可以看到 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() 所載入的資源
大致上是如此,重點就在於最前面寫的架構和最後寫的這個函式流程。
沒有留言:
張貼留言