题
我已经做了许多不同的单独部分的GUI系统的遊戏机,像个按钮和文本框和选择盒,但我需要的一种方式含有这些类中的一个Gui类,这样,我可以借鉴的一切到屏幕上的所有一次,检查所有的按钮在一次检查,如果任何被挤压。我的问题是什么是最好的方式组织的所有类(例如按钮和文本框)进入一个GUI类?
这里的一种方法我想的,但它似乎不正确的:
编辑: 我使用C++。
class Gui {
public:
void update_all();
void draw_all() const;
int add_button(Button *button); // Returns button id
void remove_button(int button_id);
private:
Button *buttons[10];
int num_buttons;
}
这个代码中有一些问题,但我只是想让你知道我想要什么。
解决方案
这个问题是非常相似的一个我要去后,只有我是索尼的PSP编程。
我一直在玩弄的东西的同时,我征询了一些书籍和 限流继, 和迄今为止,这是一个粗略的想法的一个简单的用户界面系统。
class uiElement()
{
...
virtual void Update() = 0;
virtual void Draw() = 0;
...
}
class uiButton() public : uiElement
{
...
virtual void Update();
virtual void Draw();
...
}
class uiTextbox() public : uiElement
{
...
virtual void Update();
virtual void Draw();
...
}
... // Other ui Elements
class uiWindow()
{
...
void Update();
void Draw();
void AddElement(uiElement *Element);
void RemoveElement(uiElement *Element);
std::list <uiElement*> Elements;
...
}
void uiWindow::Update()
{
...
for (list <uiElement*>::iterator it = Elements.begin(); it != Elements.end(); it++ )
it->Update();
...
}
void uiWindow::Draw()
{
...
for (list <uiElement*>::iterator it = Elements.begin(); it != Elements.end(); it++ )
it->Draw();
...
}
这类是创建一个窗口和发球进攻ui要素,并呼吁绘制和更新方法从各自的主要职能。
我没有什么工作呢,因为我有问题的绘画代码。与不同的Api上电脑和PSP,我看到一些包装码照片和其他区。
希望这会有所帮助。
thing2k
其他提示
任何人感兴趣,这是我的开放源,BSD许可GUI的工具包,为DS:
http://www.sourceforge.net/projects/woopsi
thing2k的答案是不错的,但我会认真推荐具有代码包含儿童UI元素的基础。级。这是我跟在Woopsi.
如果你 不不 支持这一基类中,你会碰到的主要问题,当你试图实施任何东西复杂得多,一个文本框和一个按钮。例如:
- 签吧可以仿效为多个按钮一起组合成一个单一的父UI元素,强制执行相互排斥的选择;
- 无线电按钮组(同上);
- 滚动条可表示为一个滑动/排水沟元和上/下按钮;
- 滚动的名单可以表示作为一个容器和多种选项的用户界面元素。
此外,这是值得记住的是,DS有66MHz CPU和4M RAM,这是用来储存程序和执行(DS光盘载入RAM之前,他们均运行)。你真的应该把它作为一个嵌入式系统,这意味着STL。我删除了STL从Woopsi和管理,以节约0.5兆。不是很多的桌面标准,但是这是1/8DS总可用的存储的消耗通过STL垃圾。
我已经详细的整个过程中编写的用户界面在我的博客:
http://ant.simianzombie.com/blog
它包括描述的两种算法,我想到了重新划分为的画面,这是最棘手的部分创造一个GUI(一个分裂的矩形,并记得可见的地区;其他使用BSP树,这是更加高效和更容易理解),对于优化,等等。
我想看看其他方式GUI工具包已经完成,这将是一个良好的开端。C++的例子,我听到许多好的事情 夸脱.我没有用过它的个人。当然,个函数库和二进制文尼克提及。
我已经写了一个非常简单的图形用户界面,就像你建议。我已经在运行Windows、Linux和Macintosh。它应当港口相对较容易的任何系统一样的PSP或DS。
它的开放源,LGPL而是在这里: