Skip to content

Commit

Permalink
Refactor PlayerController.
Browse files Browse the repository at this point in the history
  • Loading branch information
karnkaul committed Feb 20, 2024
1 parent 69c1e01 commit 0ad6d93
Show file tree
Hide file tree
Showing 8 changed files with 82 additions and 76 deletions.
8 changes: 3 additions & 5 deletions DogTales/dog/dogtales.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,9 @@ void DogTales::tick() {
if (ImGui::BeginTabItem("Player")) {
bave::im_text("Controller States");
ImGui::Separator();
bave::im_text("move_x (Press A/D or Left/Right): {:.2f}",
m_player.get_controller_state("move_x").value());
bave::im_text("move_y (Press W/S or Up/Down): {:.2f}",
m_player.get_controller_state("move_y").value());
bave::im_text("Jump (Press 'E'): {:.2f}", m_player.get_controller_state("jump").value());
bave::im_text("move_x (Press A/D or Left/Right): {:.2f}", m_player.get_controller_state("move_x"));
bave::im_text("move_y (Press W/S or Up/Down): {:.2f}", m_player.get_controller_state("move_y"));
bave::im_text("Jump (Press Space): {:.2f}", m_player.get_controller_state("jump"));
ImGui::EndTabItem();
}
ImGui::EndTabBar();
Expand Down
2 changes: 1 addition & 1 deletion DogTales/dog/dogtales.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#pragma once
#include <bave/driver.hpp>
#include <dog/player.hpp>
#include <dog/player/player.hpp>

namespace dog {
class DogTales : public bave::Driver {
Expand Down
41 changes: 0 additions & 41 deletions DogTales/dog/player/PlayerController.cpp

This file was deleted.

18 changes: 0 additions & 18 deletions DogTales/dog/player/PlayerController.hpp

This file was deleted.

17 changes: 10 additions & 7 deletions DogTales/dog/player.cpp → DogTales/dog/player/player.cpp
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
#include <dog/player.hpp>
#include <dog/player/player.hpp>

namespace dog {
Player::Player(bave::App& app, glm::vec2 const world_space) : m_app(app), m_world_space(world_space) {
m_sprite.set_size(size_v);

m_player_controller.bind_throttle("move_x", {.lo = bave::Key::eLeft, .hi = bave::Key::eRight});
m_player_controller.bind_throttle("move_x", {.lo = bave::Key::eA, .hi = bave::Key::eD});
m_player_controller.bind_throttle("move_y", {.lo = bave::Key::eDown, .hi = bave::Key::eUp});
m_player_controller.bind_throttle("move_y", {.lo = bave::Key::eS, .hi = bave::Key::eW});
m_player_controller.bind_trigger("jump", bave::Key::eSpace);
}

void Player::tick(bave::Seconds const dt) {

if (physics_enabled) { m_physics.tick(dt); }
m_player_controller.tick(dt, m_app);

auto direction = glm::vec2{};

direction.x += m_player_controller.get_controller_state("move_x").value();
direction.y += m_player_controller.get_controller_state("move_y").value();
direction.x += m_player_controller.get_state("move_x");
direction.y += m_player_controller.get_state("move_y");

if (direction.x != 0.0f || direction.y != 0.0f) {
direction = glm::normalize(direction);
Expand All @@ -26,9 +31,7 @@ void Player::tick(bave::Seconds const dt) {

void Player::draw(bave::Shader& shader) const { m_sprite.draw(shader); }

std::optional<float> Player::get_controller_state(std::string_view key) const {
return m_player_controller.get_controller_state(key);
}
float Player::get_controller_state(std::string_view key) const { return m_player_controller.get_state(key); }

void Player::handle_wall_collision() {
auto& position = m_physics.position;
Expand Down
8 changes: 4 additions & 4 deletions DogTales/dog/player.hpp → DogTales/dog/player/player.hpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#pragma once
#include <bave/app.hpp>
#include <bave/graphics/sprite.hpp>
#include "components/physics.hpp"
#include "player/PlayerController.hpp"
#include <dog/components/physics.hpp>
#include <dog/player/player_controller.hpp>

namespace dog {
class Player {
Expand All @@ -16,7 +16,7 @@ class Player {
bave::Sprite m_sprite{};

component::Physics m_physics{};
PlayerController m_player_controller{};
PlayerController m_player_controller{&m_app};

void handle_wall_collision();

Expand All @@ -26,7 +26,7 @@ class Player {
void tick(bave::Seconds dt);
void draw(bave::Shader& shader) const;

std::optional<float> get_controller_state(std::string_view key) const;
float get_controller_state(std::string_view key) const;

bool physics_enabled{}; // for debugging
};
Expand Down
34 changes: 34 additions & 0 deletions DogTales/dog/player/player_controller.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#include <dog/player/player_controller.hpp>
#include <algorithm>
#include <cassert>

namespace dog {

PlayerController::PlayerController(bave::NotNull<bave::App const*> app) : m_app(app) {}

void PlayerController::bind_throttle(std::string_view const key, Throttle const throttle) {
if (throttle.hi == bave::Key::eUnknown) { return; }
auto it = m_mappings.find(key);
if (it == m_mappings.end()) {
auto [i, _] = m_mappings.insert_or_assign(std::string{key}, std::vector<Mapping>{});
it = i;
}
assert(it != m_mappings.end());
it->second.push_back(throttle);
}

float PlayerController::get_state(std::string_view const key) const {
auto const search = m_mappings.find(key);
if (search == m_mappings.end()) { return 0.0f; }

auto const& mappings = search->second;
auto const is_pressed = [this](bave::Key const key) { return m_app->get_key_state().is_pressed(key); };
auto ret = 0.0f;
for (auto const& mapping : mappings) {
if (mapping.lo != bave::Key::eUnknown && is_pressed(mapping.lo)) { ret -= 1.0f; }
if (is_pressed(mapping.hi)) { ret += 1.0f; }
}
return std::clamp(ret, -1.0f, 1.0f);
}

} // namespace dog
30 changes: 30 additions & 0 deletions DogTales/dog/player/player_controller.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#pragma once
#include <bave/app.hpp>
#include <bave/core/string_hash.hpp>
#include <unordered_map>
#include <vector>

namespace dog {
class PlayerController {

public:
struct Throttle {
bave::Key lo{};
bave::Key hi{};
};

explicit PlayerController(bave::NotNull<bave::App const*> app);

void bind_throttle(std::string_view key, Throttle throttle);
void bind_trigger(std::string_view key, bave::Key trigger) { bind_throttle(key, Throttle{.hi = trigger}); }

float get_state(std::string_view key) const;

private:
bave::NotNull<bave::App const*> m_app;

using Mapping = Throttle; // later to be a variant of KeyMapping / AxisMapping

std::unordered_map<std::string, std::vector<Mapping>, bave::StringHash, std::equal_to<>> m_mappings{};
};
} // namespace dog

0 comments on commit 0ad6d93

Please sign in to comment.