您的位置:首页 > 其它

了解 XNA 的遊戲架構。

2013-11-09 20:24 190 查看


想要在 window phone 7 上製作遊戲,可以使用 XNA 來開發,XNA 是一個容易使用的
framework,比起 DirectX 算是好上手許多,他可以開發 PC、XBOX 以及 window phone 7 上的遊戲,目前在 Window phone 7 上的 XNA 是 4.0 版本的。

工欲善其事必先利其器,要開發 wp7 的應用程式的第一步就是準備工具!而工具非常容易取得,官方下載點就有懶人包拉,直接下載安裝就 OK 了!

安裝好之後就來看看遊戲專案的樣子吧,首先,開啟一個 Window Phone Game 的專案,



選擇 Windows Phone Game (4.0) 專案,將專案名稱改成 Yoo,選 OK,

選擇 7.1 版本,按 OK



VS 會產生基本的檔案結構,裡面包含主要的遊戲專案 (YooGame1) 以及資源專案 (YooContent),我們會在遊戲專案寫遊戲的程式碼,而資源專案是用來放遊戲相關資源的,例如圖片、影片、音樂、3D 模型等。



主專案裡有兩張 png 圖,一個 icon,兩個 cs 檔案。

icon 是應用程式在電腦中顯示的小圖示。

Background.png 是一個 173X173 的 png 圖,用來當作 wp7 的 Tile 圖示。

GameThumbnail.png 是 64X64 的 png 圖,當作 wp7 的 Thumbnail 圖示。



這兩張圖的來源和遊戲顯示的名稱可以在專案屬性裡的 XNA Game Studio 修改



再來看看 VS 幫我們產生好的 Game1.cs 檔,裡面除了 Game1 的建構子外,還有五個函式,分別為 Initialize、LoadContent、UnloadContent、Update、Draw。而這五個函式就是 XNA 的遊戲主架構。

遊戲一開始會先執行 Initialize,這裡可以讓我們初始化遊戲,遊戲有些資料需要做初始化設定就寫在這,接著執行 LoadContent,在此步驟載入遊戲資源,然後進入遊戲迴圈 Update 和 Draw,Update 是用來處理遊戲邏輯的地方,而 Draw 就負責畫圖,遊戲中會輪流呼叫這兩個函式來達到即時回饋。最後當遊戲離開時會執行 UnloadContent,若有自己配置的資源就需要在此釋放,而整個流程如下圖



開啟專案後直接按 F5 就可以直接執行了,只不過會出現淡藍色畫面,因為我們甚麼東西都沒有加入!



接著來看看程式碼 Game1.cs 裡的詳細內容

GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;

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

// Frame rate is 30 fps by default for Windows Phone.
TargetElapsedTime = TimeSpan.FromTicks(333333);

// Extend battery life under lock.
InactiveSleepTime = TimeSpan.FromSeconds(1);
}


GraphicsDeviceManager 是控制顯示裝置的物件,SpriteBatch 是用來畫 2D 的物件,在 Game1 的建構式裡會產生 GraphicsDeviceManager 的實體,而 Content.RootDirectory = "Content" 表示資源檔的根目錄是 Content,基本上我們不必動他。再來是 TargetElapsedTime 表示畫面更新的頻率,XNA 在 PC 和 XBOX 上預設的更新頻率是 60FPS,手機上是 30FPS,所以要特別設定,最後的 InactiveSleepTime
是指遊戲失效時程式的睡眠時間,目前也用不到。

接著 Initialize 並沒有內容,這裡你可以放置自己遊戲在邏輯上需要初始化的部分。

LoadContent 裡面只有一行 spriteBatch = new SpriteBatch(GraphicsDevice),用來實體化 SpriteBatch,我們可以用它來貼圖。若是有自己的圖片、音樂、文字等資源就要在此載入。

接下來是遊戲最重要的兩個函式,Update 和 Draw

 

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);
}


Update 會傳入遊戲時間,裡面的一行程式碼表示按 back 鍵的時候結束程式,在手機中按 back 鍵的偵測方式也就是使用 GamePad 物件取得案件資訊。 之前也提到 Update 是用來處理遊戲邏輯的地方,這點很重要,很多初學者會認為反正 Update 和 Draw 會輪流呼叫,寫在哪裡又有甚麼差?其實 Update 和 Draw 的地位並不是平等的,遊戲迴圈會盡可能地呼叫 Update,盡量滿足一秒呼叫 30 次,當然,就算 Update 沒辦法一秒呼叫 30 次,Draw 還是會被呼叫的,只是呼叫次數比較少,會讓畫面產生延遲。

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

// TODO: Add your drawing code here

base.Draw(gameTime);
}


Draw 函式一樣會傳入遊戲時間,而裡面的 GraphicsDevice.Clear (Color.CornflowerBlue) 是將螢幕清成淡藍色。每一次呼叫 Draw 就會把之前的畫面清空,重新畫新的圖上去。Draw 的內容通常就比較簡單,畫出所有需要顯示的物件即可。

最後 UnloadContent,如果有非使用 Content 載入的資源,就必須自己在此釋放,對初學者來說比較不會用到。

整個遊戲就是不斷的呼叫 Update 和 Draw,這和一般事件導向的桌面應用程式很不一樣,在設計的時候要將腦袋轉換一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  XNA