From 867fd5d9b79c3b9c1d0fb17ba9f55cfe971b93d5 Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Mon, 6 Aug 2012 15:34:05 +0200 Subject: [PATCH] added Input class for handling user input also changed application states to utilize the new Input class rather than handling events themselves and mapped all keys in main() for testing --- Debug/makefile | 1 - Debug/sources.mk | 1 - Debug/src/app/subdir.mk | 9 +++-- Release/makefile | 1 - Release/sources.mk | 1 - Release/src/app/subdir.mk | 9 +++-- src/app/Application.cpp | 8 ++++- src/app/Application.h | 4 +++ src/app/Input.cpp | 36 ++++++++++++++++++++ src/app/Input.h | 70 ++++++++++++++++++++++++++++++++++++++ src/app/State.h | 3 +- src/battle/BattleState.cpp | 5 ++- src/battle/BattleState.h | 4 ++- src/main.cpp | 14 ++++++++ 14 files changed, 152 insertions(+), 14 deletions(-) create mode 100644 src/app/Input.cpp create mode 100644 src/app/Input.h diff --git a/Debug/makefile b/Debug/makefile index 48bc75f..507437a 100644 --- a/Debug/makefile +++ b/Debug/makefile @@ -10,7 +10,6 @@ RM := rm -rf -include sources.mk -include src/sdl/subdir.mk -include src/graphics/subdir.mk --include src/geometry/subdir.mk -include src/battle/subdir.mk -include src/app/subdir.mk -include src/subdir.mk diff --git a/Debug/sources.mk b/Debug/sources.mk index 732350c..0fdadd3 100644 --- a/Debug/sources.mk +++ b/Debug/sources.mk @@ -28,5 +28,4 @@ src \ src/graphics \ src/battle \ src/app \ -src/geometry \ diff --git a/Debug/src/app/subdir.mk b/Debug/src/app/subdir.mk index 76160a8..ae7ec03 100644 --- a/Debug/src/app/subdir.mk +++ b/Debug/src/app/subdir.mk @@ -4,13 +4,16 @@ # Add inputs and outputs from these tool invocations to the build variables CPP_SRCS += \ -../src/app/Application.cpp +../src/app/Application.cpp \ +../src/app/Input.cpp OBJS += \ -./src/app/Application.o +./src/app/Application.o \ +./src/app/Input.o CPP_DEPS += \ -./src/app/Application.d +./src/app/Application.d \ +./src/app/Input.d # Each subdirectory must supply rules for building sources it contributes diff --git a/Release/makefile b/Release/makefile index 48bc75f..507437a 100644 --- a/Release/makefile +++ b/Release/makefile @@ -10,7 +10,6 @@ RM := rm -rf -include sources.mk -include src/sdl/subdir.mk -include src/graphics/subdir.mk --include src/geometry/subdir.mk -include src/battle/subdir.mk -include src/app/subdir.mk -include src/subdir.mk diff --git a/Release/sources.mk b/Release/sources.mk index 732350c..0fdadd3 100644 --- a/Release/sources.mk +++ b/Release/sources.mk @@ -28,5 +28,4 @@ src \ src/graphics \ src/battle \ src/app \ -src/geometry \ diff --git a/Release/src/app/subdir.mk b/Release/src/app/subdir.mk index 555eb00..e0bc8c4 100644 --- a/Release/src/app/subdir.mk +++ b/Release/src/app/subdir.mk @@ -4,13 +4,16 @@ # Add inputs and outputs from these tool invocations to the build variables CPP_SRCS += \ -../src/app/Application.cpp +../src/app/Application.cpp \ +../src/app/Input.cpp OBJS += \ -./src/app/Application.o +./src/app/Application.o \ +./src/app/Input.o CPP_DEPS += \ -./src/app/Application.d +./src/app/Application.d \ +./src/app/Input.d # Each subdirectory must supply rules for building sources it contributes diff --git a/src/app/Application.cpp b/src/app/Application.cpp index e06e231..d3b00a1 100644 --- a/src/app/Application.cpp +++ b/src/app/Application.cpp @@ -88,6 +88,7 @@ void Application::Loop(void) { void Application::HandleEvents(void) { if (!CurrentState()) return; + input.ResetInteractiveState(); SDL_Event event; while (SDL_PollEvent(&event)) { switch (event.type) { @@ -98,11 +99,16 @@ void Application::HandleEvents(void) { screen->Resize(event.resize.w, event.resize.h); CurrentState()->Resize(event.resize.w, event.resize.h); break; + case SDL_KEYDOWN: + case SDL_KEYUP: + input.HandleKeyboardEvent(event.key); + break; default: - CurrentState()->HandleEvent(event); + // skip event break; } } + CurrentState()->HandleInput(input); } void Application::UpdateWorld(Uint32 deltaT) { diff --git a/src/app/Application.h b/src/app/Application.h index 909942b..f70dd69 100644 --- a/src/app/Application.h +++ b/src/app/Application.h @@ -8,6 +8,7 @@ #ifndef APP_APPLICATION_H_ #define APP_APPLICATION_H_ +#include "Input.h" #include "../sdl/InitScreen.h" #include @@ -36,6 +37,8 @@ public: void PushState(State *); void PopState(void); void Quit(void); + Input &Buttons() { return input; } + const Input &Buttons() const { return input; } private: State *CurrentState(void); @@ -51,6 +54,7 @@ private: private: sdl::InitScreen *screen; std::stack states; + Input input; Uint32 last; }; diff --git a/src/app/Input.cpp b/src/app/Input.cpp new file mode 100644 index 0000000..e810e00 --- /dev/null +++ b/src/app/Input.cpp @@ -0,0 +1,36 @@ +/* + * Input.cpp + * + * Created on: Aug 6, 2012 + * Author: holy + */ + +#include "Input.h" + +using std::map; + +namespace app { + +Input::Input() +: down(0) +, pressed(0) +, released(0) { + +} + + +void Input::HandleKeyboardEvent(const SDL_KeyboardEvent &e) { + map::const_iterator key(mapping.find(e.keysym.sym)); + if (key == mapping.end()) return; + + Button button(key->second); + if (e.state == SDL_PRESSED) { + down |= button; + pressed |= button; + } else { + down &= ~button; + released |= button; + } +} + +} diff --git a/src/app/Input.h b/src/app/Input.h new file mode 100644 index 0000000..ad50869 --- /dev/null +++ b/src/app/Input.h @@ -0,0 +1,70 @@ +/* + * Input.h + * + * Created on: Aug 6, 2012 + * Author: holy + */ + +#ifndef APP_INPUT_H_ +#define APP_INPUT_H_ + +#include +#include + +namespace app { + +class Input { + +public: + enum Button { + PAD_UP = 1, + PAD_RIGHT = 2, + PAD_DOWN = 4, + PAD_LEFT = 8, + ACTION_A = 16, + ACTION_B = 32, + ACTION_X = 64, + ACTION_Y = 128, + START = 256, + SELECT = 512, + SHOULDER_RIGHT = 1024, + SHOULDER_LEFT = 2048 + }; + +public: + Input(); + +public: + bool IsDown(Button b) const { + return down & b; + } + bool JustPressed(Button b) const { + return pressed & b; + } + bool JustReleased(Button b) const { + return released & b; + } + +public: + void ResetInteractiveState() { + pressed = 0; + released = 0; + } + void HandleKeyboardEvent(const SDL_KeyboardEvent &); + +public: + void MapKey(SDLKey k, Button b) { + mapping[k] = b; + } + +private: + std::map mapping; + Uint16 down; + Uint16 pressed; + Uint16 released; + +}; + +} + +#endif /* APP_INPUT_H_ */ diff --git a/src/app/State.h b/src/app/State.h index efee32b..7f46c57 100644 --- a/src/app/State.h +++ b/src/app/State.h @@ -13,6 +13,7 @@ namespace app { class Application; +class Input; class State { @@ -28,7 +29,7 @@ public: /// adapt the state's graphics to given dimensions virtual void Resize(int width, int height) = 0; - virtual void HandleEvent(const SDL_Event &) = 0; + virtual void HandleInput(const Input &) = 0; virtual void UpdateWorld(float deltaT) = 0; virtual void Render(SDL_Surface *) = 0; diff --git a/src/battle/BattleState.cpp b/src/battle/BattleState.cpp index c31786e..9f1acac 100644 --- a/src/battle/BattleState.cpp +++ b/src/battle/BattleState.cpp @@ -8,12 +8,15 @@ #include "BattleState.h" #include "PartyLayout.h" +#include "../app/Application.h" +#include "../app/Input.h" #include "../geometry/operators.h" #include "../graphics/Sprite.h" #include using app::Application; +using app::Input; using geometry::Point; using geometry::Vector; @@ -51,7 +54,7 @@ void BattleState::ExitState() { } -void BattleState::HandleEvent(const SDL_Event &) { +void BattleState::HandleInput(const Input &input) { } diff --git a/src/battle/BattleState.h b/src/battle/BattleState.h index 67e0b78..397e5e3 100644 --- a/src/battle/BattleState.h +++ b/src/battle/BattleState.h @@ -17,6 +17,8 @@ #include #include +namespace app { class Input; } + namespace battle { class PartyLayout; @@ -40,7 +42,7 @@ public: virtual void Resize(int width, int height); - virtual void HandleEvent(const SDL_Event &); + virtual void HandleInput(const app::Input &); virtual void UpdateWorld(float deltaT); virtual void Render(SDL_Surface *); diff --git a/src/main.cpp b/src/main.cpp index 3ec9945..6bce28f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,6 +6,7 @@ */ #include "app/Application.h" +#include "app/Input.h" #include "battle/BattleState.h" #include "battle/Hero.h" #include "battle/Monster.h" @@ -19,6 +20,7 @@ #include using app::Application; +using app::Input; using battle::BattleState; using battle::Hero; using battle::Monster; @@ -78,6 +80,18 @@ int main(int argc, char **argv) { battleState->AddHero(hero); battleState->AddHero(hero); Application app(&screen, battleState); + app.Buttons().MapKey(SDLK_w, Input::PAD_UP); + app.Buttons().MapKey(SDLK_d, Input::PAD_RIGHT); + app.Buttons().MapKey(SDLK_s, Input::PAD_DOWN); + app.Buttons().MapKey(SDLK_a, Input::PAD_LEFT); + app.Buttons().MapKey(SDLK_RIGHT, Input::ACTION_A); + app.Buttons().MapKey(SDLK_DOWN, Input::ACTION_B); + app.Buttons().MapKey(SDLK_UP, Input::ACTION_X); + app.Buttons().MapKey(SDLK_LEFT, Input::ACTION_Y); + app.Buttons().MapKey(SDLK_RETURN, Input::START); + app.Buttons().MapKey(SDLK_SPACE, Input::SELECT); + app.Buttons().MapKey(SDLK_RSHIFT, Input::SHOULDER_RIGHT); + app.Buttons().MapKey(SDLK_LSHIFT, Input::SHOULDER_LEFT); app.Run(); return 0; -- 2.39.2