From f0e0e6e747b181e87eb1d53dde81bd0b060712c9 Mon Sep 17 00:00:00 2001 From: Daniel Evans Date: Wed, 16 Nov 2016 23:34:28 +0000 Subject: [PATCH] Extract game input state handling from IngameState Prevents input getting "stuck" when input is removed in the pause menu --- rwgame/CMakeLists.txt | 3 ++ rwgame/GameInput.cpp | 80 +++++++++++++++++++++++++++++++++++ rwgame/GameInput.hpp | 10 +++++ rwgame/RWGame.cpp | 3 ++ rwgame/states/IngameState.cpp | 80 ----------------------------------- rwgame/states/IngameState.hpp | 1 - 6 files changed, 96 insertions(+), 81 deletions(-) create mode 100644 rwgame/GameInput.cpp create mode 100644 rwgame/GameInput.hpp diff --git a/rwgame/CMakeLists.txt b/rwgame/CMakeLists.txt index a0d236b3..d5cc7999 100644 --- a/rwgame/CMakeLists.txt +++ b/rwgame/CMakeLists.txt @@ -22,6 +22,9 @@ set(RWGAME_SOURCES MenuSystem.hpp MenuSystem.cpp + GameInput.hpp + GameInput.cpp + states/LoadingState.hpp states/LoadingState.cpp states/IngameState.hpp diff --git a/rwgame/GameInput.cpp b/rwgame/GameInput.cpp new file mode 100644 index 00000000..0f4caa8d --- /dev/null +++ b/rwgame/GameInput.cpp @@ -0,0 +1,80 @@ +#include "GameInput.hpp" +#include + +// Hardcoded Controls SDLK_* -> GameInputState::Control +const std::unordered_multimap kDefaultControls = { + /* On Foot */ + {SDLK_LCTRL, GameInputState::FireWeapon}, + {SDLK_KP_0, GameInputState::FireWeapon}, + {SDLK_KP_ENTER, GameInputState::NextWeapon}, + {SDLK_KP_PERIOD, GameInputState::LastWeapon}, + {SDLK_w, GameInputState::GoForward}, + {SDLK_UP, GameInputState::GoForward}, + {SDLK_s, GameInputState::GoBackwards}, + {SDLK_DOWN, GameInputState::GoBackwards}, + {SDLK_a, GameInputState::GoLeft}, + {SDLK_LEFT, GameInputState::GoLeft}, + {SDLK_d, GameInputState::GoRight}, + {SDLK_RIGHT, GameInputState::GoRight}, + {SDLK_PAGEUP, GameInputState::ZoomIn}, + {SDLK_z, GameInputState::ZoomIn}, + {SDLK_PAGEDOWN, GameInputState::ZoomOut}, + {SDLK_x, GameInputState::ZoomOut}, + {SDLK_f, GameInputState::EnterExitVehicle}, + {SDLK_RETURN, GameInputState::EnterExitVehicle}, + {SDLK_c, GameInputState::ChangeCamera}, + {SDLK_HOME, GameInputState::ChangeCamera}, + {SDLK_RCTRL, GameInputState::Jump}, + {SDLK_SPACE, GameInputState::Jump}, + {SDLK_LSHIFT, GameInputState::Sprint}, + {SDLK_RSHIFT, GameInputState::Sprint}, + {SDLK_LALT, GameInputState::Walk}, + {SDLK_DELETE, GameInputState::AimWeapon}, + {SDLK_CAPSLOCK, GameInputState::LookBehind}, + + /* In Vehicle */ + {SDLK_LCTRL, GameInputState::VehicleFireWeapon}, + {SDLK_a, GameInputState::VehicleLeft}, + {SDLK_LEFT, GameInputState::VehicleLeft}, + {SDLK_d, GameInputState::VehicleRight}, + {SDLK_RIGHT, GameInputState::VehicleRight}, + {SDLK_w, GameInputState::VehicleAccelerate}, + {SDLK_UP, GameInputState::VehicleAccelerate}, + {SDLK_d, GameInputState::VehicleBrake}, + {SDLK_DOWN, GameInputState::VehicleBrake}, + {SDLK_INSERT, GameInputState::ChangeRadio}, + {SDLK_r, GameInputState::ChangeRadio}, + {SDLK_LSHIFT, GameInputState::Horn}, + {SDLK_RSHIFT, GameInputState::Horn}, + {SDLK_KP_PLUS, GameInputState::Submission}, + {SDLK_CAPSLOCK, GameInputState::Submission}, + {SDLK_RCTRL, GameInputState::Handbrake}, + {SDLK_SPACE, GameInputState::Handbrake}, + {SDLK_KP_9, GameInputState::VehicleAimUp}, + {SDLK_KP_2, GameInputState::VehicleAimDown}, + {SDLK_KP_4, GameInputState::VehicleAimLeft}, + {SDLK_KP_6, GameInputState::VehicleAimRight}, + {SDLK_KP_9, GameInputState::VehicleDown}, + {SDLK_KP_2, GameInputState::VehicleUp}, + {SDLK_KP_1, GameInputState::LookLeft}, + {SDLK_q, GameInputState::LookLeft}, + {SDLK_KP_2, GameInputState::LookRight}, + {SDLK_e, GameInputState::LookRight}, +}; + +void GameInput::updateGameInputState(GameInputState *state, + const SDL_Event &event) { + switch (event.type) { + case SDL_KEYDOWN: + case SDL_KEYUP: { + auto sym = event.key.keysym.sym; + auto level = event.type == SDL_KEYDOWN ? 1.f : 0.f; + auto& levels = state->levels; + + auto range = kDefaultControls.equal_range(sym); + for (auto it = range.first; it != range.second; ++it) { + levels[it->second] = level; + } + } break; + } +} diff --git a/rwgame/GameInput.hpp b/rwgame/GameInput.hpp new file mode 100644 index 00000000..df0b1e23 --- /dev/null +++ b/rwgame/GameInput.hpp @@ -0,0 +1,10 @@ +#ifndef RWGAME_GAMEINPUT_HPP +#define RWGAME_GAMEINPUT_HPP +#include "engine/GameState.hpp" +#include "SDL2/SDL.h" + +namespace GameInput { +void updateGameInputState(GameInputState* state, const SDL_Event& event); +} + +#endif diff --git a/rwgame/RWGame.cpp b/rwgame/RWGame.cpp index eff4f6f3..008c97eb 100644 --- a/rwgame/RWGame.cpp +++ b/rwgame/RWGame.cpp @@ -1,5 +1,6 @@ #include "RWGame.hpp" #include "DrawUI.hpp" +#include "GameInput.hpp" #include "State.hpp" #include "states/BenchmarkState.hpp" #include "states/IngameState.hpp" @@ -394,6 +395,8 @@ int RWGame::run() { break; } + GameInput::updateGameInputState(&getState()->input[0], event); + RW_PROFILE_BEGIN("State"); state->handleEvent(event); RW_PROFILE_END() diff --git a/rwgame/states/IngameState.cpp b/rwgame/states/IngameState.cpp index 69909606..2a1b177c 100644 --- a/rwgame/states/IngameState.cpp +++ b/rwgame/states/IngameState.cpp @@ -17,7 +17,6 @@ #include