Skip to content

Commit

Permalink
Integrate gamepad
Browse files Browse the repository at this point in the history
  • Loading branch information
nerudaj committed Dec 15, 2023
1 parent 7593e1e commit eae3d96
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 7 deletions.
7 changes: 5 additions & 2 deletions src/lib-app/src/app/AppStateIngame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -161,8 +161,11 @@ void AppStateIngame::snapshotInputs(FrameState& state)
{
state.inputs = inputs
| std::views::transform(
[](const mem::Rc<ControllerInterface>& i) -> InputSchema
{ return i->getSnapshot(); })
[](mem::Rc<ControllerInterface>& i) -> InputSchema
{
i->update();
return i->getSnapshot();
})
| std::ranges::to<decltype(state.inputs)>();

if (settings->cmdSettings.playDemo)
Expand Down
7 changes: 7 additions & 0 deletions src/lib-game/include/input/ControllerInterface.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,13 @@ class ControllerInterface
};
}

virtual void update() {}

virtual bool isGamepadConnected() const
{
return false;
}

virtual bool isShooting() const = 0;

virtual bool shouldSwapToPreviousWeapon() const = 0;
Expand Down
10 changes: 10 additions & 0 deletions src/lib-game/include/input/PhysicalController.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,16 @@ class PhysicalController : public ControllerInterface
PhysicalController(const sf::Window& window, float mouseSensitivity);

public:
void update() override
{
input.update(dgm::Time {});
}

bool isGamepadConnected() const override
{
return input.isControllerConnected();
}

bool isShooting() const override;

bool shouldSwapToPreviousWeapon() const override;
Expand Down
24 changes: 19 additions & 5 deletions src/lib-game/src/input/PhysicalController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,25 @@ PhysicalController::PhysicalController(
input.bindInput(InputCode::NextWeapon, sf::Keyboard::E);
input.bindInput(InputCode::LastWeapon, sf::Keyboard::R);
input.bindInput(InputCode::LastWeapon, sf::Mouse::Right);

input.setControllerIndex(0);
input.bindInput(InputCode::Forward, dgm::Xbox::Axis::LStickYneg);
input.bindInput(InputCode::Backward, dgm::Xbox::Axis::LStickYpos);
input.bindInput(InputCode::StrafeLeft, dgm::Xbox::Axis::LStickXneg);
input.bindInput(InputCode::StrafeRight, dgm::Xbox::Axis::LStickXpos);
input.bindInput(InputCode::TurnLeft, dgm::Xbox::Axis::RStickXneg);
input.bindInput(InputCode::TurnRight, dgm::Xbox::Axis::RStickXpos);
input.bindInput(InputCode::PreviousWeapon, dgm::Xbox::Button::LBumper);
input.bindInput(InputCode::NextWeapon, dgm::Xbox::Button::RBumper);
input.bindInput(InputCode::LastWeapon, dgm::Xbox::Axis::LTrigger);
input.bindInput(InputCode::LastWeapon, dgm::Xbox::Button::Y);
input.bindInput(InputCode::Shoot, dgm::Xbox::Axis::RTrigger);
input.bindInput(InputCode::Shoot, dgm::Xbox::Button::A);
}

bool PhysicalController::isShooting() const
{
return input.isToggled(InputCode::Shoot);
return input.getValue(InputCode::Shoot) > 0.5f;
}

bool PhysicalController::shouldSwapToPreviousWeapon() const
Expand All @@ -39,20 +53,20 @@ bool PhysicalController::shouldSwapToNextWeapon() const

bool PhysicalController::shouldSwapToLastWeapon() const
{
const bool result = input.isToggled(InputCode::LastWeapon);
const bool result = input.getValue(InputCode::LastWeapon) > 0.5f;
if (result) input.releaseKey(InputCode::LastWeapon);
return result;
}

float PhysicalController::getThrust() const
{
return input.getValue(InputCode::Forward)
return -input.getValue(InputCode::Forward)
- input.getValue(InputCode::Backward);
}

float PhysicalController::getSidewardThrust() const
{
return -input.getValue(InputCode::StrafeLeft)
return input.getValue(InputCode::StrafeLeft)
+ input.getValue(InputCode::StrafeRight);
}

Expand All @@ -62,7 +76,7 @@ float PhysicalController::getSteer() const
const auto position = sf::Mouse::getPosition(window);
const auto xDiff = (position.x - windowWidthHalf);

return xDiff / mouseSensitivity - input.getValue(InputCode::TurnLeft)
return xDiff / mouseSensitivity + input.getValue(InputCode::TurnLeft)
+ input.getValue(InputCode::TurnRight);
}

Expand Down

0 comments on commit eae3d96

Please sign in to comment.