Working event system!
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
#include "PrecompiledHeader.h"
|
||||
#include "EventBroker.h"
|
||||
|
||||
BaseEventRelay::~BaseEventRelay()
|
||||
{
|
||||
m_Broker->Unsubscribe(*this);
|
||||
}
|
||||
|
||||
void EventBroker::Unsubscribe(BaseEventRelay &relay) // ?
|
||||
{
|
||||
auto itpair = m_Subscribers.equal_range(relay.m_TypeName);
|
||||
for (auto it = itpair.first; it != itpair.second; ++it)
|
||||
{
|
||||
if (it->second == &relay)
|
||||
{
|
||||
m_Subscribers.erase(it);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void EventBroker::Subscribe(BaseEventRelay &relay)
|
||||
{
|
||||
relay.m_Broker = this;
|
||||
m_Subscribers.insert(std::make_pair(relay.m_TypeName, &relay));
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
#ifndef MessageRelay_h__
|
||||
#define MessageRelay_h__
|
||||
|
||||
#include <typeinfo>
|
||||
#include <functional>
|
||||
#include <unordered_map>
|
||||
#include <list>
|
||||
|
||||
struct Event
|
||||
{
|
||||
protected:
|
||||
Event() { }
|
||||
};
|
||||
|
||||
class EventBroker;
|
||||
|
||||
class BaseEventRelay
|
||||
{
|
||||
friend class EventBroker;
|
||||
|
||||
protected:
|
||||
BaseEventRelay(std::string typeName)
|
||||
: m_TypeName(typeName) { }
|
||||
~BaseEventRelay();
|
||||
|
||||
public:
|
||||
virtual bool Receive(const Event &event) = 0;
|
||||
|
||||
protected:
|
||||
std::string m_TypeName;
|
||||
EventBroker* m_Broker;
|
||||
};
|
||||
|
||||
template <typename EventType>
|
||||
class EventRelay : public BaseEventRelay
|
||||
{
|
||||
public:
|
||||
typedef std::function<bool(const EventType&)> CallbackType;
|
||||
|
||||
EventRelay()
|
||||
: m_Callback(nullptr)
|
||||
, BaseEventRelay(typeid(EventType).name()) { }
|
||||
EventRelay(CallbackType callback)
|
||||
: m_Callback(callback)
|
||||
, BaseEventRelay(typeid(EventType).name()) { }
|
||||
|
||||
protected:
|
||||
bool Receive(const Event &event) override;
|
||||
|
||||
private:
|
||||
CallbackType m_Callback;
|
||||
};
|
||||
|
||||
template <typename EventType>
|
||||
bool EventRelay<EventType>::Receive(const Event &event)
|
||||
{
|
||||
if (m_Callback != nullptr)
|
||||
{
|
||||
return m_Callback(static_cast<const EventType&>(event));
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
class EventBroker
|
||||
{
|
||||
template <typename EventType> friend class EventRelay;
|
||||
|
||||
public:
|
||||
template <typename EventType>
|
||||
void Publish(const EventType &event);
|
||||
void Subscribe(BaseEventRelay &relay);
|
||||
void Unsubscribe(BaseEventRelay &relay);
|
||||
|
||||
private:
|
||||
std::unordered_multimap<std::string, BaseEventRelay*> m_Subscribers;
|
||||
};
|
||||
|
||||
|
||||
template <typename EventType>
|
||||
void EventBroker::Publish(const EventType &event)
|
||||
{
|
||||
auto itpair = m_Subscribers.equal_range(typeid(EventType).name());
|
||||
for (auto it = itpair.first; it != itpair.second; ++it)
|
||||
{
|
||||
it->second->Receive(event);
|
||||
}
|
||||
}
|
||||
|
||||
#endif // MessageRelay_h__
|
||||
@@ -1,43 +0,0 @@
|
||||
#ifndef MessageRelay_h__
|
||||
#define MessageRelay_h__
|
||||
|
||||
#include <functional>
|
||||
#include <unordered_map>
|
||||
#include <list>
|
||||
|
||||
struct Event
|
||||
{
|
||||
protected:
|
||||
Event() { }
|
||||
};
|
||||
|
||||
class EventRelay
|
||||
{
|
||||
private:
|
||||
typedef std::string MessageType_t;
|
||||
typedef std::function<bool(Event)> MessageCallback_t;
|
||||
|
||||
public:
|
||||
void Subscribe(std::string messageType, MessageCallback_t callback)
|
||||
{
|
||||
m_Callbacks[messageType].push_back(callback);
|
||||
}
|
||||
|
||||
void Raise(std::string messageType, Event message)
|
||||
{
|
||||
auto callbackIt = m_Callbacks.find(messageType);
|
||||
if (callbackIt == m_Callbacks.end())
|
||||
return;
|
||||
|
||||
for (auto &callback : callbackIt->second)
|
||||
{
|
||||
callback(message);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
std::unordered_map<MessageType_t, std::list<MessageCallback_t>> m_Callbacks;
|
||||
|
||||
};
|
||||
|
||||
#endif // MessageRelay_h__
|
||||
@@ -1,8 +1,36 @@
|
||||
#include "PrecompiledHeader.h"
|
||||
#include "Engine.h"
|
||||
#include "EventBroker.h"
|
||||
|
||||
struct TestEvent : Event
|
||||
{
|
||||
std::string Hello;
|
||||
};
|
||||
|
||||
bool OnTestEvent(const TestEvent &event)
|
||||
{
|
||||
std::cout << "TestEvent.Hello = " << event.Hello << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
EventBroker broker;
|
||||
|
||||
TestEvent e;
|
||||
e.Hello = "Hello world";
|
||||
|
||||
{
|
||||
EventRelay<TestEvent> testRelay = &OnTestEvent;
|
||||
broker.Subscribe(testRelay);
|
||||
|
||||
broker.Publish<TestEvent>(e);
|
||||
}
|
||||
|
||||
broker.Publish<TestEvent>(e);
|
||||
|
||||
return 0;
|
||||
|
||||
Engine engine(argc, argv);
|
||||
while (engine.Running())
|
||||
engine.Tick();
|
||||
|
||||
@@ -96,6 +96,7 @@
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\src\Camera.cpp" />
|
||||
<ClCompile Include="..\..\src\CubemapTexture.cpp" />
|
||||
<ClCompile Include="..\..\src\EventBroker.cpp" />
|
||||
<ClCompile Include="..\..\src\GameWorld.cpp" />
|
||||
<ClCompile Include="..\..\src\main.cpp" />
|
||||
<ClCompile Include="..\..\src\Model.cpp" />
|
||||
@@ -140,7 +141,7 @@
|
||||
<ClInclude Include="..\..\src\Factory.h" />
|
||||
<ClInclude Include="..\..\src\GameWorld.h" />
|
||||
<ClInclude Include="..\..\src\GUI\Frame.h" />
|
||||
<ClInclude Include="..\..\src\EventRelay.h" />
|
||||
<ClInclude Include="..\..\src\EventBroker.h" />
|
||||
<ClInclude Include="..\..\src\Model.h" />
|
||||
<ClInclude Include="..\..\src\OBJ.h" />
|
||||
<ClInclude Include="..\..\src\PrecompiledHeader.h" />
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\ResourceManager.cpp" />
|
||||
<ClCompile Include="..\..\src\Sound.cpp" />
|
||||
<ClCompile Include="..\..\src\EventBroker.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Filter Include="Util">
|
||||
@@ -223,7 +224,7 @@
|
||||
<ClInclude Include="..\..\src\Util\Rectangle.h">
|
||||
<Filter>Util</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\src\EventRelay.h" />
|
||||
<ClInclude Include="..\..\src\EventBroker.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\..\src\Shaders\AABB.frag.glsl">
|
||||
|
||||
Reference in New Issue
Block a user