diff --git a/assets/images/lighthouse.png b/assets/images/lighthouse.png index ce3f73c..cec31af 100644 Binary files a/assets/images/lighthouse.png and b/assets/images/lighthouse.png differ diff --git a/ext/src.zip b/ext/src.zip index 3ebecc5..2d4b768 100644 Binary files a/ext/src.zip and b/ext/src.zip differ diff --git a/src/app.cpp b/src/app.cpp index a525495..a9689c6 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include namespace miracle { @@ -21,15 +20,11 @@ App::App() : m_context(context_ci), m_data_loader(le::FileDataLoader::upfind("as void App::run() { auto game = Game{&m_services}; - auto const event_visitor = klib::SubVisitor{ - [&game](le::event::CursorPos const& cursor_pos) { game.on_cursor_pos(cursor_pos); }, - }; - auto delta_time = kvf::DeltaTime{}; while (m_context.is_running()) { m_context.next_frame(); auto const dt = delta_time.tick(); - for (auto const& event : m_context.event_queue()) { std::visit(event_visitor, event); } + m_input_router.dispatch(m_context.event_queue()); game.tick(dt); if (auto renderer = m_context.begin_render()) { game.render(renderer); } m_context.present(); @@ -44,5 +39,7 @@ void App::bind_services() { m_services.bind(&m_data_loader); m_services.bind(&m_asset_loader); + + m_services.bind(&m_input_router); } } // namespace miracle diff --git a/src/app.hpp b/src/app.hpp index 1d63270..0b78d5f 100644 --- a/src/app.hpp +++ b/src/app.hpp @@ -1,6 +1,7 @@ #pragma once #include #include +#include #include namespace miracle { @@ -16,6 +17,7 @@ class App { le::Context m_context; le::FileDataLoader m_data_loader{}; le::AssetLoader m_asset_loader{}; + le::input::Router m_input_router{}; le::ServiceLocator m_services{}; }; diff --git a/src/game.cpp b/src/game.cpp index 3221fdb..c35d1d0 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -13,16 +13,20 @@ #include "util/random.hpp" namespace miracle { -Game::Game(gsl::not_null services) : m_services(services), m_lighthouse(services), m_light(services) { - spawn_wave(); +Game::Game(gsl::not_null services) + : m_services(services), m_action_mapping(&services->get()), m_lighthouse(services), m_light(services) { auto const& asset_loader = services->get(); m_font = asset_loader.load("fonts/specialElite.ttf"); if (!m_font) { throw std::runtime_error{"Failed to load font"}; } + + m_action_mapping.bind_action(&m_look_action, [this](le::input::action::Value const& v) { on_look(v); }); + + spawn_wave(); } -void Game::on_cursor_pos(le::event::CursorPos const& cursor_pos) { +void Game::on_look(le::input::action::Value const value) { auto const framebuffer_size = m_services->get().framebuffer_size(); - m_cursor_pos = cursor_pos.normalized.to_target(framebuffer_size); + m_cursor_pos = le::ndc::vec2{value.get()}.to_target(framebuffer_size); } void Game::tick([[maybe_unused]] kvf::Seconds const dt) { diff --git a/src/game.hpp b/src/game.hpp index 2b599db..29d3fe7 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include #include #include @@ -16,8 +18,6 @@ class Game { public: explicit Game(gsl::not_null services); - void on_cursor_pos(le::event::CursorPos const& cursor_pos); - void tick(kvf::Seconds dt); void render(le::Renderer& renderer) const; void update_score(int points); @@ -25,7 +25,13 @@ class Game { void spawn_wave(); private: + void on_look(le::input::action::Value value); + gsl::not_null m_services; + + le::input::ScopedActionMapping m_action_mapping; + le::input::action::Cursor m_look_action{}; + Lighthouse m_lighthouse; Light m_light; diff --git a/src/lighthouse.cpp b/src/lighthouse.cpp index 7b3bc8c..50e7a66 100644 --- a/src/lighthouse.cpp +++ b/src/lighthouse.cpp @@ -12,14 +12,7 @@ Lighthouse::Lighthouse(gsl::not_null services) : m_se void Lighthouse::rotate_towards_cursor(glm::vec2 cursor_pos) { auto const dist_sq = glm::length2((cursor_pos)); - if (dist_sq > 0.1f) { - auto const dist = std::sqrt(dist_sq); - auto const normalized = cursor_pos / dist; - static constexpr auto up_v = glm::vec2(0.0f, 1.0f); - auto const dot = glm::dot(normalized, up_v); - auto const angle = glm::degrees(std::acos(dot)); - m_sprite.transform.orientation = cursor_pos.x > 0.0f ? -angle : angle; - } + if (dist_sq > 0.1f) { m_sprite.transform.orientation = cursor_pos; } } void Lighthouse::check_visibility_range(Enemy& enemy) {