【发布时间】:2015-12-13 03:41:05
【问题描述】:
我正在从头开始设计一个简单的 GUI 框架作为一个项目,使用 OpenGL 而没有其他任何外部设备,并且需要一些关于如何实现用户交互的建议。
基本上,我有一个基类GUIItem,所有元素都从该基类继承。这为每个项目提供了一些基本变量,例如位置、包含子元素的向量以及一些用于鼠标移动和单击的基本函数。
所有元素都如上设置,以及它们的相关成员变量。
我正在努力解决的是如何正确实现用户交互。在我的窗口管理器中,我会创建一个项目的新实例,比如GUIButton 并将其命名为button1。窗口管理器将在单击发生时遍历其元素列表以及它们可能具有的任何子元素,根据其坐标、高度和宽度计算对象周围的矩形区域,然后运行与说项目,比如改变textlabel1的值。
首先,有没有更好的方法来做这个计算?它适用于矩形元素,但球形物体和其他物体会有更大的错误区域,可以点击。理想情况下,我会检查像素,但我不知道如何实现。我听说过但从未使用过 GLUT(我的项目只允许使用它来处理鼠标/键盘交互)。在这种情况下,GLUT 是否提供任何帮助?
我的主要问题是处理实际发生“点击”事件时会发生的情况。例如,目前GUIButton 内置了一个“点击时”功能,据我所知,我必须做一些事情,比如让它成为一个虚拟功能,这意味着我创建的每个新按钮都会有拥有自己的类只是为了覆盖“点击时”功能,并且按钮的每个实例都是一个唯一类的实例,它只是继承自GUIButton。这对我来说似乎很乱,因为我不知道将所有这些类存储在哪里,而且似乎有很多额外的代码。我会创建一个 button1.cpp 和 button1.h 文件吗?
如果我是 C++、OpenGL 的新手,我真的很欢迎任何关于这方面的建议,而且这是我第一次接触 GUI 编程,当现有的 GUI 框架是通常的选择时,没有太多可做的事情.
【问题讨论】:
-
您的
GUIItem有一些问题。并非所有 GUI 元素都应该能够有子等。 -
关于你的球形对象:在父级中,只需使用矩形检查,球形物体可以根据其形状自行检查更多。 ...不要遍历所有像素。对象中必须有一些规律性,还是没有?根据形状,它需要一些数学来检查它是否被点击,但仍然不要迭代像素。
-
关于按钮应该做什么:你知道函数指针和仿函数吗?没有理由为每个按钮创建一个新类。
-
最后,“如果”您使用 OpenGL 是因为您不知道其他内容,请立即停止。用于“无聊”普通窗口的 OpenGL 是过度杀伤和资源浪费。
-
@deviantfan 感谢您的建议。至于函数指针,不是我以前用过的东西,但我会看看。不幸的是,OpenGL 是我的项目规范的要求,但我同意。
标签: c++ user-interface opengl user-controls glut