背景:我正在用c ++ / OpenGL进行简单的太阳系模拟。
研究:我尝试过搜索,但我只找到有关小部件,flash和HCI内容的文章。
问题:我希望用户能够点击演员,然后可以取消选择,或者选择其他内容。也许一次选择多个演员。如果演员被摧毁,我希望选择消失。我希望演员知道它被选中了。
我知道如何获取鼠标坐标,以及如何查看此actor或该actor或最近的actor是否发生了点击。我没有任何经验,就是对交互进行建模。我可以想到像CSS的主动,悬停和按压模型,所以某种状态,我想。但后来我陷入了所有权的问题,如果该演员被删除或需要被删除会发生什么?应该有某种观察者吗?
显然,我不明白这个问题足以尝试为我的目的解决它。我没有回调或事件或其他任何经验。有人能指点我一些文章,指南或类似的帮助吗?
答案 0 :(得分:1)
如果您正在为演员使用智能指针(例如boost::shared_pointer
),那么您可以使用弱指针轻松解决所有权问题。例如:
std::set<boost::weak_pointer<Actor> > selected_actors;
您只需要知道从该集合中检索的任何指针都可能无效,但Boost几乎迫使您检查它。
为了让演员知道它何时被选中,我只会制作一些由你的选择代码调用的虚拟成员函数,例如:
class Actor {
public:
...
virtual void on_selected() { }
virtual void on_deselected() { }
...
};
如果你还需要演员跟踪是否它被选中,那就这样做:
class Actor {
bool selected;
public:
Actor() : selected(false) { }
...
void selected() { selected = true; on_selected(); } // not virtual
void deselected() { selected = false; on_deselected(); } // not virtual
...
protected:
...
virtual void on_selected() { }
virtual void on_deselected() { }
};
希望有所帮助!
答案 1 :(得分:0)
我建议您快速查看Qt。它会做你想要的所有,甚至更多。在大多数情况下,你可以拿走你想要的东西,留下你不想要的东西。
它还有一个很好的方法来汇总/集成OpenGL代码和你所追求的用户界面中更友好的元素。