X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcontrol%2Fgame_controller_manager.cpp;h=6680c0411b9566d472a33a51d971eebb4d1ff069;hb=9f40a73e89c17a2862a1213343589c19eff42199;hp=bb8b5678acac1861ce4fd2d43661721c16d8aa4a;hpb=1da433ffd19f98acd8475c4e449de761440d99f8;p=supertux.git diff --git a/src/control/game_controller_manager.cpp b/src/control/game_controller_manager.cpp index bb8b5678a..6680c0411 100644 --- a/src/control/game_controller_manager.cpp +++ b/src/control/game_controller_manager.cpp @@ -1,5 +1,5 @@ // SuperTux -// Copyright (C) 2014 Ingo Ruhnke +// Copyright (C) 2014 Ingo Ruhnke // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -24,7 +24,9 @@ GameControllerManager::GameControllerManager(InputManager* parent) : m_parent(parent), m_deadzone(8000), - m_game_controllers() + m_game_controllers(), + m_stick_state(), + m_button_state() { } @@ -41,33 +43,39 @@ GameControllerManager::process_button_event(const SDL_ControllerButtonEvent& ev) { //log_info << "button event: " << static_cast(ev.button) << " " << static_cast(ev.state) << std::endl; auto controller = m_parent->get_controller(); + auto set_control = [this, &controller](Controller::Control control, bool value) + { + m_button_state[control] = value; + controller->set_control(control, m_button_state[control] || m_stick_state[control]); + }; switch(ev.button) { case SDL_CONTROLLER_BUTTON_A: - controller->set_control(Controller::JUMP, ev.state); - controller->set_control(Controller::MENU_SELECT, ev.state); + set_control(Controller::JUMP, ev.state); + set_control(Controller::MENU_SELECT, ev.state); break; case SDL_CONTROLLER_BUTTON_B: - controller->set_control(Controller::MENU_BACK, ev.state); + set_control(Controller::MENU_BACK, ev.state); break; case SDL_CONTROLLER_BUTTON_X: - controller->set_control(Controller::ACTION, ev.state); + set_control(Controller::ACTION, ev.state); break; case SDL_CONTROLLER_BUTTON_Y: break; case SDL_CONTROLLER_BUTTON_BACK: + set_control(Controller::CONSOLE, ev.state); break; case SDL_CONTROLLER_BUTTON_GUIDE: - controller->set_control(Controller::CONSOLE, ev.state); + set_control(Controller::CHEAT_MENU, ev.state); break; case SDL_CONTROLLER_BUTTON_START: - controller->set_control(Controller::PAUSE_MENU, ev.state); + set_control(Controller::START, ev.state); break; case SDL_CONTROLLER_BUTTON_LEFTSTICK: @@ -77,27 +85,27 @@ GameControllerManager::process_button_event(const SDL_ControllerButtonEvent& ev) break; case SDL_CONTROLLER_BUTTON_LEFTSHOULDER: - controller->set_control(Controller::PEEK_LEFT, ev.state); + set_control(Controller::PEEK_LEFT, ev.state); break; case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER: - controller->set_control(Controller::PEEK_RIGHT, ev.state); + set_control(Controller::PEEK_RIGHT, ev.state); break; case SDL_CONTROLLER_BUTTON_DPAD_UP: - controller->set_control(Controller::UP, ev.state); + set_control(Controller::UP, ev.state); break; case SDL_CONTROLLER_BUTTON_DPAD_DOWN: - controller->set_control(Controller::DOWN, ev.state); + set_control(Controller::DOWN, ev.state); break; case SDL_CONTROLLER_BUTTON_DPAD_LEFT: - controller->set_control(Controller::LEFT, ev.state); + set_control(Controller::LEFT, ev.state); break; case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: - controller->set_control(Controller::RIGHT, ev.state); + set_control(Controller::RIGHT, ev.state); break; default: @@ -113,23 +121,29 @@ GameControllerManager::process_axis_event(const SDL_ControllerAxisEvent& ev) //log_info << "axis event: " << static_cast(ev.axis) << " " << ev.value << std::endl; auto controller = m_parent->get_controller(); - auto axis2button = [this, &controller](int value, + auto set_control = [this, &controller](Controller::Control control, bool value) + { + m_stick_state[control] = value; + controller->set_control(control, m_button_state[control] || m_stick_state[control]); + }; + + auto axis2button = [this, &set_control](int value, Controller::Control control_left, Controller::Control control_right) { if (value < -m_deadzone) { - controller->set_control(control_left, true); - controller->set_control(control_right, false); + set_control(control_left, true); + set_control(control_right, false); } else if (value > m_deadzone) { - controller->set_control(control_left, false); - controller->set_control(control_right, true); + set_control(control_left, false); + set_control(control_right, true); } else { - controller->set_control(control_left, false); - controller->set_control(control_right, false); + set_control(control_left, false); + set_control(control_right, false); } };