2012-07-07 118 views
1

我對如何將變量的值從1個遊戲組件傳遞給另一個感到困惑。 我使用的是xna 4.0。XNA遊戲組件

我創建了兩個gamecomponents,drawstring和inputmanager。 我想讀取用戶的鍵盤輸入,並將其傳遞到將更新位置的抽繩上。我不能在drawstring(drawablegamecomponent)上添加組件。 我可以在課上做,但不能在遊戲組件上做。 你們可以在這裏發佈一些例子。對於初學者。

+1

我認爲這個問題的正確答案是「不要使用'GameComponent'」。你可以編寫你自己的類。你可以編寫你自己的接口。爲此,你可以使用一種方法。那麼你可以,你知道,*只是傳遞你的變量*(例如,參數的方法)。無論如何,'GameComponent' [有點糟糕](http://gamedev.stackexchange.com/a/9209/288)。 – 2012-07-07 13:57:45

回答

2

使用GameComponent的東西,你會希望有Update稱爲每一幀,並使用DrawableGameComponent的東西,你會希望有Draw稱爲每幀LoadContent呼籲在適當的時候(在程序的開始,作爲以及無論什麼時候設備丟失,就像用戶在Windows上按下Ctrl-Alt-Del)。

對於InputManager你可能要一個Update方法,這樣就可以保持用戶輸入的更新,所以InputManager可能是一個GameComponentDrawString聽起來不像它需要的那樣。這兩個級別聽起來像是可以成爲服務。在構造函數或你的遊戲類的Initialize方法,像做了以下內容:(DrawString和你想獲得遊戲服務的需要將Game對象的引用任何其他類)

Components.Add(mInputManager = new InputManager(this)); 
Services.AddService(typeof(InputManager), mInputManager); 
Services.AddService(typeof(DrawString), mDrawString = new DrawString(this)) 

(注意,GameComponent不一定需要是服務,服務不一定需要是GameComponent s。要獲得Update和/或Draw被調用,您必須分別調用Components.Add(...);以獲得一個對象可作爲服務檢索,您必須致電Services.AddService(...))。

然後,當你想使用一些其他的遊戲組件InputManagerDrawString服務(或者你已經通過你的遊戲對象的引用任何類),你可以這樣做:

InputManager input = (InputManager)Game.Services.GetService(typeof(InputManager)); 

就個人而言,我編寫擴展方法來做出更簡潔:

using XNAGame = Microsoft.XNA.Framework.Game; 

... 

    public static T GetService<T>(this XNAGame pXNAGame) 
    { 
     return (T)pXNAGame.Services.GetService(typeof(T)); 
    } 

獲得輸入服務線然後就變成了:

InputManager input = Game.GetService<InputManager>(); 
+0

非常感謝:) 虐待現在正在研究這:) :) – kevin 2012-07-08 08:58:12

+0

感謝您的答案夥計,順便說一句.. 是LIST <>一個數組? – kevin 2012-07-08 09:05:27