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/graphics.c | 8 +++- src/sdl/input.c | 127 +++++++++++++++++++++++++++++++++++++++++++++++------ src/sdl/input.h | 1 + src/sdl/system.c | 14 +++++- 4 files changed, 135 insertions(+), 15 deletions(-) (limited to 'src/sdl') diff --git a/src/sdl/graphics.c b/src/sdl/graphics.c index b25d081..937fea6 100755 --- a/src/sdl/graphics.c +++ b/src/sdl/graphics.c @@ -13,6 +13,9 @@ int screenScale = 2; static uint32_t tframe; +extern void Input_InitJoystick(); +extern void Input_CloseJoystick(); + SDL_Color PHL_NewRGB(uint8_t r, uint8_t g, uint8_t b) { SDL_Color ret = {.r = r, .b = b, .g = g}; @@ -21,13 +24,15 @@ SDL_Color PHL_NewRGB(uint8_t r, uint8_t g, uint8_t b) void PHL_GraphicsInit() { - if ( SDL_Init(SDL_INIT_VIDEO) < 0) { + if ( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK ) < 0) { fprintf(stderr, "Error"); SDL_Delay(5000); exit(EXIT_FAILURE); } SDL_ShowCursor(SDL_DISABLE); + + Input_InitJoystick(); uint32_t flags = SDL_HWSURFACE|SDL_DOUBLEBUF; if(wantFullscreen) @@ -40,6 +45,7 @@ void PHL_GraphicsInit() void PHL_GraphicsExit() { + Input_CloseJoystick(); SDL_FreeSurface(backbuffer); SDL_Quit(); } 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); } 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