Как реализовать модель взаимодействия с пользователем по принципу «укажи и щелкни»? - PullRequest
3 голосов
/ 17 января 2012

Контекст: я делаю простую симуляцию солнечной системы в c ++ / OpenGL.

Исследования: я пробовал искать, но я когда-либо только нахожу статьи о виджетах, флэш-памяти и HCI.

Проблема: я бы хотел, чтобы пользователь мог нажать на актера, а затем, возможно, отменить выбор или выбрать что-то еще.Может быть, выбрать несколько актеров одновременно.Если актер будет уничтожен, я бы хотел, чтобы выбор исчез.Мне бы хотелось, чтобы актер знал, что он выбран.

Я знаю, как получить координаты мыши и как узнать, произошел ли щелчок на этом актере, или на этом актере, или на ближайшем актере.У меня нет опыта в моделировании взаимодействия.Я могу думать о чем-то вроде CSS-модели active, hover и нажатия, так что я думаю, что-то вроде состояния.Но затем я сталкиваюсь с проблемой владения, и что происходит, если этот актер удален или должен быть удален?Должен ли быть какой-то наблюдатель?

Очевидно, я не понимаю проблему достаточно, чтобы попытаться решить ее для моих целей.У меня нет опыта с обратными вызовами или событиями или чем-то еще.Кто-нибудь может указать мне какие-нибудь статьи, руководства или подобную помощь?

Ответы [ 2 ]

1 голос
/ 17 января 2012

Если вы используете умные указатели для своих актеров (например, 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() { }
};

Надеюсь, это поможет!

0 голосов
/ 17 января 2012

Я бы посоветовал взглянуть на Qt . Будет делать все что захочешь и больше. По большей части вы можете взять то, что вы хотите, и оставить то, что вы не делаете.

Он также имеет хороший способ обернуть / интегрировать код OpenGL с более дружественными элементами пользовательского интерфейса, которые вам нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...