0
0
mirror of https://github.com/Nimac0/SDL_Minigame synced 2026-01-12 21:23:41 +00:00

mod: changed InputManager to account for multiple bindings for one action

This commit is contained in:
ezveee 2025-01-16 16:17:36 +01:00
parent 9c3185c6d8
commit b6cba94323
3 changed files with 20 additions and 32 deletions

View File

@ -96,27 +96,23 @@ public:
GRAVE GRAVE
}; };
struct InputAction {
std::string name;
std::vector<Key> bindings;
std::function<void()> callback;
};
InputManager(); InputManager();
~InputManager(); ~InputManager();
void init(); // see if necessary void init(); // see if necessary
void processEvents(); void processEvents();
void registerAction(const std::string& actionName, EventType eventType, Key key, std::function<void()> callback); void registerAction(const std::string& actionName, const std::vector<Key>& keys, std::function<void()> callback);
bool isKeyPressed(Key key);
private: private:
std::vector<InputAction> actions;
std::map<Key, SDL_Scancode> keyMap; std::map<Key, SDL_Scancode> keyMap;
std::map<EventType, SDL_EventType> eventMap;
struct ActionBinding {
std::string actionName; // not strictly necessary, but good for debugging purposes
EventType eventType;
Key key;
std::function<void()> callback;
};
std::vector<ActionBinding> actionBindings;
void initKeyMap(); void initKeyMap();
void initEventMap();
void handleEvent(const SDL_Event& event); void handleEvent(const SDL_Event& event);
}; };

View File

@ -3,7 +3,6 @@
InputManager::InputManager() { InputManager::InputManager() {
initKeyMap(); initKeyMap();
initEventMap();
} }
InputManager::~InputManager() { InputManager::~InputManager() {
@ -101,34 +100,27 @@ void InputManager::initKeyMap() {
}; };
} }
void InputManager::initEventMap() { void InputManager::registerAction(const std::string& actionName, const std::vector<Key>& keys, std::function<void()> callback) {
eventMap = { actions.push_back({actionName, keys, callback});
{EventType::KeyDown, SDL_EVENT_KEY_DOWN},
{EventType::KeyUp, SDL_EVENT_KEY_UP},
};
}
void InputManager::registerAction(const std::string& actionName, EventType eventType, Key key, std::function<void()> callback) {
actionBindings.push_back({actionName, eventType, key, callback});
}
bool InputManager::isKeyPressed(Key key) {
const bool* state = SDL_GetKeyboardState(nullptr);
auto sdlKey = keyMap[key];
return state[sdlKey];
} }
void InputManager::processEvents() { void InputManager::processEvents() {
SDL_Event event; SDL_Event event;
while (SDL_PollEvent(&event)) { while (SDL_PollEvent(&event)) {
std::cout << "Event detected: " << event.type << std::endl;
handleEvent(event); handleEvent(event);
} }
} }
void InputManager::handleEvent(const SDL_Event& event) { void InputManager::handleEvent(const SDL_Event& event) {
for (const auto& binding : actionBindings) { if (event.type != SDL_EVENT_KEY_DOWN) return; // TODO: add other events if necessary
if (event.type == eventMap[binding.eventType] && event.key.scancode == keyMap[binding.key]) {
binding.callback(); for (const auto& action : actions) {
for (const auto& binding : action.bindings) {
if (event.key.scancode == keyMap[binding]) {
std::cout << "Action triggered: " << action.name << std::endl;
action.callback();
}
} }
} }
} }

View File

@ -27,7 +27,7 @@ SDL_AppResult SDL_AppIterate(void *appstate) {
return SDL_APP_SUCCESS; return SDL_APP_SUCCESS;
} }
vego::game->handleEvents(); // bad //vego::game->handleEvents(); // bad
Uint64 frameStart = SDL_GetTicks(); Uint64 frameStart = SDL_GetTicks();