Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include <vector>
- #include <map>
- #include <functional>
- #include <algorithm>
- #include "GameEvents.h"
- using CallBack = std::function<void(const Event&)>;
- class Broadcaster {
- using Listener = std::pair<void*, CallBack>;
- using Listeners = std::vector<Listener>;
- std::map<EventName, Listeners> _listeners;
- void removeListener(Listeners& l, const void* const object) {
- l.erase(std::remove_if(l.begin(), l.end(), [object](const Listener& t) {return t.first == object; }), l.end());
- }
- public:
- template<class T>
- void addEventListener(const EventName name, T* object, void(T::*member)(const Event&)) {
- addEventListener(name, object, std::bind(member, object, std::placeholders::_1));
- };
- void addEventListener(const EventName name, void* object, CallBack method) {
- _listeners[name].push_back(std::make_pair(object, method));
- };
- void removeEventListener(const EventName name, const void* const object) {
- removeListener(_listeners[name], object);
- };
- void removeEventListener(const void* const object) {
- for (auto& kv : _listeners) {
- removeListener(kv.second, object);
- }
- }
- ~Broadcaster() { _listeners.clear(); };
- protected:
- void broadCastEvent(const Event& e) {
- if (_listeners.find(e.type()) == _listeners.end()) return; //avoid creating an index in the map
- for (Listener& listener : _listeners[e.type()]) {
- listener.second(e);
- }
- };
- };
- //Used as such:
- InputManager _input{}; //InputManager inherits from Broadcaster
- //it can call the protected function broadCastEvent(const Event&)
- Game::Game() {
- //Register for events (these calls are practically equivalent, use whichever form you like):
- _input.addEventListener(OnKeyUp::NAME, this, &Game::onKeyEvent);
- _input.addEventListener(OnKeyDown::NAME, this, [=](const Event& e) { this->onKeyEvent(e); });
- }
- Game::~Game() {
- //Remember to de-register before your listener is destroyed!
- _input.removeEventListener(OnKeyUp::NAME, this); //remove me from this event type
- _input.removeEventListener(this); //remove me from *all* events
- }
- //listeners callback signature: void(const Event&)
- void Game::onKeyEvent(const Event& e) {
- InputManager* i = e.source(); //my Events hold a pointer to the source
- switch(e.type()){/**/}
- }
Add Comment
Please, Sign In to add comment