From b8de876ec0175eaff41075bb5952ef9b09d4f438 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sat, 2 Dec 2017 12:26:09 +0100 Subject: Added Joystick support (only 1st joystick, better use a XBox360 type) --- src/sdl/input.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 114 insertions(+), 13 deletions(-) (limited to 'src/sdl/input.c') diff --git a/src/sdl/input.c b/src/sdl/input.c index c5f5a65..adba574 100644 --- a/src/sdl/input.c +++ b/src/sdl/input.c @@ -13,6 +13,34 @@ int bFaceUp = 0, bFaceDown = 0, bFaceLeft = 0, bFaceRight = 0; int bR = 0, bL = 0; int bStart = 0, bSelect = 0; int bAccept = 0, bDecline = 0; +int jUp = 0, jDown = 0, jLeft = 0, jRight = 0; +int jFaceUp = 0, jFaceDown = 0, jFaceLeft = 0, jFaceRight = 0; +int jR = 0, jL = 0; +int jStart = 0, jSelect = 0; +int jAccept = 0, jDecline = 0; + +SDL_Joystick *joy1 = NULL; + +int useJoystick = 1; + +void Input_InitJoystick() +{ + int n = SDL_NumJoysticks(); + if (n) { + joy1 = SDL_JoystickOpen(0); + SDL_JoystickEventState(SDL_ENABLE); + printf("Using %s\n", SDL_JoystickName(0)); + } else { + joy1 = NULL; + } +} + +void Input_CloseJoystick() +{ + if(joy1) + SDL_JoystickClose(joy1); + joy1 = NULL; +} void Input_KeyEvent(SDL_Event* evt) { @@ -45,6 +73,79 @@ void Input_KeyEvent(SDL_Event* evt) } } +void Input_JoyAxisEvent(SDL_Event* evt) { + if(evt->jaxis.which!=0) + return; + #define DEADZONE 32 + if(evt->jaxis.axis==0) { + int v = (evt->jaxis.value)/256; + if(v>-DEADZONE & vjaxis.axis==1) { + int v = (evt->jaxis.value)/256; + if(v>-DEADZONE & vjbutton.which!=0) + return; + int w = (evt->type==SDL_JOYBUTTONDOWN)?1:0; +/* XBox 360 based mapping here, + (would be better to switch to SDL2.0) + btn SDL1.2 SDL2.0 + --------------------------- + A 0 10 + B 1 11 + X 2 12 + Y 3 13 + Home N/A 14 + LB 4 8 + RB 5 9 + LT N/A N/A (axis) + RT N/A N/A (axis) + Select 6 5 + Start 7 4 + L3 9 6 + R3 10 7 + DPad Up N/A 0 + DPad Down N/A 1 + DPad Left N/A 2 + DPad Right N/A 3 +*/ + switch(evt->jbutton.button) + { + case 0: jFaceDown = w; break; + case 1: jFaceLeft = w; break; + case 2: jFaceRight = w; break; + case 3: jFaceUp = w; break; + case 4: jL = w; break; + case 5: jR = w; break; + case 6: jSelect = w; break; + case 7: jStart = w; break; + /*case 12:jUp = w; break; + case 13:jDown = w; break; + case 14:jLeft = w; break; + case 15:jRight = w; break;*/ + } +} + +void Input_JoyHatEvent(SDL_Event* evt) { + if(evt->jhat.which!=0) + return; + if(evt->jhat.hat!=0) + return; + int v=evt->jhat.value; + jUp = v&SDL_HAT_UP; + jDown = v&SDL_HAT_DOWN; + jLeft = v&SDL_HAT_LEFT; + jRight = v&SDL_HAT_RIGHT; +} + void updateKey(Button* btn, int state) { if (state) { @@ -68,21 +169,21 @@ void updateKey(Button* btn, int state) void PHL_ScanInput() { - updateKey(&btnUp, bUp); - updateKey(&btnDown, bDown); - updateKey(&btnLeft, bLeft); - updateKey(&btnRight, bRight); + updateKey(&btnUp, bUp|jUp|(axisY<0)); + updateKey(&btnDown, bDown|jDown|(axisY>0)); + updateKey(&btnLeft, bLeft|jLeft|(axisX<0)); + updateKey(&btnRight, bRight|jRight|(axisX>0)); - updateKey(&btnStart, bStart); - updateKey(&btnSelect, bSelect); + updateKey(&btnStart, bStart|jStart); + updateKey(&btnSelect, bSelect|jSelect); - updateKey(&btnL, bL); - updateKey(&btnR, bR); + updateKey(&btnL, bL|jL); + updateKey(&btnR, bR|jR); - updateKey(&btnFaceLeft, bFaceLeft); - updateKey(&btnFaceDown, bFaceDown); - updateKey(&btnFaceRight, bFaceRight); + updateKey(&btnFaceLeft, bFaceLeft|jFaceLeft); + updateKey(&btnFaceDown, bFaceDown|jFaceDown); + updateKey(&btnFaceRight, bFaceRight|jFaceRight); - updateKey(&btnAccept, bFaceLeft); - updateKey(&btnDecline, bFaceDown); + updateKey(&btnAccept, bFaceLeft|jFaceLeft); + updateKey(&btnDecline, bFaceDown|jFaceDown); } -- cgit v1.2.3