2009-10-12 4 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

+0

Да, я не уверен в скорости отражения. Я предполагаю, что это не так быстро, как просто вызов метода (как это позволят делегаты). Вероятно, вы не захотите использовать рефлексию, если ее назовут миллион раз в секунду. Но я мог ошибаться ;-) Я не трачу кучу времени на их использование. – Smashery

1

Почему не инвертировать управления, как это:

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

interface IGraph { 
    void AddValue(double value); 
} 

это является предпочтительным вариантом в OO в любом случае, поскольку он скрывает детали реализации IGraphable. Кроме того, теперь вы можете расширить IGraph для добавления функциональности без нарушения совместимости.

+0

У меня на самом деле было это раньше. Я изменил его, потому что каждый компонент графа может иметь собственную частоту обновления (скажем, 7 раз в секунду). Если компонент графа был обновлен классом IGraphable, я бы не смог иметь независимую частоту обновления для компонента графа. (например, камера может обновляться 60 раз в секунду, но график, показывающий поле зрения (lol at graphing «поле зрения»), возможно, не нужно обновлять, что часто ...) – zfedoran

+0

Вы вызываете метод 60 раз в секунду, или попросить имущество 60 раз в секунду, нет никакой разницы. Один дает вам возможность собирать несколько данных, а другой возвращает только один. –

+0

есть разница, он расходует вычисления путем добавления или обновления значения. – zfedoran

0

То, что я хочу, это способ передать указатель туда, где находятся данные, или указатель на функцию, которая умеет возвращать данные вместо передачи объекта в компонент отображения.

Если вы не хотите, чтобы добавить свои объекты в компоненте графа ПОТОМУ

Это имеет некоторые очевидные недостатки, как не в состоянии построить график 2 различных частей данных, которые принадлежат к одному классу.

Возможно, список решит вашу проблему?

public interface IGraphable 
{ 
    List<float> GraphableValues { get; } 
} 
Смежные вопросы