WIP InputController for easier command handling in systems
This commit is contained in:
@@ -6,6 +6,10 @@
|
|||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
|
#define EVENT_SUBSCRIBE_MEMBER(relay, handler) \
|
||||||
|
relay = decltype(relay)(std::bind(handler, this, std::placeholders::_1)); \
|
||||||
|
EventBroker->Subscribe(relay);
|
||||||
|
|
||||||
struct Event
|
struct Event
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
#ifndef Events_InputCommand_h__
|
#ifndef Events_InputCommand_h__
|
||||||
#define Events_InputCommand_h__
|
#define Events_InputCommand_h__
|
||||||
|
|
||||||
|
#include <boost/any.hpp>
|
||||||
|
|
||||||
#include "EventBroker.h"
|
#include "EventBroker.h"
|
||||||
|
|
||||||
namespace Events
|
namespace Events
|
||||||
@@ -10,6 +12,7 @@ struct InputCommand : Event
|
|||||||
{
|
{
|
||||||
unsigned int PlayerID;
|
unsigned int PlayerID;
|
||||||
std::string Command;
|
std::string Command;
|
||||||
|
boost::any Value;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
#ifndef Events_InputCommandValue_h__
|
|
||||||
#define Events_InputCommandValue_h__
|
|
||||||
|
|
||||||
#include "EventBroker.h"
|
|
||||||
#include "Events/InputCommand.h"
|
|
||||||
|
|
||||||
namespace Events
|
|
||||||
{
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct InputCommandValue : public InputCommand
|
|
||||||
{
|
|
||||||
T Value;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // Events_InputCommandValue_h__
|
|
||||||
+27
-3
@@ -8,6 +8,14 @@ void GameWorld::Initialize()
|
|||||||
m_ResourceManager.Preload("Model", "Models/Placeholders/PhysicsTest/Plane.obj");
|
m_ResourceManager.Preload("Model", "Models/Placeholders/PhysicsTest/Plane.obj");
|
||||||
m_ResourceManager.Preload("Model", "Models/Placeholders/PhysicsTest/ArrowCube.obj");
|
m_ResourceManager.Preload("Model", "Models/Placeholders/PhysicsTest/ArrowCube.obj");
|
||||||
|
|
||||||
|
BindKey(GLFW_KEY_W, "+forward");
|
||||||
|
BindKey(GLFW_KEY_S, "+backward");
|
||||||
|
BindKey(GLFW_KEY_A, "+left");
|
||||||
|
BindKey(GLFW_KEY_D, "+right");
|
||||||
|
BindMouseButton(GLFW_MOUSE_BUTTON_1, "+attack");
|
||||||
|
BindMouseButton(GLFW_MOUSE_BUTTON_2, "+attack2");
|
||||||
|
BindMouseButton(GLFW_MOUSE_BUTTON_3, "+attack3");
|
||||||
|
|
||||||
RegisterComponents();
|
RegisterComponents();
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -42,7 +50,7 @@ void GameWorld::Initialize()
|
|||||||
CommitEntity(ground);
|
CommitEntity(ground);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
/*{
|
||||||
auto TankTest = CreateEntity();
|
auto TankTest = CreateEntity();
|
||||||
auto transform = AddComponent<Components::Transform>(TankTest, "Transform");
|
auto transform = AddComponent<Components::Transform>(TankTest, "Transform");
|
||||||
transform->Position = glm::vec3(1.5f, 0.7f, 5.f);
|
transform->Position = glm::vec3(1.5f, 0.7f, 5.f);
|
||||||
@@ -85,7 +93,7 @@ void GameWorld::Initialize()
|
|||||||
auto physics = AddComponent<Components::Physics>(ball, "Physics");
|
auto physics = AddComponent<Components::Physics>(ball, "Physics");
|
||||||
physics->Mass = 1;
|
physics->Mass = 1;
|
||||||
CommitEntity(ball);
|
CommitEntity(ball);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
{
|
{
|
||||||
auto entity = CreateEntity();
|
auto entity = CreateEntity();
|
||||||
@@ -138,4 +146,20 @@ void GameWorld::AddSystems()
|
|||||||
AddSystem("SoundSystem");
|
AddSystem("SoundSystem");
|
||||||
AddSystem("PhysicsSystem");
|
AddSystem("PhysicsSystem");
|
||||||
AddSystem("RenderSystem");
|
AddSystem("RenderSystem");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GameWorld::BindKey(int keyCode, std::string command)
|
||||||
|
{
|
||||||
|
Events::BindKey e;
|
||||||
|
e.KeyCode = keyCode;
|
||||||
|
e.Command = command;
|
||||||
|
m_EventBroker->Publish(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GameWorld::BindMouseButton(int button, std::string command)
|
||||||
|
{
|
||||||
|
Events::BindMouseButton e;
|
||||||
|
e.Button = button;
|
||||||
|
e.Command = command;
|
||||||
|
m_EventBroker->Publish(e);
|
||||||
|
}
|
||||||
|
|||||||
@@ -47,6 +47,9 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<Renderer> m_Renderer;
|
std::shared_ptr<Renderer> m_Renderer;
|
||||||
|
|
||||||
|
void BindKey(int keyCode, std::string command);
|
||||||
|
void BindMouseButton(int button, std::string command);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // GameWorld_h__
|
#endif // GameWorld_h__
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
#ifndef InputController_h__
|
||||||
|
#define InputController_h__
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include "EventBroker.h"
|
||||||
|
#include "Events/InputCommand.h"
|
||||||
|
|
||||||
|
class InputController
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
InputController(std::shared_ptr<::EventBroker> eventBroker)
|
||||||
|
: EventBroker(EventBroker) { Initialize(); }
|
||||||
|
|
||||||
|
virtual void Initialize()
|
||||||
|
{
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &InputController::OnCommand)
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool OnCommand(const Events::InputCommand &event) { }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::shared_ptr<::EventBroker> EventBroker;
|
||||||
|
|
||||||
|
private:
|
||||||
|
EventRelay<Events::InputCommand> m_EInputCommand;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // InputController_h__
|
||||||
@@ -10,32 +10,12 @@ void Systems::InputSystem::RegisterComponents(ComponentFactory* cf)
|
|||||||
void Systems::InputSystem::Initialize()
|
void Systems::InputSystem::Initialize()
|
||||||
{
|
{
|
||||||
// Subscribe to events
|
// Subscribe to events
|
||||||
m_EKeyDown = decltype(m_EKeyDown)(std::bind(&Systems::InputSystem::OnKeyDown, this, std::placeholders::_1));
|
EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &Systems::InputSystem::OnKeyDown)
|
||||||
EventBroker->Subscribe(m_EKeyDown);
|
EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &Systems::InputSystem::OnKeyUp)
|
||||||
m_EKeyUp = decltype(m_EKeyUp)(std::bind(&Systems::InputSystem::OnKeyUp, this, std::placeholders::_1));
|
EVENT_SUBSCRIBE_MEMBER(m_EMousePress, &Systems::InputSystem::OnMousePress)
|
||||||
EventBroker->Subscribe(m_EKeyUp);
|
EVENT_SUBSCRIBE_MEMBER(m_EMouseRelease, &Systems::InputSystem::OnMouseRelease)
|
||||||
m_EMousePress = decltype(m_EMousePress)(std::bind(&Systems::InputSystem::OnMousePress, this, std::placeholders::_1));
|
EVENT_SUBSCRIBE_MEMBER(m_EBindKey, &Systems::InputSystem::OnBindKey)
|
||||||
EventBroker->Subscribe(m_EMousePress);
|
EVENT_SUBSCRIBE_MEMBER(m_EBindMouseButton, &Systems::InputSystem::OnBindMouseButton)
|
||||||
m_EMouseRelease = decltype(m_EMouseRelease)(std::bind(&Systems::InputSystem::OnMouseRelease, this, std::placeholders::_1));
|
|
||||||
EventBroker->Subscribe(m_EMouseRelease);
|
|
||||||
m_EBindKey = decltype(m_EBindKey)(std::bind(&Systems::InputSystem::OnBindKey, this, std::placeholders::_1));
|
|
||||||
EventBroker->Subscribe(m_EBindKey);
|
|
||||||
m_EBindMouseButton = decltype(m_EBindMouseButton)(std::bind(&Systems::InputSystem::OnBindMouseButton, this, std::placeholders::_1));
|
|
||||||
EventBroker->Subscribe(m_EBindMouseButton);
|
|
||||||
|
|
||||||
{
|
|
||||||
Events::BindKey e;
|
|
||||||
e.KeyCode = GLFW_KEY_W;
|
|
||||||
e.Command = "+forward";
|
|
||||||
EventBroker->Publish(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
Events::BindMouseButton e;
|
|
||||||
e.Button = GLFW_MOUSE_BUTTON_1;
|
|
||||||
e.Command = "+attack";
|
|
||||||
EventBroker->Publish(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Systems::InputSystem::Update(double dt)
|
void Systems::InputSystem::Update(double dt)
|
||||||
|
|||||||
@@ -14,7 +14,6 @@
|
|||||||
#include "Events/BindKey.h"
|
#include "Events/BindKey.h"
|
||||||
#include "Events/BindMouseButton.h"
|
#include "Events/BindMouseButton.h"
|
||||||
#include "Events/InputCommand.h"
|
#include "Events/InputCommand.h"
|
||||||
#include "Events/InputCommandValue.h"
|
|
||||||
|
|
||||||
namespace Systems
|
namespace Systems
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -142,7 +142,6 @@
|
|||||||
<ClInclude Include="..\..\src\Events\BindKey.h" />
|
<ClInclude Include="..\..\src\Events\BindKey.h" />
|
||||||
<ClInclude Include="..\..\src\Events\BindMouseButton.h" />
|
<ClInclude Include="..\..\src\Events\BindMouseButton.h" />
|
||||||
<ClInclude Include="..\..\src\Events\InputCommand.h" />
|
<ClInclude Include="..\..\src\Events\InputCommand.h" />
|
||||||
<ClInclude Include="..\..\src\Events\InputCommandValue.h" />
|
|
||||||
<ClInclude Include="..\..\src\Events\KeyDown.h" />
|
<ClInclude Include="..\..\src\Events\KeyDown.h" />
|
||||||
<ClInclude Include="..\..\src\Events\KeyUp.h" />
|
<ClInclude Include="..\..\src\Events\KeyUp.h" />
|
||||||
<ClInclude Include="..\..\src\Events\MouseMove.h" />
|
<ClInclude Include="..\..\src\Events\MouseMove.h" />
|
||||||
@@ -153,6 +152,7 @@
|
|||||||
<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\EventBroker.h" />
|
<ClInclude Include="..\..\src\EventBroker.h" />
|
||||||
|
<ClInclude Include="..\..\src\InputController.h" />
|
||||||
<ClInclude Include="..\..\src\InputManager.h" />
|
<ClInclude Include="..\..\src\InputManager.h" />
|
||||||
<ClInclude Include="..\..\src\Model.h" />
|
<ClInclude Include="..\..\src\Model.h" />
|
||||||
<ClInclude Include="..\..\src\OBJ.h" />
|
<ClInclude Include="..\..\src\OBJ.h" />
|
||||||
|
|||||||
@@ -261,12 +261,12 @@
|
|||||||
<ClInclude Include="..\..\src\Events\BindMouseButton.h">
|
<ClInclude Include="..\..\src\Events\BindMouseButton.h">
|
||||||
<Filter>Input\Events</Filter>
|
<Filter>Input\Events</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\Events\InputCommandValue.h">
|
|
||||||
<Filter>Input\Events</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\Events\InputCommand.h">
|
<ClInclude Include="..\..\src\Events\InputCommand.h">
|
||||||
<Filter>Input\Events</Filter>
|
<Filter>Input\Events</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\InputController.h">
|
||||||
|
<Filter>Input</Filter>
|
||||||
|
</ClInclude>
|
||||||
</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