From fde9c91c9dfb1c50d9435312e595616fe6a4a820 Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 18 Aug 2021 17:55:54 +0100 Subject: [PATCH] mvp events --- Aeon/Core/Events.cpp | 35 ++++++++++++++++++++++++++--------- Aeon/Core/Events.hpp | 8 ++++---- Game/ExampleGame.cpp | 29 +++++++++++++++++++++++++++-- 3 files changed, 57 insertions(+), 15 deletions(-) diff --git a/Aeon/Core/Events.cpp b/Aeon/Core/Events.cpp index 67e8284..0e24664 100644 --- a/Aeon/Core/Events.cpp +++ b/Aeon/Core/Events.cpp @@ -19,7 +19,8 @@ EventListener::~EventListener() void EventListener::RegisterAsSink( std::string system, int layer ) { - + mListenerID = EventManager::GetInstance().RegisterSink( this, system ); + AEON_ASSERT( mListenerID != -1, "Cannot register event sink" ); } void EventListener::DeRegisterAsSink( std::string system ) @@ -50,7 +51,7 @@ EventDispatcher::~EventDispatcher() void EventDispatcher::RegisterAsSource( std::string system ) { - mDispatcherID = EventManager::GetInstance().RegisterSource(*this, system); + mDispatcherID = EventManager::GetInstance().RegisterSource( this, system ); AEON_ASSERT( mDispatcherID != -1, "Cannot register event source" ); } @@ -61,12 +62,14 @@ void EventDispatcher::DeRegisterAsSource( std::string system ) void EventDispatcher::Dispatch( GenericEvent e ) { - + EventManager::GetInstance().Dispatch( mDispatcherID, e ); } void EventDispatcher::Dispatch( std::string data ) { - + GenericEvent e; + e.Data = data; + EventManager::GetInstance().Dispatch( mDispatcherID, e ); } @@ -80,18 +83,31 @@ EventManager::~EventManager() } -int EventManager::RegisterSource( EventDispatcher& source, std::string system ) +int EventManager::RegisterSource( EventDispatcher* source, std::string system ) { int id = mNextHeighest; mSources[id] = system; - mNextHeighest++; return id; } -int EventManager::RegisterSink( EventListener& source, std::string system ) +int EventManager::RegisterSink( EventListener* sink, std::string system ) { - return -1; + int id = mNextHeighest; + mListeners[id] = sink; + + // if there is no sinks for the system, make sure there is one + if ( !mSinks.count( system ) ) + { + std::vector> v; + mSinks.insert( { system, v } ); + } + + auto& sinkVector = mSinks[system]; + sinkVector.push_back( { sink, id } ); + + mNextHeighest++; + return id; } void EventManager::RemoveSource( int dispatcherID, std::string system ) @@ -111,7 +127,8 @@ void EventManager::Dispatch( int dispatcherID, GenericEvent e ) for ( auto& listenerPair : sinks ) { - int handled = std::get<0>(listenerPair).EventRecieved(e); + EventListener* listener = std::get<0>( listenerPair ); + bool handled = listener->EventRecieved(e); if ( handled ) e.Handled = handled; if ( e.Handled ) diff --git a/Aeon/Core/Events.hpp b/Aeon/Core/Events.hpp index b6ce09e..cf2a02f 100644 --- a/Aeon/Core/Events.hpp +++ b/Aeon/Core/Events.hpp @@ -89,8 +89,8 @@ public: EventManager(); ~EventManager(); - int RegisterSource( EventDispatcher& source, std::string system ); - int RegisterSink( EventListener& sink, std::string system ); + int RegisterSource( EventDispatcher* source, std::string system ); + int RegisterSink( EventListener* sink, std::string system ); void RemoveSource( int dispatcherID, std::string system ); void RemoveSink( int listenerID, std::string system ); @@ -99,12 +99,12 @@ public: private: // indexed by listener ID - std::map mListeners; + std::map mListeners; // indexed by dispatcher ID std::map mSources; // indexed by (sink) system ID // their position in the vector is their layer - std::map>> mSinks; + std::map>> mSinks; int mNextHeighest = 0; }; diff --git a/Game/ExampleGame.cpp b/Game/ExampleGame.cpp index f752511..f117691 100644 --- a/Game/ExampleGame.cpp +++ b/Game/ExampleGame.cpp @@ -26,6 +26,7 @@ public: class SomeSystem : public Aeon::Core::EventListener { +public: SomeSystem() { RegisterAsSink( "System1", 0 ); @@ -39,7 +40,28 @@ class SomeSystem : public Aeon::Core::EventListener bool EventRecieved( Aeon::Core::GenericEvent& e ) override { std::cout << e.Source << ":" << e.Type << ":" << e.Sink << ":" << e.Data << std::endl; - return true; + return false; + } + +}; + +class SomeOtherSystem : public Aeon::Core::EventListener +{ +public: + SomeOtherSystem() + { + RegisterAsSink( "System1", 0 ); + } + + ~SomeOtherSystem() override + { + DeRegisterAsSink( "System1" ); + } + + bool EventRecieved( Aeon::Core::GenericEvent& e ) override + { + std::cout << e.Source << ":" << e.Type << ":" << e.Sink << ":" << e.Data << std::endl; + return false; } }; @@ -48,9 +70,12 @@ int main( int argc, char** argv ) { ExampleGame game; + SomeSystem system1; + SomeOtherSystem system2; + Aeon::Core::EventDispatcher eventDispatcher; eventDispatcher.RegisterAsSource( "System1" ); - eventDispatcher.Dispatch( Aeon::Core::KeyboardEvent( 12, 1 ) ); + eventDispatcher.Dispatch( "bro" ); return 0; }