diff options
Diffstat (limited to 'mwe/events/src')
-rw-r--r-- | mwe/events/src/event.cpp | 10 | ||||
-rw-r--r-- | mwe/events/src/eventManager.cpp | 98 | ||||
-rw-r--r-- | mwe/events/src/main.cpp | 64 |
3 files changed, 169 insertions, 3 deletions
diff --git a/mwe/events/src/event.cpp b/mwe/events/src/event.cpp index c0ae9ed..38ff62a 100644 --- a/mwe/events/src/event.cpp +++ b/mwe/events/src/event.cpp @@ -42,3 +42,13 @@ MousePressedEvent::MousePressedEvent(int mouseX, int mouseY) std::pair<int, int> MousePressedEvent::getMousePosition() const { return {mouseX, mouseY}; } + +//Collision event +CollisionEvent::CollisionEvent(Collision collision) : collisionData(collision), Event("CollisionEvent") { + +} + +Collision CollisionEvent::getCollisionData() const +{ + return this->collisionData; +} diff --git a/mwe/events/src/eventManager.cpp b/mwe/events/src/eventManager.cpp index 2aef89d..e022849 100644 --- a/mwe/events/src/eventManager.cpp +++ b/mwe/events/src/eventManager.cpp @@ -1,5 +1,102 @@ #include "eventManager.h" +<<<<<<< HEAD +void EventManager::shutdown() +{ + subscribers.clear(); +} + +void EventManager::subscribe(int eventType, std::unique_ptr<IEventHandlerWrapper>&& handler, int eventId) +{ + if (eventId) { + std::unordered_map<int, std::unordered_map<int, std::vector<std::unique_ptr<IEventHandlerWrapper>>>>::iterator subscribers = subscribersByEventId.find(eventType); + + if (subscribers != subscribersByEventId.end()) { + std::unordered_map<int, std::vector<std::unique_ptr<IEventHandlerWrapper>>>& handlersMap = subscribers->second; + std::unordered_map<int, std::vector<std::unique_ptr<IEventHandlerWrapper>>>::iterator handlers = handlersMap.find(eventId); + if (handlers != handlersMap.end()) { + handlers->second.emplace_back(std::move(handler)); + return; + } + } + subscribersByEventId[eventType][eventId].emplace_back(std::move(handler)); + + } else { + auto& handlers = subscribers[eventType]; + handlers.emplace_back(std::move(handler)); + } +} + +void EventManager::unsubscribe(int eventType, const std::string& handlerName, int eventId) +{ + if (eventId) { + std::unordered_map<int, std::unordered_map<int, std::vector<std::unique_ptr<IEventHandlerWrapper>>>>::iterator subscriberList = subscribersByEventId.find(eventType); + if (subscriberList != subscribersByEventId.end()) { + std::unordered_map<int, std::vector<std::unique_ptr<IEventHandlerWrapper>>>& handlersMap = subscriberList->second; + std::unordered_map<int, std::vector<std::unique_ptr<IEventHandlerWrapper>>>::iterator handlers = handlersMap.find(eventId); + if (handlers != handlersMap.end()) { + std::vector<std::unique_ptr<IEventHandlerWrapper>>& callbacks = handlers->second; + for (std::vector<std::unique_ptr<IEventHandlerWrapper>>::iterator it = callbacks.begin(); it != callbacks.end(); ++it) { + if (it->get()->getType() == handlerName) { + it = callbacks.erase(it); + return; + } + } + } + } + } else { + std::unordered_map<int, std::vector<std::unique_ptr<IEventHandlerWrapper>>>::iterator handlersIt = subscribers.find(eventType); + if (handlersIt != subscribers.end()) { + std::vector<std::unique_ptr<IEventHandlerWrapper>>& handlers = handlersIt->second; + for (std::vector<std::unique_ptr<IEventHandlerWrapper>>::iterator it = handlers.begin(); it != handlers.end(); ++it) { + if (it->get()->getType() == handlerName) { + it = handlers.erase(it); + return; + } + } + } + } +} + +void EventManager::triggerEvent(const Event& event_, int eventId) +{ + if (eventId > 0) { + auto handlersIt = subscribersByEventId[event_.getEventType()].find(eventId); + if (handlersIt != subscribersByEventId[event_.getEventType()].end()) { + std::vector<std::unique_ptr<IEventHandlerWrapper>>& callbacks = handlersIt->second; + for (auto it = callbacks.begin(); it != callbacks.end();) { + (*it)->exec(event_); + if ((*it)->isDestroyOnSuccess()) { + it = callbacks.erase(it); + } else { + ++it; + } + } + } + } else { + auto& handlers = subscribers[event_.getEventType()]; + for (std::unique_ptr<IEventHandlerWrapper>& handler : handlers) { + handler->exec(event_); + } + } +} + +void EventManager::queueEvent(std::unique_ptr<Event>&& event_, int eventId) +{ + eventsQueue.emplace_back(std::move(event_), eventId); +} + +void EventManager::dispatchEvents() +{ + for (std::vector<std::pair<std::unique_ptr<Event>, int>>::iterator eventIt = eventsQueue.begin(); eventIt != eventsQueue.end();) { + if (!eventIt->first.get()->getHandled()) { + triggerEvent(*eventIt->first.get(), eventIt->second); + eventIt = eventsQueue.erase(eventIt); + } else { + ++eventIt; + } + } +======= void EventManager::shutdown() { m_subscribers.clear(); } void EventManager::subscribe(int eventType, @@ -149,4 +246,5 @@ void EventManager::dispatchEvents() { ++eventIt; } } +>>>>>>> b3b762a34e7ccb4a0dcd041a693ac7180af16002 } diff --git a/mwe/events/src/main.cpp b/mwe/events/src/main.cpp index 55c562f..971ca35 100644 --- a/mwe/events/src/main.cpp +++ b/mwe/events/src/main.cpp @@ -3,7 +3,13 @@ #include <SDL2/SDL.h> #include <iostream> #include <memory> +<<<<<<< HEAD +#include "loopManager.h" +#include "event.h" +#include "customTypes.h" +======= +>>>>>>> b3b762a34e7ccb4a0dcd041a693ac7180af16002 class PlayerDamagedEvent : public Event { public: PlayerDamagedEvent(int damage, int playerID) @@ -11,9 +17,15 @@ public: REGISTER_EVENT_TYPE(PlayerDamagedEvent); +<<<<<<< HEAD + int getDamage() const { return damage; } + int getPlayerID() const { return playerID; } + +======= int getDamage() const { return damage; } int getPlayerID() const { return playerID; } +>>>>>>> b3b762a34e7ccb4a0dcd041a693ac7180af16002 private: int damage; int playerID; @@ -23,9 +35,30 @@ void onPlayerDamaged(const PlayerDamagedEvent & e) { << " damage." << std::endl; } +<<<<<<< HEAD +void onKeyPressed1(const KeyPressedEvent& e) +{ + int keyCode = e.getKeyCode(); + fprintf(stderr,"first function KeyCode %d\n",keyCode); +} +void onKeyPressed(const KeyPressedEvent& e) +{ + int keyCode = e.getKeyCode(); + fprintf(stderr,"second function KeyCode %d\n",keyCode); +} +void CollisionHandler(const CollisionEvent& e){ + std::cout << "collision betwee object id: "<< e.getCollisionData().objectIdA << " and id: " << e.getCollisionData().objectIdB << std::endl; +} +void testCollisionEvent() { + Collision testCollision(1, 2, {3, 4}, {5, 6}, 7.8f); + subscribe<CollisionEvent>(CollisionHandler,1); + // EventHandler<PlayerDamagedEvent> + triggerEvent(CollisionEvent(testCollision), 1); +======= void onKeyPressed(const KeyPressedEvent & e) { const int keyCode = e.getKeyCode(); fprintf(stderr, "KeyCode %d\n", keyCode); +>>>>>>> b3b762a34e7ccb4a0dcd041a693ac7180af16002 } int main(int argc, char * args[]) { LoopManager gameLoop; @@ -34,18 +67,43 @@ int main(int argc, char * args[]) { // onKeyPressed(e); // }; // custom event class poc - EventHandler<PlayerDamagedEvent> playerDamagedHandler = onPlayerDamaged; - subscribe<PlayerDamagedEvent>(playerDamagedHandler); - + subscribe<PlayerDamagedEvent>(onPlayerDamaged); triggerEvent(PlayerDamagedEvent(50, 1)); +<<<<<<< HEAD + subscribe<KeyPressedEvent>(onKeyPressed,1,false); + subscribe<KeyPressedEvent>(onKeyPressed1,false); + // queueEvent(std::move(anotherKeyPressEvent)); + triggerEvent(KeyPressedEvent(42), 1); + +======= //EventHandler<KeyPressedEvent> callback = onKeyPressed; //subscribe<KeyPressedEvent>(callback,false); std::unique_ptr<Event> anotherKeyPressEvent = std::make_unique<KeyPressedEvent>(65); queueEvent(std::move(anotherKeyPressEvent)); triggerEvent(KeyPressedEvent(42)); +>>>>>>> b3b762a34e7ccb4a0dcd041a693ac7180af16002 EventManager::getInstance().dispatchEvents(); + //collision event call + testCollisionEvent(); + gameLoop.setup(); gameLoop.loop(); return 0; } +// void collisionUpdate(){ +// int count; +// //iedere collision +// for (int i = 0; i < count; i++) +// { +// //trigger object 1 +// //triger object 2 +// triggerEvent(CollisionEvent(1,2),1); +// triggerEvent(CollisionEvent(1,2),2); +// } + +// } +// int main(){ + +// return 0; +// } |