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 "PrecompiledHeader.h"
|
||||||
#include "Engine.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[])
|
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);
|
Engine engine(argc, argv);
|
||||||
while (engine.Running())
|
while (engine.Running())
|
||||||
engine.Tick();
|
engine.Tick();
|
||||||
|
|||||||
@@ -96,6 +96,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\src\Camera.cpp" />
|
<ClCompile Include="..\..\src\Camera.cpp" />
|
||||||
<ClCompile Include="..\..\src\CubemapTexture.cpp" />
|
<ClCompile Include="..\..\src\CubemapTexture.cpp" />
|
||||||
|
<ClCompile Include="..\..\src\EventBroker.cpp" />
|
||||||
<ClCompile Include="..\..\src\GameWorld.cpp" />
|
<ClCompile Include="..\..\src\GameWorld.cpp" />
|
||||||
<ClCompile Include="..\..\src\main.cpp" />
|
<ClCompile Include="..\..\src\main.cpp" />
|
||||||
<ClCompile Include="..\..\src\Model.cpp" />
|
<ClCompile Include="..\..\src\Model.cpp" />
|
||||||
@@ -140,7 +141,7 @@
|
|||||||
<ClInclude Include="..\..\src\Factory.h" />
|
<ClInclude Include="..\..\src\Factory.h" />
|
||||||
<ClInclude Include="..\..\src\GameWorld.h" />
|
<ClInclude Include="..\..\src\GameWorld.h" />
|
||||||
<ClInclude Include="..\..\src\GUI\Frame.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\Model.h" />
|
||||||
<ClInclude Include="..\..\src\OBJ.h" />
|
<ClInclude Include="..\..\src\OBJ.h" />
|
||||||
<ClInclude Include="..\..\src\PrecompiledHeader.h" />
|
<ClInclude Include="..\..\src\PrecompiledHeader.h" />
|
||||||
|
|||||||
@@ -50,6 +50,7 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\ResourceManager.cpp" />
|
<ClCompile Include="..\..\src\ResourceManager.cpp" />
|
||||||
<ClCompile Include="..\..\src\Sound.cpp" />
|
<ClCompile Include="..\..\src\Sound.cpp" />
|
||||||
|
<ClCompile Include="..\..\src\EventBroker.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Filter Include="Util">
|
<Filter Include="Util">
|
||||||
@@ -223,7 +224,7 @@
|
|||||||
<ClInclude Include="..\..\src\Util\Rectangle.h">
|
<ClInclude Include="..\..\src\Util\Rectangle.h">
|
||||||
<Filter>Util</Filter>
|
<Filter>Util</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\EventRelay.h" />
|
<ClInclude Include="..\..\src\EventBroker.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="..\..\src\Shaders\AABB.frag.glsl">
|
<None Include="..\..\src\Shaders\AABB.frag.glsl">
|
||||||
|
|||||||
Reference in New Issue
Block a user