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/main.c | 11 ++++- src/sdl/graphics.c | 8 +++- src/sdl/input.c | 127 +++++++++++++++++++++++++++++++++++++++++++++++------ src/sdl/input.h | 1 + src/sdl/system.c | 14 +++++- 5 files changed, 145 insertions(+), 16 deletions(-) diff --git a/src/main.c b/src/main.c index 2e9fffc..475ba5c 100644 --- a/src/main.c +++ b/src/main.c @@ -45,6 +45,7 @@ int main(int argc, char **argv) wantFullscreen = 0; #endif screenScale = 2; + useJoystick = 1; // get command line arguments for (int i=1; ijaxis.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); } diff --git a/src/sdl/input.h b/src/sdl/input.h index ec627f6..b5c6507 100644 --- a/src/sdl/input.h +++ b/src/sdl/input.h @@ -15,6 +15,7 @@ extern Button btnL, btnR; extern Button btnStart, btnSelect; extern Button btnAccept, btnDecline; extern int axisX, axisY; +extern int useJoystick; void PHL_ScanInput(); diff --git a/src/sdl/system.c b/src/sdl/system.c index 7e27d05..610685d 100644 --- a/src/sdl/system.c +++ b/src/sdl/system.c @@ -5,6 +5,9 @@ char quitGame = 0; void Input_KeyEvent(SDL_Event* evt); +void Input_JoyEvent(SDL_Event* evt); +void Input_JoyAxisEvent(SDL_Event* evt); +void Input_JoyHatEvent(SDL_Event* evt); int PHL_MainLoop() { @@ -19,7 +22,16 @@ int PHL_MainLoop() case SDL_KEYUP: Input_KeyEvent(&evt); break; - //TODO: joystick... + case SDL_JOYAXISMOTION: + Input_JoyAxisEvent(&evt); + break; + case SDL_JOYHATMOTION: + Input_JoyHatEvent(&evt); + break; + case SDL_JOYBUTTONDOWN: + case SDL_JOYBUTTONUP: + Input_JoyEvent(&evt); + break; } } if (quitGame == 1) -- cgit v1.2.3