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類。框架

相關文章
相關標籤/搜索