Методы / класс событий слушателя шаблона C ++ Observer или сигналы и слоты - PullRequest
3 голосов
/ 20 января 2012

Хай, я использую MVC в своей игре, и я не могу заставить эту штуку работать в моей голове.Я отделен от игровой логики и контроллер отделен от.На самом деле все работает, но я не могу решить, лучше ли для моего случая шаблон прослушивателя или сигналы и слоты.

У меня есть базовый класс Entity с несколькими чисто виртуальными методами:

onEntityCreate //Called when new entity is allocated
onEntityDelete //Called when new entity is deallocated
onEntityBuild //Called on respawn or spawn
onEntityDispose //Called before respawn or deallocation
onEntityTick //called every tick when is entity "alive"
onEntityUpdate //called when entity position/orientation updates

iхотел бы запустить просмотр и логику в двух разных потоках.Если бы я мог отправить эти события в конце логики, отметьте их, но я не знаю, как.

1 Ответ

2 голосов
/ 23 января 2012

По моему опыту, вы должны использовать гибридные сигналы / слоты внутри абстрактного класса, главным образом потому, что шаблон Listener не очень хорошо работает на C ++, поскольку внутренние классы имеют нулевую видимость по сравнению с внешним классом (как в Java, например,), что делает вставку слушателей очень сложной задачей.Таким образом, вы можете использовать великолепные Gallant Signals , ведь это очень быстрая реализация шаблона делегата / сигнала:

class EntityProvider {
public:
    Gallant::Signal0< Entity* > onEntityCreate;
};

и кода, который вы используете провайдер:

void Example::bindProvider(EntityProvider* provider) {
  provider->onEntityCreate.Connect(this, &Example::onEntityCreate);
}

Кроме того, чтобы улучшить дизайн ОО, вы должны использовать класс «gluer», который отвечает за привязку / открепление классов к своим провайдерам.Это хорошо, чтобы централизовать управление событиями и избежать трудных для отладки проблем.

...