如何实现点击式用户交互模型?

时间:2012-01-16 21:47:06

标签: c++ user-interface mouseevent

背景:我正在用c ++ / OpenGL进行简单的太阳系模拟。

研究:我尝试过搜索,但我只找到有关小部件,flash和HCI内容的文章。

问题:我希望用户能够点击演员,然后可以取消选择,或者选择其他内容。也许一次选择多个演员。如果演员被摧毁,我希望选择消失。我希望演员知道它被选中了。

我知道如何获取鼠标坐标,以及如何查看此actor或该actor或最近的actor是否发生了点击。我没有任何经验,就是对交互进行建模。我可以想到像CSS的主动,悬停和按压模型,所以某种状态,我想。但后来我陷入了所有权的问题,如果该演员被删除或需要被删除会发生什么?应该有某种观察者吗?

显然,我不明白这个问题足以尝试为我的目的解决它。我没有回调或事件或其他任何经验。有人能指点我一些文章,指南或类似的帮助吗?

2 个答案:

答案 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代码和你所追求的用户界面中更友好的元素。