mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-17 11:35:08 -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 cc_bool sounds_loaded;
|
||||||
static void Sounds_Start(void) {
|
static void Sounds_Start(void) {
|
||||||
int i;
|
|
||||||
if (!AudioBackend_Init()) {
|
if (!AudioBackend_Init()) {
|
||||||
AudioBackend_Free();
|
AudioBackend_Free();
|
||||||
Audio_SoundsVolume = 0;
|
Audio_SoundsVolume = 0;
|
||||||
|
@ -637,7 +637,9 @@ static void Game_RenderFrame(double delta) {
|
|||||||
Game.Time += delta;
|
Game.Time += delta;
|
||||||
Game_Vertices = 0;
|
Game_Vertices = 0;
|
||||||
|
|
||||||
|
if (Input.Sources & INPUT_SOURCE_GAMEPAD) Gamepad_Tick(delta);
|
||||||
Camera.Active->UpdateMouse(delta);
|
Camera.Active->UpdateMouse(delta);
|
||||||
|
|
||||||
if (!Window_Main.Focused && !Gui.InputGrab) Gui_ShowPauseMenu();
|
if (!Window_Main.Focused && !Gui.InputGrab) Gui_ShowPauseMenu();
|
||||||
|
|
||||||
if (KeyBind_IsPressed(KEYBIND_ZOOM_SCROLL) && !Gui.InputGrab) {
|
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---------------------------------------------------------*
|
*---------------------------------------------------------Gamepad---------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
|
#define GAMEPAD_BEG_BTN CCPAD_A
|
||||||
|
static float pad_holdtime[INPUT_COUNT - GAMEPAD_BEG_BTN];
|
||||||
|
|
||||||
void Gamepad_SetButton(int btn, int pressed) {
|
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);
|
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---------------------------------------------------------*
|
*---------------------------------------------------------Hotkeys---------------------------------------------------------*
|
||||||
|
@ -194,6 +194,7 @@ enum PAD_AXIS { PAD_AXIS_LEFT, PAD_AXIS_RIGHT };
|
|||||||
void Gamepad_SetButton(int btn, int pressed);
|
void Gamepad_SetButton(int btn, int pressed);
|
||||||
/* Sets value of the given axis */
|
/* Sets value of the given axis */
|
||||||
void Gamepad_SetAxis(int axis, float x, float y, double delta);
|
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 */
|
/* 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 void ProcessTouchInput(int mods) {
|
||||||
static int currX, currY; // current touch position
|
|
||||||
touchPosition touch;
|
touchPosition touch;
|
||||||
hidTouchRead(&touch);
|
hidTouchRead(&touch);
|
||||||
|
|
||||||
if (hidKeysDown() & KEY_TOUCH) { // stylus went down
|
if (mods & KEY_TOUCH) {
|
||||||
currX = touch.px;
|
Input_AddTouch(0, touch.px, touch.py);
|
||||||
currY = touch.py;
|
} else if (hidKeysUp() & KEY_TOUCH) {
|
||||||
Input_AddTouch(0, currX, currY);
|
Input_RemoveTouch(0, Pointers[0].x, Pointers[0].y);
|
||||||
} 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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,7 +202,7 @@ static void HandleController(cont_state_t* state, double delta) {
|
|||||||
Gamepad_SetButton(CCPAD_R, state->rtrig > 10);
|
Gamepad_SetButton(CCPAD_R, state->rtrig > 10);
|
||||||
// TODO CONT_Z, joysticks
|
// TODO CONT_Z, joysticks
|
||||||
// TODO: verify values are right
|
// 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) {
|
static void ProcessControllerInput(double delta) {
|
||||||
|
@ -115,23 +115,15 @@ static void HandleButtons(int mods) {
|
|||||||
Gamepad_SetButton(CCPAD_DOWN, mods & KEY_DOWN);
|
Gamepad_SetButton(CCPAD_DOWN, mods & KEY_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copied from Window_3DS.c
|
|
||||||
static void ProcessTouchInput(int mods) {
|
static void ProcessTouchInput(int mods) {
|
||||||
static int curX, curY; // current touch position
|
|
||||||
touchPosition touch;
|
touchPosition touch;
|
||||||
touchRead(&touch);
|
touchRead(&touch);
|
||||||
Camera.Sensitivity = 100; // TODO not hardcode this
|
Camera.Sensitivity = 100; // TODO not hardcode this
|
||||||
|
|
||||||
if (keysDown() & KEY_TOUCH) { // stylus went down
|
if (mods & KEY_TOUCH) {
|
||||||
curX = touch.px;
|
Input_AddTouch(0, touch.px, touch.py);
|
||||||
curY = touch.py;
|
} else if (keysUp() & KEY_TOUCH) {
|
||||||
Input_AddTouch(0, curX, curY);
|
Input_RemoveTouch(0, Pointers[0].x, Pointers[0].y);
|
||||||
} 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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -272,8 +272,8 @@ static void HandleJoystick(int axis, int x, int y, double delta) {
|
|||||||
|
|
||||||
static void ProcessPadInput(double delta, padData* pad) {
|
static void ProcessPadInput(double delta, padData* pad) {
|
||||||
HandleButtons(pad);
|
HandleButtons(pad);
|
||||||
HandleJoystick(AXIS_PAD_LEFT, pad->ANA_L_H - 0x80, pad->ANA_L_V - 0x80, delta);
|
HandleJoystick(PAD_AXIS_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_RIGHT, pad->ANA_R_H - 0x80, pad->ANA_R_V - 0x80, delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window_ProcessEvents(double 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->x) <= 16) pos->x = 0;
|
||||||
if (Math_AbsI(pos->y) <= 16) pos->y = 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 void ProcessTouchInput(void) {
|
||||||
static int currX, currY, prev_touchcount=0;
|
static int prev_touchcount = 0;
|
||||||
HidTouchScreenState state={0};
|
HidTouchScreenState state = {0};
|
||||||
hidGetTouchScreenStates(&state, 1);
|
hidGetTouchScreenStates(&state, 1);
|
||||||
|
|
||||||
if (state.count && !prev_touchcount) { // stylus went down
|
if (state.count) {
|
||||||
currX = state.touches[0].x;
|
Input_AddTouch(0, state.touches[0].x, state.touches[0].y);
|
||||||
currY = state.touches[0].y;
|
} else if (prev_touchcount) {
|
||||||
Input_AddTouch(0, currX, currY);
|
Input_RemoveTouch(0, Pointers[0].x, Pointers[0].y);
|
||||||
} 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
prev_touchcount = state.count;
|
prev_touchcount = state.count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,18 +43,18 @@ static void RegrabMouse(void) {
|
|||||||
CentreMousePosition();
|
CentreMousePosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DefaultEnableRawMouse(void) {
|
static CC_INLINE void DefaultEnableRawMouse(void) {
|
||||||
Input.RawMode = true;
|
Input.RawMode = true;
|
||||||
RegrabMouse();
|
RegrabMouse();
|
||||||
Cursor_SetVisible(false);
|
Cursor_SetVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DefaultUpdateRawMouse(void) {
|
static CC_INLINE void DefaultUpdateRawMouse(void) {
|
||||||
MoveRawUsingCursorDelta();
|
MoveRawUsingCursorDelta();
|
||||||
CentreMousePosition();
|
CentreMousePosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DefaultDisableRawMouse(void) {
|
static CC_INLINE void DefaultDisableRawMouse(void) {
|
||||||
Input.RawMode = false;
|
Input.RawMode = false;
|
||||||
RegrabMouse();
|
RegrabMouse();
|
||||||
Cursor_SetVisible(true);
|
Cursor_SetVisible(true);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user