diff --git a/src/game/game.cpp b/src/game/game.cpp index 6f9461a0eb6941c72882138245d3eb456d6f5c78..64799ae5bf3d641d2f0ff4690cd7194f7f3ebfb2 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -97,22 +97,22 @@ void game::process_events() { void game::process_event(const event& e) { do_event<quit_game>(e, [&](auto&) { is_running = false; }); - do_event<change_player_angle>(e, [&](const auto& cpa){ - player_angle_delta += cpa.delta; - player_angle_delta = min(change_player_angle::DEFAULT, - max(-change_player_angle::DEFAULT, + do_event<change<player_angle>>(e, [&](const auto& cpa){ + player_angle_delta += cpa.data.value; + player_angle_delta = min(player_angle::DEFAULT, + max(-player_angle::DEFAULT, player_angle_delta)); }); - do_event<change_player_force>(e, [&](const auto& cpf){ - player_force_delta += cpf.delta; - player_force_delta = min(change_player_force::DEFAULT, - max(-change_player_force::DEFAULT, + do_event<change<player_force>>(e, [&](const auto& cpf){ + player_force_delta += cpf.data.value; + player_force_delta = min(player_force::DEFAULT, + max(-player_force::DEFAULT, player_force_delta)); }); - do_event<change_move_vector>(e, [&](const auto& cmv) { - player_position_delta += cmv.delta; // FIXME: Use ranged value here; - player_position_delta = min(change_move_vector::DEFAULT, - max(-change_move_vector::DEFAULT, + do_event<change<move_vector>>(e, [&](const auto& cmv) { + player_position_delta += cmv.data.value; // FIXME: Use ranged value here; + player_position_delta = min(move_vector::DEFAULT, + max(-move_vector::DEFAULT, player_position_delta)); }); do_event<push_state>(e, [&](auto&) { @@ -124,10 +124,10 @@ void game::process_event(const event& e) { current_state = std::move(state::pop()); }); do_event<shoot_event>(e, [&](auto&) {shoot = true;}); - do_event<switch_controller>(e, [&](const auto& sc) { + do_event<change<shooting_controller>>(e, [&](const auto& sc) { if (shoot_control->can_switch()) { delete shoot_control; - switch(sc.mode) { + switch(sc.data.mode) { case shooting_mode::SINGLE: shoot_control = new single_shot(); break; diff --git a/src/game/input/events.hpp b/src/game/input/events.hpp index 85946cdcfa1a89f32a8b39e3e5ec6c476fca2e41..3f53bf93f02df190825162c191eedfaf076fcdd3 100644 --- a/src/game/input/events.hpp +++ b/src/game/input/events.hpp @@ -4,45 +4,64 @@ #include <variant> #include <cstdint> +/// Event that represents data change template<typename T> struct change { T data; }; -struct change_move_vector { +/// Move vector data that are applied during changing/setting values +struct move_vector { constexpr static int32_t DEFAULT = 5; - int32_t delta; + int32_t value; }; -struct change_player_angle { +/// Player angle data that are applied during changing/setting values +struct player_angle { constexpr static double DEFAULT = 0.05; - double delta; + double value; }; -struct change_player_force { + +/// Player force data that are applied during changing/setting values +struct player_force { constexpr static double DEFAULT = 0.1; - double delta; + double value; }; -struct push_state {}; - -struct pop_state {}; - -struct quit_game {}; - -struct shoot_event {}; - +/// All posible shooting modes enum class shooting_mode { SINGLE, MULTIPLE }; -struct switch_controller { +/// Shooting controller data that are applied during changing/setting values +struct shooting_controller { shooting_mode mode; }; +/// Event that pushes current state +struct push_state {}; + +/// Pops latest state and replaces it +struct pop_state {}; + +/// Quit game event - stops game loop +struct quit_game {}; + +/// Shoot event that represents user pushing shooting button +struct shoot_event {}; + +/// Changes debug status struct switch_debug {}; -typedef std::variant<switch_debug, switch_controller, change_player_force, change_move_vector, change_player_angle, push_state, pop_state, quit_game, shoot_event> event; +/// Generic all event data storage - saves memory, autotype deduction +typedef std::variant<change<player_force>, + change<move_vector>, + change<player_angle>, + change<shooting_controller>, + push_state, pop_state, + quit_game, shoot_event, + switch_debug> event; #endif//EVENTS_HPP \ No newline at end of file diff --git a/src/game/input/sdl_input.cpp b/src/game/input/sdl_input.cpp index b5bcd34e76553d0c1331f6a9694708d9b7dd4fa1..baf0ffa975e9d7da1ef308dc0df35fbe02f51754 100644 --- a/src/game/input/sdl_input.cpp +++ b/src/game/input/sdl_input.cpp @@ -25,47 +25,47 @@ void sdl_input::process_key_event(const SDL_Event& e) { switch (e.key.keysym.sym) { case SDLK_w: if (pressed) - events.emplace_back(change_move_vector{-change_move_vector::DEFAULT}); + events.emplace_back(change<move_vector>{-move_vector::DEFAULT}); else - events.emplace_back(change_move_vector{change_move_vector::DEFAULT}); + events.emplace_back(change<move_vector>{move_vector::DEFAULT}); break; case SDLK_s: if (pressed) - events.emplace_back(change_move_vector{change_move_vector::DEFAULT}); + events.emplace_back(change<move_vector>{move_vector::DEFAULT}); else - events.emplace_back(change_move_vector{-change_move_vector::DEFAULT}); + events.emplace_back(change<move_vector>{-move_vector::DEFAULT}); break; case SDLK_a: if (pressed) - events.emplace_back(change_player_angle{change_player_angle::DEFAULT}); + events.emplace_back(change<player_angle>{player_angle::DEFAULT}); else - events.emplace_back(change_player_angle{-change_player_angle::DEFAULT}); + events.emplace_back(change<player_angle>{-player_angle::DEFAULT}); break; case SDLK_d: if (pressed) - events.emplace_back(change_player_angle{-change_player_angle::DEFAULT}); + events.emplace_back(change<player_angle>{-player_angle::DEFAULT}); else - events.emplace_back(change_player_angle{change_player_angle::DEFAULT}); + events.emplace_back(change<player_angle>{player_angle::DEFAULT}); break; case SDLK_e: if (pressed) - events.emplace_back(change_player_force{change_player_force::DEFAULT}); + events.emplace_back(change<player_force>{player_force::DEFAULT}); else - events.emplace_back(change_player_force{-change_player_force::DEFAULT}); + events.emplace_back(change<player_force>{-player_force::DEFAULT}); break; case SDLK_q: if (pressed) - events.emplace_back(change_player_force{-change_player_force::DEFAULT}); + events.emplace_back(change<player_force>{-player_force::DEFAULT}); else - events.emplace_back(change_player_force{change_player_force::DEFAULT}); + events.emplace_back(change<player_force>{player_force::DEFAULT}); break; case SDLK_1: if (pressed) - events.emplace_back(switch_controller{shooting_mode::SINGLE}); + events.emplace_back(change<shooting_controller>{shooting_mode::SINGLE}); break; case SDLK_2: if (pressed) - events.emplace_back(switch_controller{shooting_mode::MULTIPLE}); + events.emplace_back(change<shooting_controller>{shooting_mode::MULTIPLE}); break; case SDLK_SPACE: if (pressed)