From e5ef11d6bb05fb72f3b13de8504427a65e3c596e Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Mon, 1 Apr 2024 10:29:36 +1100 Subject: [PATCH] Gamepad: Buttons can now be held down to periodically trigger them every second --- src/Audio.c | 1 - src/Game.c | 2 ++ src/Input.c | 22 ++++++++++++++++++++++ src/Input.h | 1 + src/Window_3DS.c | 15 ++++----------- src/Window_Dreamcast.c | 2 +- src/Window_NDS.c | 16 ++++------------ src/Window_PS3.c | 4 ++-- src/Window_Switch.c | 21 +++++++-------------- src/_WindowBase.h | 6 +++--- 10 files changed, 46 insertions(+), 44 deletions(-) diff --git a/src/Audio.c b/src/Audio.c index 407492f46..3c3a042d8 100644 --- a/src/Audio.c +++ b/src/Audio.c @@ -269,7 +269,6 @@ static void InitWebSounds(void) { static cc_bool sounds_loaded; static void Sounds_Start(void) { - int i; if (!AudioBackend_Init()) { AudioBackend_Free(); Audio_SoundsVolume = 0; diff --git a/src/Game.c b/src/Game.c index e813b4b6e..9e271cbdb 100644 --- a/src/Game.c +++ b/src/Game.c @@ -637,7 +637,9 @@ static void Game_RenderFrame(double delta) { Game.Time += delta; Game_Vertices = 0; + if (Input.Sources & INPUT_SOURCE_GAMEPAD) Gamepad_Tick(delta); Camera.Active->UpdateMouse(delta); + if (!Window_Main.Focused && !Gui.InputGrab) Gui_ShowPauseMenu(); if (KeyBind_IsPressed(KEYBIND_ZOOM_SCROLL) && !Gui.InputGrab) { diff --git a/src/Input.c b/src/Input.c index 122b0abd5..fd4589c0d 100644 --- a/src/Input.c +++ b/src/Input.c @@ -417,7 +417,13 @@ static void KeyBind_Init(void) { /*########################################################################################################################* *---------------------------------------------------------Gamepad---------------------------------------------------------* *#########################################################################################################################*/ +#define GAMEPAD_BEG_BTN CCPAD_A +static float pad_holdtime[INPUT_COUNT - GAMEPAD_BEG_BTN]; + void Gamepad_SetButton(int btn, int pressed) { + /* Reset hold tracking time */ + if (pressed && !Input.Pressed[btn]) pad_holdtime[btn - GAMEPAD_BEG_BTN] = 0; + Input_SetNonRepeatable(btn, pressed); } @@ -443,6 +449,22 @@ void Gamepad_SetAxis(int axis, float x, float y, double delta) { } } +void Gamepad_Tick(double delta) { + int btn; + Platform_LogConst("GAMEPAD TICK"); + + for (btn = GAMEPAD_BEG_BTN; btn < INPUT_COUNT; btn++) + { + if (!Input.Pressed[btn]) continue; + pad_holdtime[btn - GAMEPAD_BEG_BTN] += delta; + if (pad_holdtime[btn - GAMEPAD_BEG_BTN] < 1.0) continue; + + /* Held for a second, trigger a fake press */ + pad_holdtime[btn - GAMEPAD_BEG_BTN] = 0; + Input_SetPressed(btn); + } +} + /*########################################################################################################################* *---------------------------------------------------------Hotkeys---------------------------------------------------------* diff --git a/src/Input.h b/src/Input.h index 320b149a8..40294afb3 100644 --- a/src/Input.h +++ b/src/Input.h @@ -194,6 +194,7 @@ enum PAD_AXIS { PAD_AXIS_LEFT, PAD_AXIS_RIGHT }; void Gamepad_SetButton(int btn, int pressed); /* Sets value of the given axis */ void Gamepad_SetAxis(int axis, float x, float y, double delta); +void Gamepad_Tick(double delta); /* whether to leave text input open for user to enter further input */ diff --git a/src/Window_3DS.c b/src/Window_3DS.c index 1003e237d..9377730e6 100644 --- a/src/Window_3DS.c +++ b/src/Window_3DS.c @@ -120,20 +120,13 @@ static void ProcessJoystickInput(circlePosition* pos, double delta) { } static void ProcessTouchInput(int mods) { - static int currX, currY; // current touch position touchPosition touch; hidTouchRead(&touch); - if (hidKeysDown() & KEY_TOUCH) { // stylus went down - currX = touch.px; - currY = touch.py; - Input_AddTouch(0, currX, currY); - } else if (mods & KEY_TOUCH) { // stylus is down - currX = touch.px; - currY = touch.py; - Input_UpdateTouch(0, currX, currY); - } else if (hidKeysUp() & KEY_TOUCH) { // stylus was lifted - Input_RemoveTouch(0, currX, currY); + if (mods & KEY_TOUCH) { + Input_AddTouch(0, touch.px, touch.py); + } else if (hidKeysUp() & KEY_TOUCH) { + Input_RemoveTouch(0, Pointers[0].x, Pointers[0].y); } } diff --git a/src/Window_Dreamcast.c b/src/Window_Dreamcast.c index 69bca1923..1bbd514e0 100644 --- a/src/Window_Dreamcast.c +++ b/src/Window_Dreamcast.c @@ -202,7 +202,7 @@ static void HandleController(cont_state_t* state, double delta) { Gamepad_SetButton(CCPAD_R, state->rtrig > 10); // TODO CONT_Z, joysticks // TODO: verify values are right - HandleJoystick(GAMEPAD_AXIS_RIGHT, state->joyx, state->joyy, delta); + HandleJoystick(PAD_AXIS_RIGHT, state->joyx, state->joyy, delta); } static void ProcessControllerInput(double delta) { diff --git a/src/Window_NDS.c b/src/Window_NDS.c index d18a6bc85..5e86ab064 100644 --- a/src/Window_NDS.c +++ b/src/Window_NDS.c @@ -115,23 +115,15 @@ static void HandleButtons(int mods) { Gamepad_SetButton(CCPAD_DOWN, mods & KEY_DOWN); } -// Copied from Window_3DS.c static void ProcessTouchInput(int mods) { - static int curX, curY; // current touch position touchPosition touch; touchRead(&touch); Camera.Sensitivity = 100; // TODO not hardcode this - if (keysDown() & KEY_TOUCH) { // stylus went down - curX = touch.px; - curY = touch.py; - Input_AddTouch(0, curX, curY); - } else if (mods & KEY_TOUCH) { // stylus is down - curX = touch.px; - curY = touch.py; - Input_UpdateTouch(0, curX, curY); - } else if (keysUp() & KEY_TOUCH) { // stylus was lifted - Input_RemoveTouch(0, curX, curY); + if (mods & KEY_TOUCH) { + Input_AddTouch(0, touch.px, touch.py); + } else if (keysUp() & KEY_TOUCH) { + Input_RemoveTouch(0, Pointers[0].x, Pointers[0].y); } } diff --git a/src/Window_PS3.c b/src/Window_PS3.c index e500350dc..bc352e5cf 100644 --- a/src/Window_PS3.c +++ b/src/Window_PS3.c @@ -272,8 +272,8 @@ static void HandleJoystick(int axis, int x, int y, double delta) { static void ProcessPadInput(double delta, padData* pad) { HandleButtons(pad); - HandleJoystick(AXIS_PAD_LEFT, pad->ANA_L_H - 0x80, pad->ANA_L_V - 0x80, delta); - HandleJoystick(AXIS_PAD_RIGHT, pad->ANA_R_H - 0x80, pad->ANA_R_V - 0x80, delta); + HandleJoystick(PAD_AXIS_LEFT, pad->ANA_L_H - 0x80, pad->ANA_L_V - 0x80, delta); + HandleJoystick(PAD_AXIS_RIGHT, pad->ANA_R_H - 0x80, pad->ANA_R_V - 0x80, delta); } void Window_ProcessEvents(double delta) { diff --git a/src/Window_Switch.c b/src/Window_Switch.c index 23195ff2b..265bc9793 100644 --- a/src/Window_Switch.c +++ b/src/Window_Switch.c @@ -131,26 +131,19 @@ static void ProcessJoystickInput(int axis, HidAnalogStickState* pos, double delt if (Math_AbsI(pos->x) <= 16) pos->x = 0; if (Math_AbsI(pos->y) <= 16) pos->y = 0; - Gamepad_SetAxis(axis, x / AXIS_SCALE, -y / AXIS_SCALE, delta); + Gamepad_SetAxis(axis, pos->x / AXIS_SCALE, -pos->y / AXIS_SCALE, delta); } static void ProcessTouchInput(void) { - static int currX, currY, prev_touchcount=0; - HidTouchScreenState state={0}; + static int prev_touchcount = 0; + HidTouchScreenState state = {0}; hidGetTouchScreenStates(&state, 1); - if (state.count && !prev_touchcount) { // stylus went down - currX = state.touches[0].x; - currY = state.touches[0].y; - Input_AddTouch(0, currX, currY); - } else if (state.count) { // stylus is down - currX = state.touches[0].x; - currY = state.touches[0].y; - Input_UpdateTouch(0, currX, currY); - } else if (!state.count && prev_touchcount) { // stylus was lifted - Input_RemoveTouch(0, currX, currY); + if (state.count) { + Input_AddTouch(0, state.touches[0].x, state.touches[0].y); + } else if (prev_touchcount) { + Input_RemoveTouch(0, Pointers[0].x, Pointers[0].y); } - prev_touchcount = state.count; } diff --git a/src/_WindowBase.h b/src/_WindowBase.h index 81011c01f..02fcec3ed 100644 --- a/src/_WindowBase.h +++ b/src/_WindowBase.h @@ -43,18 +43,18 @@ static void RegrabMouse(void) { CentreMousePosition(); } -static void DefaultEnableRawMouse(void) { +static CC_INLINE void DefaultEnableRawMouse(void) { Input.RawMode = true; RegrabMouse(); Cursor_SetVisible(false); } -static void DefaultUpdateRawMouse(void) { +static CC_INLINE void DefaultUpdateRawMouse(void) { MoveRawUsingCursorDelta(); CentreMousePosition(); } -static void DefaultDisableRawMouse(void) { +static CC_INLINE void DefaultDisableRawMouse(void) { Input.RawMode = false; RegrabMouse(); Cursor_SetVisible(true);