2012-10-21 39 views

回答

0

我剛剛發現GameTime沒有在整個主更新方法執行更改,這樣我就可以放心地使用它的一個副本在本地GameTime變量,就像這樣:

+0

這將工作,但它是一個**不好的做法** - 方法簽名應告訴你一切你需要知道的某種方法。如果你使用全局變量,那麼你的方法沒有輸入到簽名中。這使維護變得困難。 – neeKo

+0

這個項目只是我的,所以我不介意像這樣的東西沒有出現在我的方法的簽名,我會說這是更好的方式。 – user1306322

1

傳遞參數的好處是OOP的基本原理,但有一個建議是有一個基類,它是用GameTime初始化的,然後擴展它的所有類。這樣你可以作爲受保護的成員訪問它。

public class BaseClass 
{ 
    protected BaseClass(GameTime gt) 
    { 
     Time = gt; 
    } 

    protected GameTime Time {private set; protected get;} 

} 

public class SomeOtherClass : BaseClass 
{ 
    public SomeOtherClass(GameTime gt) : base(gt) 
    { 
    } 

    public void DoSomething() 
    { 
     //can access Time here 
    } 

} 
+0

我可以爲主遊戲類做到這一點,所以我可以從遊戲的任何方法訪問遊戲時間? – user1306322

1

你可以傳遞別的東西。我個人通常這樣做:

float seconds = (float)gameTime.ElapsedGameTime.TotalSeconds; 
something.Update(seconds); 
otherThing.Update(seconds); 

這將節省您不得不提取每次你想要使用它的經過時間,以秒爲單位。


如果你想自己節省一點打字,你可以這樣做:

interface IHasUpdate { void Update(float seconds); } 

然後,如果你實現你的類IHasUpdate界面,點擊兩下,或快捷鍵,可以讓Visual Studio爲Update創建所需的存根。這有一個額外的好處,你將能夠推理對象是IHasUpdate


如果你發現自己有過很多「東西」,你可以創建這樣一個結構:

struct UpdateContext { float seconds; PlayerInput input; SomethingElse blah; } 

與此有額外的好處,你可以輕鬆地添加新的東西「更新上下文」,如果你需要新的參數到你的Update方法。


,當然,你通常實際上並不需要知道繪製時的時間,所以你可以跳過它傳遞給Draw方法完全。


這真的不是一個好主意,做一些其他傳遞一個說法,概念的時候你有什麼是具體的方法調用給定的「樹」的數據。

1

公共全局靜態類靜態屬性GameTime,它將在每個Game.Update()開始時更新。所有的對象都會通過這個屬性訪問變量。但是,這被認爲是不好的做法。

相關問題