2009-10-12 40 views
0

我需要在屏幕上顯示一些關於各種遊戲對象的統計,數字和圖表。獲取對象數據的最佳方法?

(實例:攝像機位置,視場,每秒幀數,飽滿率,撲殺對象的數目,等等)

目前其希望被繪製或顯示的任何對象沿着這些實現一個接口行:

public interface IGraphable 
{ 
    float GraphableValue { get; set; } 
} 

然後,該對象可以發送到圖形組件顯示。這具有一些明顯的缺點,例如不能夠繪製屬於同一類的兩個不同的數據片段。

我想要的是一種將指針傳遞到數據所在的位置的方法,或者指向知道如何返回數據而不是將對象傳遞給顯示組件的函數的指針。

我相信這就是代表的用途,但我不明白如何在這種情況下使用它們(實際上我根本不理解它們)。另外,是否有另一種(更聰明/更好)的方式來做到這一點?

謝謝!

回答

0

我已經決定執行以下操作:

public class GraphComponent 
{ 
    private Func<flaot> _function; 

    public GraphComponent(Func<flaot> function, ...) 
    { ... } 
} 

這讓我指定寫這樣的事情檢索數據的方式:

FPSComponent fpsc = new FPSComponent();  
GraphComponent fpsg = new GraphComponent(delegate() { return fpsc.ApproximateFPS; }, ...); 
0

取決於你如何做事情,你可能會使用Reflection(訪問器上的屬性),儘管最初也可能相當混亂。但它是你的武器庫中非常有用的工具,因此值得花時間。下面是關於如何使用他們一個偉大的教程:

http://www.brainbell.com/tutors/C_Sharp/Attributes.htm

但隨後,與會代表學習也是非常有用的,這聽起來像是一個很好的解決方案。我還沒有深深的看了進去,但本教程在同一地點可能是有用的:

http://www.brainbell.com/tutors/C_Sharp/Delegates_and_Event_Handlers.htm

+0

感謝您的鏈接!我會仔細看看的。但是,我聽說反映很慢。這是真的? (據我所知,慢是一個相對的術語) – zfedoran 2009-10-12 00:54:15

+0

是的,我不確定反射的速度。我的猜測是,它不像調用方法那麼快(因爲代表會讓你這麼做)。如果它被稱爲每秒一百萬次,你可能不想使用反射。但我可能是錯的;-)我不花一大堆時間來使用它們。 – Smashery 2009-10-12 01:01:14

1

爲什麼不反轉這樣的控制:

public interface IGraphable 
{ 
    void BuildGraphable(IGraph g); 
} 

interface IGraph { 
    void AddValue(double value); 
} 

這是一個較好的選擇無論如何,因爲它隱藏了IGraphable實現的細節。此外,您現在可以擴展IGraph以增加功能,而不會破壞兼容性。

+0

我以前就是這樣過的。我改變了它,因爲每個圖形組件可以有自己的更新頻率(可以說每秒7次)。如果圖組件由IGraphable類更新,我將無法爲圖組件創建獨立的更新頻率。 (例如,相機可能每秒更新60次,但顯示視場的圖表(在製圖「視野」時爲lol)可能不需要經常更新......) – zfedoran 2009-10-12 01:07:18

+0

您可以每秒調用60次方法,或要求每秒60次的財產,沒有區別。一個給你可能收集幾個數據,而另一個返回一個。 – 2009-10-12 01:53:19

+0

有差別,它通過添加或更新值來浪費計算。 – zfedoran 2009-10-12 01:58:00

0

我要的是一個方法將指針傳遞到數據所在的位置,或指向知道如何返回數據而不是將對象傳遞給顯示組件的函數的指針。

如果你不希望你的對象添加到您的圖形組件,因爲

這有一些明顯的缺點如不能夠繪製2不同的數據塊屬於同一類。

也許一個列表將解決您的問題?

public interface IGraphable 
{ 
    List<float> GraphableValues { get; } 
} 
相關問題