aboutsummaryrefslogtreecommitdiff
path: root/src/sdl/input.c
diff options
context:
space:
mode:
authorptitSeb2017-12-02 12:26:09 +0100
committerptitSeb2017-12-02 12:26:09 +0100
commitb8de876ec0175eaff41075bb5952ef9b09d4f438 (patch)
tree37715d7ba5f65a0ba5cf2524f656becd35f3ae1a /src/sdl/input.c
parent8b0a7091f58ee0b5ff68af9e4b14afc0ea6d6fe8 (diff)
downloadhydracastlelabyrinth-b8de876ec0175eaff41075bb5952ef9b09d4f438.tar.gz
hydracastlelabyrinth-b8de876ec0175eaff41075bb5952ef9b09d4f438.tar.bz2
hydracastlelabyrinth-b8de876ec0175eaff41075bb5952ef9b09d4f438.zip
Added Joystick support (only 1st joystick, better use a XBox360 type)
Diffstat (limited to 'src/sdl/input.c')
-rw-r--r--src/sdl/input.c127
1 files changed, 114 insertions, 13 deletions
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 & v<DEADZONE) axisX = 0;
+ else if(v<0) axisX = -1;
+ else axisX = +1;
+ }
+ if(evt->jaxis.axis==1) {
+ int v = (evt->jaxis.value)/256;
+ if(v>-DEADZONE & v<DEADZONE) axisY = 0;
+ else if(v<0) axisY = -1;
+ else axisY = +1;
+ }
+}
+
+void Input_JoyEvent(SDL_Event* evt) {
+ if(evt->jbutton.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);
}