#include #include #include using namespace std; class Event_Listener { public: Event_Listener(ostream & os) : os {os} {} virtual ~Event_Listener() = default; virtual void update(int coordinate) = 0; protected: ostream & os; }; class Collision_Listener : public Event_Listener { public: Collision_Listener(ostream & os, string const& name, int point) : Event_Listener{os}, point {point}, name {name}, total_collisions {} {} virtual void update(int coordinate) override { if (point == coordinate) { ++total_collisions; os << "Collision at " << coordinate << endl; os << " - Total collisions with '" << name << "' is now " << total_collisions << endl; } } private: int point; string name; unsigned total_collisions; }; class Bounds_Listener : public Event_Listener { public: Bounds_Listener(ostream & os, int min_coord, int max_coord) : Event_Listener{os}, min_coord {min_coord}, max_coord{max_coord} {} virtual void update(int coordinate) override { if (coordinate > max_coord or coordinate < min_coord) { os << "Player out of bounds at " << coordinate << endl; } } private: int min_coord; int max_coord; }; class Event_Manager { public: Event_Manager() : listeners {} {} void notify(int coordinate) { for (Event_Listener* elp : listeners) { elp->update(coordinate); } } void subscribe(Event_Listener* event_listener) { listeners.push_back(event_listener); } private: vector listeners; }; int main() { Event_Manager event_manager{}; Bounds_Listener bounds_listener {cout, -5, 5}; event_manager.subscribe(&bounds_listener); Collision_Listener collision1 {cout, "rock", 3}; event_manager.subscribe(&collision1); Collision_Listener collision2 {cout, "tree", -1}; event_manager.subscribe(&collision2); event_manager.notify(5); event_manager.notify(3); event_manager.notify(8); event_manager.notify(-1); event_manager.notify(3); event_manager.notify(2); event_manager.notify(-7); event_manager.notify(3); }