diff options
author | kdx <kikoodx@paranoici.org> | 2023-07-10 20:18:37 +0200 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-07-10 20:19:51 +0200 |
commit | 53b5a8abe962701b894980c52cc045704cccb2c4 (patch) | |
tree | 59b29c34e6422eabcaec89da2c22900cca51fb0c | |
parent | a9617e017b78fe41f109dc4c943a53d914e30b79 (diff) | |
download | tzr-53b5a8abe962701b894980c52cc045704cccb2c4.tar.gz |
sticks
-rw-r--r-- | headers/TZR_globals.h | 2 | ||||
-rw-r--r-- | headers/TZR_joystick.h | 4 | ||||
-rw-r--r-- | headers/TZR_types.h | 11 | ||||
-rw-r--r-- | sources/TZR_CycleEvents.c | 20 | ||||
-rw-r--r-- | sources/TZR_JoystickLeftX.c | 14 | ||||
-rw-r--r-- | sources/TZR_JoystickLeftY.c | 14 | ||||
-rw-r--r-- | sources/TZR_JoystickRightX.c | 14 | ||||
-rw-r--r-- | sources/TZR_JoystickRightY.c | 14 | ||||
-rw-r--r-- | sources/TZR_PollEvent.c | 11 | ||||
-rw-r--r-- | sources/TZR_Quit.c | 4 | ||||
-rw-r--r-- | sources/globals.c | 2 |
11 files changed, 99 insertions, 11 deletions
diff --git a/headers/TZR_globals.h b/headers/TZR_globals.h index e63859b..3752577 100644 --- a/headers/TZR_globals.h +++ b/headers/TZR_globals.h @@ -25,6 +25,6 @@ extern float ___tzr_scale; extern int ___tzr_off_x; extern int ___tzr_off_y; extern Mix_Music *___tzr_music; -extern SDL_GameController **___tzr_joysticks; +extern TZR_Joystick *___tzr_joysticks; extern size_t ___tzr_joysticks_capacity; extern size_t ___tzr_joysticks_size; diff --git a/headers/TZR_joystick.h b/headers/TZR_joystick.h index 36a80e2..51e4279 100644 --- a/headers/TZR_joystick.h +++ b/headers/TZR_joystick.h @@ -7,3 +7,7 @@ bool TZR_JoystickDown(uint8_t button); bool TZR_JoystickUp(uint8_t button); bool TZR_JoystickReleased(uint8_t button); bool TZR_JoystickPressed(uint8_t button); +float TZR_JoystickLeftX(void); +float TZR_JoystickLeftY(void); +float TZR_JoystickRightX(void); +float TZR_JoystickRightY(void); diff --git a/headers/TZR_types.h b/headers/TZR_types.h index 2f0a2dc..5af1f17 100644 --- a/headers/TZR_types.h +++ b/headers/TZR_types.h @@ -2,6 +2,7 @@ #include <stdbool.h> #include <SDL2/SDL_render.h> #include <SDL2/SDL_mixer.h> +#include <SDL2/SDL_gamecontroller.h> enum TZR_ResourceType { TZR_RES_RAW, @@ -46,6 +47,7 @@ typedef struct TZR_DrawImageArgs TZR_DrawImageArgs; typedef struct TZR_DrawRectangleArgs TZR_DrawRectangleArgs; typedef struct TZR_PlaySoundArgs TZR_PlaySoundArgs; typedef enum TZR_KeyState TZR_KeyState; +typedef struct TZR_Joystick TZR_Joystick; struct TZR_Config { int _; @@ -143,3 +145,12 @@ struct TZR_PlaySoundArgs { int loop; float volume; }; + +struct TZR_Joystick +{ + SDL_GameController *ptr; + float leftx; + float lefty; + float rightx; + float righty; +}; diff --git a/sources/TZR_CycleEvents.c b/sources/TZR_CycleEvents.c index 29b5ec9..6a375a9 100644 --- a/sources/TZR_CycleEvents.c +++ b/sources/TZR_CycleEvents.c @@ -2,6 +2,7 @@ #include "TZR_resource.h" #include "TZR_globals.h" #include <SDL2/SDL_scancode.h> +#include <limits.h> void next_state(TZR_KeyState *keystate) @@ -20,6 +21,16 @@ next_state(TZR_KeyState *keystate) } } +static void +get_axis(SDL_GameController *gc, float *out, SDL_GameControllerAxis axis) +{ + const Sint16 v = SDL_GameControllerGetAxis(gc, axis); + if (v > -8192 && v < 8192) + *out = 0.0f; + else + *out = (float)v / INT16_MAX; +} + void TZR_CycleEvents(void) { @@ -35,10 +46,11 @@ TZR_CycleEvents(void) ; for (size_t i = 0; i < ___tzr_joysticks_size; i++) { - if (___tzr_joysticks[i] == NULL) + TZR_Joystick *const jstick = &___tzr_joysticks[i]; + if (jstick->ptr == NULL) continue; for (int k = 0; k < SDL_CONTROLLER_BUTTON_MAX; k++) { - if (SDL_GameControllerGetButton(___tzr_joysticks[i], k)) { + if (SDL_GameControllerGetButton(jstick->ptr, k)) { if (___tzr_joystates[k] != TZR_KEYSTATE_DOWN) ___tzr_joystates[k] = TZR_KEYSTATE_PRESS; } else { @@ -46,5 +58,9 @@ TZR_CycleEvents(void) ___tzr_joystates[k] = TZR_KEYSTATE_RELEASE; } } + get_axis(jstick->ptr, &jstick->leftx, SDL_CONTROLLER_AXIS_LEFTX); + get_axis(jstick->ptr, &jstick->lefty, SDL_CONTROLLER_AXIS_LEFTY); + get_axis(jstick->ptr, &jstick->rightx, SDL_CONTROLLER_AXIS_RIGHTX); + get_axis(jstick->ptr, &jstick->righty, SDL_CONTROLLER_AXIS_RIGHTY); } } diff --git a/sources/TZR_JoystickLeftX.c b/sources/TZR_JoystickLeftX.c new file mode 100644 index 0000000..998feb1 --- /dev/null +++ b/sources/TZR_JoystickLeftX.c @@ -0,0 +1,14 @@ +#include "TZR_joystick.h" +#include "TZR_globals.h" + +float +TZR_JoystickLeftX(void) +{ + for (size_t i = 0; i < ___tzr_joysticks_size; i++) { + if (___tzr_joysticks[i].ptr == NULL) + continue; + if (___tzr_joysticks[i].leftx) + return ___tzr_joysticks[i].leftx; + } + return 0.0f; +} diff --git a/sources/TZR_JoystickLeftY.c b/sources/TZR_JoystickLeftY.c new file mode 100644 index 0000000..cbe03ce --- /dev/null +++ b/sources/TZR_JoystickLeftY.c @@ -0,0 +1,14 @@ +#include "TZR_joystick.h" +#include "TZR_globals.h" + +float +TZR_JoystickLeftY(void) +{ + for (size_t i = 0; i < ___tzr_joysticks_size; i++) { + if (___tzr_joysticks[i].ptr == NULL) + continue; + if (___tzr_joysticks[i].lefty) + return ___tzr_joysticks[i].lefty; + } + return 0.0f; +} diff --git a/sources/TZR_JoystickRightX.c b/sources/TZR_JoystickRightX.c new file mode 100644 index 0000000..df72d35 --- /dev/null +++ b/sources/TZR_JoystickRightX.c @@ -0,0 +1,14 @@ +#include "TZR_joystick.h" +#include "TZR_globals.h" + +float +TZR_JoystickRightX(void) +{ + for (size_t i = 0; i < ___tzr_joysticks_size; i++) { + if (___tzr_joysticks[i].ptr == NULL) + continue; + if (___tzr_joysticks[i].rightx) + return ___tzr_joysticks[i].rightx; + } + return 0.0f; +} diff --git a/sources/TZR_JoystickRightY.c b/sources/TZR_JoystickRightY.c new file mode 100644 index 0000000..ede829d --- /dev/null +++ b/sources/TZR_JoystickRightY.c @@ -0,0 +1,14 @@ +#include "TZR_joystick.h" +#include "TZR_globals.h" + +float +TZR_JoystickRightY(void) +{ + for (size_t i = 0; i < ___tzr_joysticks_size; i++) { + if (___tzr_joysticks[i].ptr == NULL) + continue; + if (___tzr_joysticks[i].righty) + return ___tzr_joysticks[i].righty; + } + return 0.0f; +} diff --git a/sources/TZR_PollEvent.c b/sources/TZR_PollEvent.c index 893a0b7..826f0e0 100644 --- a/sources/TZR_PollEvent.c +++ b/sources/TZR_PollEvent.c @@ -48,7 +48,7 @@ TZR_PollEvent(TZR_Event *e) case SDL_JOYDEVICEADDED: { size_t i; for (i = 0; i < ___tzr_joysticks_size; i++) { - if (___tzr_joysticks[i] == NULL) + if (___tzr_joysticks[i].ptr == NULL) break; } if (i == ___tzr_joysticks_size) { @@ -72,17 +72,18 @@ TZR_PollEvent(TZR_Event *e) sdl_error(0); break; } - ___tzr_joysticks[i] = jstick; + memset(&___tzr_joysticks[i], 0, sizeof(___tzr_joysticks[i])); + ___tzr_joysticks[i].ptr = jstick; fprintf(stderr, "opened joystick\n"); break; } case SDL_JOYDEVICEREMOVED: for (size_t i = 0; i < ___tzr_joysticks_size; i++) { SDL_Joystick *const jstick = - SDL_GameControllerGetJoystick(___tzr_joysticks[i]); + SDL_GameControllerGetJoystick(___tzr_joysticks[i].ptr); if (se.jdevice.which == SDL_JoystickInstanceID(jstick)) { - SDL_GameControllerClose(___tzr_joysticks[i]); - ___tzr_joysticks[i] = NULL; + SDL_GameControllerClose(___tzr_joysticks[i].ptr); + ___tzr_joysticks[i].ptr = NULL; break; } } diff --git a/sources/TZR_Quit.c b/sources/TZR_Quit.c index 661d99f..f98a939 100644 --- a/sources/TZR_Quit.c +++ b/sources/TZR_Quit.c @@ -14,8 +14,8 @@ TZR_Quit(void) ___tzr_resources_size = 0; ___tzr_resources_capacity = 0; for (size_t i = 0; i < ___tzr_joysticks_size; i++) { - if (___tzr_joysticks[i] != NULL) - SDL_GameControllerClose(___tzr_joysticks[i]); + if (___tzr_joysticks[i].ptr != NULL) + SDL_GameControllerClose(___tzr_joysticks[i].ptr); } if (___tzr_joysticks != NULL) free(___tzr_joysticks); diff --git a/sources/globals.c b/sources/globals.c index a048771..d0366e4 100644 --- a/sources/globals.c +++ b/sources/globals.c @@ -25,6 +25,6 @@ float ___tzr_scale = 1.0; int ___tzr_off_x = 1.0; int ___tzr_off_y = 1.0; Mix_Music *___tzr_music = NULL; -SDL_GameController **___tzr_joysticks = NULL; +TZR_Joystick *___tzr_joysticks = NULL; size_t ___tzr_joysticks_capacity = 0; size_t ___tzr_joysticks_size = 0; |