mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-16 11:06:06 -04:00
Gamepad: Buttons can now be held down to periodically trigger them every second
This commit is contained in:
parent
7a7dcec05f
commit
e5ef11d6bb
@ -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;
|
||||
|
@ -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) {
|
||||
|
22
src/Input.c
22
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---------------------------------------------------------*
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user