c++ GUI Events/Messaging Design

Итак, я делаю простую игру, используя DirectX 9 и C++. Я посмотрел на графический интерфейс SDK, но думаю, что могу реализовать что-то попроще.

Все, что мне нужно, это окна, метки, кнопки, текстовые поля и флажки.

Я создал базовый класс GUIObject, от которого все наследуются. Он включает в себя такие основы, как размер и фокус и еще много чего. Затем все производные классы, например GUILabel, определяют render(), update() и еще много чего.

Мой вопрос: как обрабатывать события, такие как клики? Я работал с GUILabel::Click(), определяя каждую возможность на основе значения текстового члена текущего экземпляра. Это казалось неправильным, и я понял, что каждая отдельная метка, которую нужно щелкнуть, должна быть определена в классе GUILabel. Я хотел бы переместить это в код каждого игрового состояния.

Итак, я кратко попытался заставить GUILabel::Click() принимать указатель на функцию в качестве аргумента. Но затем я понял, что мне нужно, чтобы метод члена класса состояния был статическим (на самом деле это невозможно, если только все в нем тоже не статично, верно?) или также передать ему класс GUIObject. Это путь?

Могу ли я определить производное от GUILabel (или кнопки, или чего-то еще) в игровом состоянии и просто переопределить нужные мне действия? И затем сделать это для любых элементов управления, которые мне нужны в этом состоянии?

Каков правильный способ реализации обработки событий?


person Nick    schedule 17.06.2011    source источник
comment
Я пытаюсь понять, как я могу спроектировать это как Java Swing, где в моем случае состояние игры выводится из некоторых элементов графического интерфейса (скажем, окна), и все действия определяются там в своих собственных методах и передаются (используя boost библиотека, надеюсь) в качестве обратных вызовов. Я посмотрю, как это пойдет. Мне это не слишком нравится, и я попытался взломать его, чтобы добраться до сути игры, но, видя, что большая часть игры зависит от этого взаимодействия с графическим интерфейсом, я полагаю, что небольшое планирование имеет большое значение...   -  person Nick    schedule 21.06.2011
comment
Не изобретайте велосипед, Ник. Просто не надо.   -  person Nick    schedule 14.10.2020


Ответы (2)


Возможно, вы захотите изучить использование библиотеки сигналов, такой как boost::signals, чтобы обеспечить гибкость определения интерфейса между вашими объектами графического интерфейса и базовыми событиями, которые будет запускать каждый обратный вызов. Это также может пригодиться для обратной связи, когда вам нужны элементы графического интерфейса, такие как индикаторы состояния и т. д., для реагирования на базовые события.

person Jason    schedule 17.06.2011

Для событий обратного вызова/щелчка я бы использовал boost::function/boost::bind. В моей среде GUI у меня было два разных абстрактных класса InputHandler и Renderable для обработки касаний и рендеринга. Это приводит к дизайну, в котором компоненты, которые не должны быть кликабельными (например, UILabel), не должны реализовывать бесполезные методы.

ХТХ, Алекс

person Alex Kremer    schedule 17.06.2011