了解 XNA 的遊戲架構。

来源:互联网 发布:软交换网络协议 编辑:程序博客网 时间:2024/06/05 04:54

想要在 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,這和一般事件導向的桌面應用程式很不一樣,在設計的時候要將腦袋轉換一下。

原创粉丝点击