8

我已经为 Nintendo DS 制作了 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;
}

这段代码有一些问题,但我只是想让你知道我想要什么。

4

5 回答 5

3

这个问题与我要发布的问题非常相似,只有我的问题是针对索尼 PSP 编程的。

我一直在玩弄一些东西,我已经查阅了一些书籍和VTM,到目前为止,这是一个简单的 ui 系统的粗略想法。

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 元素,并从各自的 main 函数中调用 draw 和 update 方法。

我还没有任何工作,因为我在绘制代码方面有问题。在 PC 和 PSP 上使用不同的 API,我正在查看 OpenGL 和 psp gu 的一些包装器代码。

希望这可以帮助。

东西2k

于 2008-08-16T22:05:03.323 回答
3

对于任何感兴趣的人,这是我的开源、BSD 许可的 DS GUI 工具包:

http://www.sourceforge.net/projects/woopsi

thing2k 的答案非常好,但我强烈建议在基 uiElement 类中包含包含子 UI 元素的代码。这是我在 Woopsi 中遵循的模式。

如果您在基类中支持这一点,那么当您尝试实现比文本框和按钮更复杂的任何东西时,您将遇到重大问题。例如:

  • 选项卡栏可以建模为多个按钮,它们组合在一起形成一个父 UI 元素,强制选择互斥;
  • 单选按钮组(同上);
  • 滚动条可以表示为滑块/装订线元素和向上/向下按钮;
  • 滚动列表可以表示为一个容器和多个选项 UI 元素。

此外,值得记住的是 DS 有一个 66MHz CPU 和 4MB RAM,用于存储和执行程序(DS ROM 在运行之前被加载到 RAM 中)。你真的应该把它当作一个嵌入式系统,这意味着 STL 已经过时了。我从 Woopsi 中删除了 STL,并设法节省了 0.5MB。以台式机标准衡量并不多,但这是 STL 垃圾消耗的 DS 总可用内存的 1/8。

我已经在我的博客上详细介绍了编写 UI 的整个过程:

http://ant.simianzombie.com/blog

它包括对我提出的用于重绘屏幕的两种算法的描述,这是创建 GUI 中最棘手的部分(一个只是将矩形拆分并记住可见区域;另一个使用 BSP 树,它更有效且更容易了解),优化技巧等。

于 2008-10-10T17:39:53.867 回答
0

要记住的一种有用策略可能是复合模式。在较低级别上,它可能允许您在构建后更轻松地处理所有 GUI 对象(和对象集合)。但我不知道 GUI 框架设计涉及什么,因此可以在现有项目的源代码中找到一般灵感。WxWidgets是一个提供源代码的跨平台 GUI 框架。祝你的项目好运!

于 2008-08-11T04:11:02.087 回答
0

我认为看看其他 GUI 工具包的做法将是一个很好的起点。对于 C++ 示例,我听到了很多关于Qt的好消息。不过我个人没有用过。当然还有尼克提到的 WxWidgets。

于 2008-08-11T04:21:49.663 回答
0

就像您建议的那样,我编写了一个非常简单的 GUI。我让它在 Windows、Linux 和 Macintosh 上运行。它也应该相对容易地移植到任何系统,如 PSP 或 DS。

它是开源的,LGPL,在这里:

http://code.google.com/p/kgui/

于 2008-09-16T23:35:57.870 回答