Experimental: Added time based debouncing to GamepadChecker

This commit is contained in:
2023-01-19 23:18:52 -06:00
parent 4f519af193
commit c49736d59c

View File

@@ -9,38 +9,44 @@ public class GamepadChecker {
private final CyberarmEngine engine; private final CyberarmEngine engine;
private final Gamepad gamepad; private final Gamepad gamepad;
private final HashMap<String, Boolean> buttons = new HashMap<>(); private final HashMap<String, Boolean> buttons = new HashMap<>();
private final HashMap<String, Long> buttonsDebounceInterval = new HashMap<>();
private final long debounceTime = 50L; // ms
public GamepadChecker(CyberarmEngine engine, Gamepad gamepad) { public GamepadChecker(CyberarmEngine engine, Gamepad gamepad) {
this.engine = engine; this.engine = engine;
this.gamepad = gamepad; this.gamepad = gamepad;
buttons.put("a", false); buttons.put("a", false); buttonsDebounceInterval.put("a", 0L);
buttons.put("b", false); buttons.put("b", false); buttonsDebounceInterval.put("b", 0L);
buttons.put("x", false); buttons.put("x", false); buttonsDebounceInterval.put("x", 0L);
buttons.put("y", false); buttons.put("y", false); buttonsDebounceInterval.put("y", 0L);
buttons.put("start", false); buttons.put("start", false); buttonsDebounceInterval.put("start", 0L);
buttons.put("guide", false); buttons.put("guide", false); buttonsDebounceInterval.put("guide", 0L);
buttons.put("back", false); buttons.put("back", false); buttonsDebounceInterval.put("back", 0L);
buttons.put("left_bumper", false); buttons.put("left_bumper", false); buttonsDebounceInterval.put("left_bumper", 0L);
buttons.put("right_bumper", false); buttons.put("right_bumper", false); buttonsDebounceInterval.put("right_bumper", 0L);
buttons.put("left_stick_button", false); buttons.put("left_stick_button", false); buttonsDebounceInterval.put("left_stick_button", 0L);
buttons.put("right_stick_button", false); buttons.put("right_stick_button", false); buttonsDebounceInterval.put("right_stick_button", 0L);
buttons.put("dpad_left", false); buttons.put("dpad_left", false); buttonsDebounceInterval.put("dpad_left", 0L);
buttons.put("dpad_right", false); buttons.put("dpad_right", false); buttonsDebounceInterval.put("dpad_right", 0L);
buttons.put("dpad_up", false); buttons.put("dpad_up", false); buttonsDebounceInterval.put("dpad_up", 0L);
buttons.put("dpad_down", false); buttons.put("dpad_down", false); buttonsDebounceInterval.put("dpad_down", 0L);
} }
public void update() { public void update() {
long milliseconds = System.currentTimeMillis();
for (String btn : buttons.keySet()) { for (String btn : buttons.keySet()) {
try { try {
Field field = gamepad.getClass().getDeclaredField(btn); Field field = gamepad.getClass().getDeclaredField(btn);
boolean button = field.getBoolean(gamepad);
if (field.getBoolean(gamepad)) { if (button != buttons.get(btn) && milliseconds - buttonsDebounceInterval.get(btn) >= debounceTime) {
if (button) {
if (!buttons.get(btn)) { if (!buttons.get(btn)) {
engine.buttonDown(gamepad, btn); engine.buttonDown(gamepad, btn);
} }
@@ -53,6 +59,9 @@ public class GamepadChecker {
buttons.put(btn, false); buttons.put(btn, false);
} }
} else if (button == buttons.get(btn)) {
buttonsDebounceInterval.put(btn, milliseconds);
}
} catch (NoSuchFieldException|IllegalAccessException e) { } catch (NoSuchFieldException|IllegalAccessException e) {
e.printStackTrace(); e.printStackTrace();
} }