Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何实现点击式用户交互模型?_C++_User Interface_Mouseevent - Fatal编程技术网

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

C++ 如何实现点击式用户交互模型?,c++,user-interface,mouseevent,C++,User Interface,Mouseevent,背景:我正在用c++/OpenGL做一个简单的太阳系模拟 研究:我尝试过搜索,但我只找到关于widget、flash和HCI的文章 问题:我希望用户能够单击某个演员,然后取消选择,或者选择其他内容。也许可以立刻选择多个演员。如果演员被毁灭了,我希望选择权消失。我想让演员知道它被选中了 我知道如何获取鼠标坐标,以及如何查看是否在该演员、该演员或最近的演员上单击。我没有任何经验做的是建模的互动。我可以想象CSS的活动、悬停和按下模式,所以我猜是某种状态。但是接下来我会讨论所有权的问题,如果那个演员被

背景:我正在用c++/OpenGL做一个简单的太阳系模拟

研究:我尝试过搜索,但我只找到关于widget、flash和HCI的文章

问题:我希望用户能够单击某个演员,然后取消选择,或者选择其他内容。也许可以立刻选择多个演员。如果演员被毁灭了,我希望选择权消失。我想让演员知道它被选中了

我知道如何获取鼠标坐标,以及如何查看是否在该演员、该演员或最近的演员上单击。我没有任何经验做的是建模的互动。我可以想象CSS的活动、悬停和按下模式,所以我猜是某种状态。但是接下来我会讨论所有权的问题,如果那个演员被删除或者需要被删除,会发生什么呢?应该有什么观察员吗


很明显,我对这个问题还不够了解,无法为自己的目的去解决它。我没有回拨或事件或其他方面的经验。有人能给我指出一些文章、指南或类似的帮助吗?

如果您正在为参与者使用智能指针(例如,
boost::shared\u pointer
),那么您可以通过使用弱指针进行选择来轻松解决所有权问题。例如:

std::set<boost::weak_pointer<Actor> >  selected_actors;

如果您还需要演员跟踪其是否被选中,请按以下方式操作:

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() { }
};


希望有帮助

我建议快速查看一下。它会做你想做的一切,甚至更多。在大多数情况下,你可以拿走你想要的,留下你不想要的


它还提供了一种很好的方法,可以将OpenGL代码与用户界面中更友好的元素进行打包/集成。

我认为你的问题太宽泛了;常见问题解答:“你的问题应该有合理的范围。如果你能想象一整本书都能回答你的问题,那么你问得太多了。”你能把它缩小一点吗?这就是为什么我的问题不是“我如何做到这一点?”而是“我在哪里可以学会如何做到这一点?”谢谢。我已经在使用弱点,这确实解决了所有权问题。选定的演员集也是一个好主意,如果删除一个演员,可以将其从集中删除。如果我确实有一大堆被选中的演员,让一个演员问自己是否被选中会更有意义吗?这样,所选参与者的列表将成为是否选择某个对象的权威。是的,您可以采用任何一种方式,也可以同时采用两种方式。或者,如果这符合您的架构,您可以将
bool selected
传递到
Actor
上需要此信息的每个函数中(例如
draw(bool selected)
),以便Actor不需要访问某些全局选择管理器。
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() { }
};