如何实现点选式用户交互模型?涉及IT技术。

3

情境:我正在用C++/OpenGL制作一个简单的太阳系模拟。

调研:我已经尝试过搜索,但我只能找到有关小部件、Flash和HCI等内容的文章。

问题:我希望用户能够单击一个角色,然后可能取消选择或选择其他内容。也许同时选择多个角色。如果该角色被销毁,我希望选择会消失。我希望演员知道它已被选中。

我知道如何获取鼠标坐标,并知道如何查看是否在这个角色或那个角色上发生了单击,或者最接近的角色。我没有任何经验来建立这种交互。我可以考虑类似于CSS的活动、悬停和按下的模型,所以应该有某种状态吧。但是然后我遇到了所有权的问题,如果那个演员被删除或需要删除怎么办?应该有某种观察者吗?

显然,我不理解问题足够为了解决我的目的。我没有回调或事件的任何经验。有人能指点一些文章、指南或类似的帮助吗?


我认为你的问题太过宽泛了;根据常见问题解答中所述:“你的问题应该有合理的范围。如果你能想象一本完整回答你问题的书,那么你的要求就太高了。” 你能否将问题缩小一些? - JoeG
这就是为什么我的问题不是“我该怎么做?”而是“我在哪里可以学习如何做到这一点?” - whiterook6
2个回答

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

希望这能有所帮助!

谢谢。我已经在使用弱指针了,这解决了所有的所有权问题。选择的演员集合也是个好主意,如果其中一个被删除,它可以从集合中移除。如果我有一个大型的选择演员列表,让一个演员询问它是否被选中会更有意义吗?这样选择演员列表就成为了判断对象是否被选中的权威。 - whiterook6
是的,你可以用任何一种方式或两种方式来实现。或者,如果这符合你的架构,你可以在每个需要这些信息的Actor函数中传递一个bool selected(例如draw(bool selected)),这样演员就不需要访问某个全局选择管理器了。 - Thomas

0
我建议您快速查看Qt。它可以完成您想要的所有功能,甚至更多。大部分情况下,您可以选择自己需要的内容。
此外,它还有一种很好的方式将OpenGL代码与您所需的用户界面友好元素进行包装/集成。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接