【发布时间】:2012-03-25 15:55:34
【问题描述】:
我把之前的所有文件都留下了,与此同时,大量的事情得到了清理,EDIT2 是目前的状态:
我目前正在为我的大学课程开发一个简单的 GUI 系统,我想出了一个简单的想法和问题。我在想一种动态标签:
我认为不是每帧都将值/字符串传递给“静态”标签,而是如果“动态”标签类可以简单地绑定每种函数或指针以在每帧自动打印它们会很好。
这里有一些伪代码来演示,我想要实现的目标:
/* OLD WAY */
// called on initialization:
CView* pView = new CView();
CLabel* pLabel = new CLabel(10,20,"TEST");
pView->Attach(pLabel);
GUIManager->SetActive(pView);
// ...
// called every frame somewhere:
pLabel->SetText(AppTime->GetFPS()); //(AppTime is a singelton with time informations)
/* NEW WAY */
// called on initialization:
CView* pView = new CView();
//(the return type of GetFPS is float)
CDynamicLabel<float>* pDLabel = new DynamicLabel<float>(10,20, *AppTime->GetFPS());
// not only functions or member functions, this should also be possible
CDynamicLabel<int>* pDLabel2 = new DynamicLabel<int>(20,20, ptrToSomeInteger);
所以我认为必须有一种方法可以结合 C++ 模板系统和 boost::bind 来获得我想要的这个功能,但我不知道如何。 我希望有人能给我一些关于如何实现这一目标的提示。也许还有另一种更常见的方法来获得这个功能。
编辑: 为了澄清一些事情,与动态标签相关的 C++ 代码尚未实现。我仍在努力寻找实现它的完美方法,但要弄清楚我当前的类层次结构:
我有一个虚拟类 CElement,每个 GUIElement 都派生自它。有用于渲染、更新的虚函数(以传递的时间作为参数)和一个以事件作为参数的 OnEvent 函数。在 CElement 类中还实现了通用可见性功能。 CView 是代表 CElements 的特定设置的类。 GUIManager 是一个单例,它将所有调用转发到当前视图和相关元素。
我的基本想法是因为 GUI 系统是游戏的一部分,如果有通用的方法来实现自更新标签而不是为某个标签编写另一个派生类,那么更新函数在每一帧都会被调用只需将 fps 打印到屏幕或类似内容。
我希望能以某种方式解决问题......
编辑2: /* 删除,因为代码无论如何都不能工作... */
编辑3: 一切正常,我使用了 boost::function 和 boost::bind 并编写了一个模板,现在可以做我想做的一切......
【问题讨论】:
-
对于所有
T,CDynamicLabel<T>是从CLabel派生的吗? -
您可以这样做,但仍然存在何时调用这些函数的问题。标签如何知道框架何时发生变化?
-
如果
getFPS返回float那么*appTime->GetFPS()没有太大意义。我认为您的意思类似于bind(&Time::GetFPS, &AppTime) -
我称它为伪代码,因为它还没有实现,但我想用类似 C++ 的语法来表达我的想法,因为部分代码实际上已经实现(但 CDynamicLabel 类还不存在)。编辑原始帖子并添加一些额外信息