input_interpreter: Fix button hold being interpreted incorrectly on init
We reset all the button states to 0 except the first index (which has all the buttons as pressed) to prevent a button hold being interpreted as a button that was pressed once on the first poll.
This commit is contained in:
		| @@ -12,7 +12,9 @@ InputInterpreter::InputInterpreter(Core::System& system) | |||||||
|     : npad{system.ServiceManager() |     : npad{system.ServiceManager() | ||||||
|                .GetService<Service::HID::Hid>("hid") |                .GetService<Service::HID::Hid>("hid") | ||||||
|                ->GetAppletResource() |                ->GetAppletResource() | ||||||
|                ->GetController<Service::HID::Controller_NPad>(Service::HID::HidController::NPad)} {} |                ->GetController<Service::HID::Controller_NPad>(Service::HID::HidController::NPad)} { | ||||||
|  |     ResetButtonStates(); | ||||||
|  | } | ||||||
|  |  | ||||||
| InputInterpreter::~InputInterpreter() = default; | InputInterpreter::~InputInterpreter() = default; | ||||||
|  |  | ||||||
| @@ -25,6 +27,17 @@ void InputInterpreter::PollInput() { | |||||||
|     button_states[current_index] = button_state; |     button_states[current_index] = button_state; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void InputInterpreter::ResetButtonStates() { | ||||||
|  |     previous_index = 0; | ||||||
|  |     current_index = 0; | ||||||
|  |  | ||||||
|  |     button_states[0] = 0xFFFFFFFF; | ||||||
|  |  | ||||||
|  |     for (std::size_t i = 1; i < button_states.size(); ++i) { | ||||||
|  |         button_states[i] = 0; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| bool InputInterpreter::IsButtonPressed(HIDButton button) const { | bool InputInterpreter::IsButtonPressed(HIDButton button) const { | ||||||
|     return (button_states[current_index] & (1U << static_cast<u8>(button))) != 0; |     return (button_states[current_index] & (1U << static_cast<u8>(button))) != 0; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -66,6 +66,9 @@ public: | |||||||
|     /// Gets a button state from HID and inserts it into the array of button states. |     /// Gets a button state from HID and inserts it into the array of button states. | ||||||
|     void PollInput(); |     void PollInput(); | ||||||
|  |  | ||||||
|  |     /// Resets all the button states to their defaults. | ||||||
|  |     void ResetButtonStates(); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Checks whether the button is pressed. |      * Checks whether the button is pressed. | ||||||
|      * |      * | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user