Windows Phone 7 XNA開發之關於遊戲組件

 在做複雜的XNA應用時,單獨的Game1類是無法滿足衆多物件擺放在一起同時進行處理的,就象面向過程到面向對象的進步一樣,也就是我們不能把每個物件的創建與處理都在Game1中進行,那樣的話Game1類將的重構和複用將無法進行,因爲太亂了。

 
在早期的XNA中,我們需要使用一些設計模式來解決物件對象化的問題,但是在目前的版本中,微軟提供給我們一個“遊戲組件”的項可選擇添加到遊戲項目中,從而解決了複雜的物件問題。具體步驟如下:
 
1.在解決方案資源管理器的項目中點右建->添加新建項->選擇添加“遊戲組件”,並對其進行命名。添加完成後,可以看到資源管理器中會多出一個類(.cs)文件,該文件就是你所添加的組件了。類文件中可以看到如下代碼:
public class GameComponent1 : Microsoft.Xna.Framework.GameComponent
根據代碼我們可以瞭解到,組件類與Game1類一樣,都需要繼承自系統框架中的一個類型,從而對父類中的方法進行重寫,在遊戲執行的過程中調用指定的方法。
 
2.需要注意的是,在添加組件後,組件類默認繼承自Microsoft.Xna.Framework.GameComponent這個類型,該類型是所有組件的基類型,其中包括Initialize(),Update()方法,但是不包括遊戲所需資源的加載方法LoadContent()和Draw()繪製方法。這樣的話,我們想要將物件獨立應用的想法基本上不可能實現了,好在微軟除了這個GameComponent基類外,還爲我們提供了一個Microsoft.Xna.Framework.DrawableGameComponent(自行繪製的遊戲組件)類型,當我們將繼承的類型修改爲:
        public class GameComponent1 : Microsoft.Xna.Framework.DrawableGameComponent
之後,則可以在類中用override去重寫LoadContent()和Draw()方法了。得到以下結果:
  1. protected override void LoadContent() 
  2.       base.LoadContent(); 
  3. public override void Draw(GameTime gameTime) 
  4.       base.Draw(gameTime); 
3.有了重寫後的方法之後,就可以進行加載資源了,那這個時候我們需要用到兩個東西,一個是Content屬性,原來在Game1類中,可以直接調用Content.Load()進行指定類型的資源加載,但是在這裏,不能直接調用Content屬性,需要用Game.Content.Load()讀取資源。
 
4.關於繪製,在Game1類中有SpriteBatch spriteBatch;的定義,同樣在組件類中也需要有SpriteBatch spriteBatch;的定義,在LoadContent()方法中,也需要增加spriteBatch = new SpriteBatch(Game.GraphicsDevice);但是需要注意的是,GraphicsDevice是通過Game屬性而來的。
 
  1. protected override void LoadContent() 
  2.     // 創建新的 SpriteBatch,可將其用於繪製紋理。 
  3.     spriteBatch = new SpriteBatch(Game.GraphicsDevice); 
  4.     base.LoadContent(); 
在創建了spriteBatch對象後,則可以開始在Draw()方法中進行物件的繪製了。注意,在這裏同樣要有 spriteBatch.Begin()與spriteBatch.End()方法。
 
  1. public override void Draw(GameTime gameTime) 
  2.     spriteBatch.Begin(); 
  3.     // 要繪製的內容 
  4.     spriteBatch.End(); 
  5.     base.Draw(gameTime); 
5.Update()方法與Initialize()方法我在這裏就不過多說了,用法與Game1時相同。最後就剩下如何在Game1類中調用組件了,那麼現在我們回到Game1類,在其Initialize()方法中,使用GameComponent1組件類型創建一個字段gc1,然後在初始化方法中gc1 = new GameComponent1(this)創建出gc1對象,並且在其構造方法中將當前遊戲對象做爲實參傳入。並且,需要使用Components(遊戲組件集合)屬性,將gc1對象添加進來。代碼如下:
 
  1. protected override void Initialize() 
  2.     // TODO: 在此處添加初始化邏輯 
  3.     gc1 = new GameComponent1(this); 
  4.     Components.Add(gc1); 
  5.      
  6.     base.Initialize(); 

最後需要注意的是,一定要在創建好遊戲組件時,將默認繼承的GameComponent更改爲DrawableGameComponent類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章