Gamepad: Buttons can now be held down to periodically trigger them every second

This commit is contained in:
UnknownShadow200 2024-04-01 10:29:36 +11:00
parent 7a7dcec05f
commit e5ef11d6bb
10 changed files with 46 additions and 44 deletions

View File

@ -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;

View File

@ -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) {

View File

@ -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---------------------------------------------------------*

View File

@ -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 */

View File

@ -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);
}
}

View File

@ -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) {

View File

@ -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);
}
}

View File

@ -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) {

View File

@ -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;
}

View File

@ -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);