在作複雜的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()方法了。獲得如下結果:
- protected override void LoadContent()
- {
- base.LoadContent();
- }
- public override void Draw(GameTime gameTime)
- {
- 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屬性而來的。
- protected override void LoadContent()
- {
-
- spriteBatch = new SpriteBatch(Game.GraphicsDevice);
- base.LoadContent();
- }
在建立了spriteBatch對象後,則能夠開始在Draw()方法中進行物件的繪製了。注意,在這裏一樣要有 spriteBatch.Begin()與spriteBatch.End()方法。
- public override void Draw(GameTime gameTime)
- {
- spriteBatch.Begin();
-
- spriteBatch.End();
- base.Draw(gameTime);
- }
5.Update()方法與Initialize()方法我在這裏就不過多說了,用法與Game1時相同。最後就剩下如何在Game1類中調用組件了,那麼如今咱們回到Game1類,在其Initialize()方法中,使用GameComponent1組件類型建立一個字段gc1,而後在初始化方法中gc1 = new GameComponent1(this)建立出gc1對象,而且在其構造方法中將當前遊戲對象作爲實參傳入。而且,須要使用Components(遊戲組件集合)屬性,將gc1對象添加進來。代碼以下:
- protected override void Initialize()
- {
-
- gc1 = new GameComponent1(this);
- Components.Add(gc1);
-
- base.Initialize();
- }
最後須要注意的是,必定要在建立好遊戲組件時,將默認繼承的GameComponent更改成DrawableGameComponent類。框架