aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-07-10 20:18:37 +0200
committerkdx <kikoodx@paranoici.org>2023-07-10 20:19:51 +0200
commit53b5a8abe962701b894980c52cc045704cccb2c4 (patch)
tree59b29c34e6422eabcaec89da2c22900cca51fb0c
parenta9617e017b78fe41f109dc4c943a53d914e30b79 (diff)
downloadtzr-53b5a8abe962701b894980c52cc045704cccb2c4.tar.gz
sticks
-rw-r--r--headers/TZR_globals.h2
-rw-r--r--headers/TZR_joystick.h4
-rw-r--r--headers/TZR_types.h11
-rw-r--r--sources/TZR_CycleEvents.c20
-rw-r--r--sources/TZR_JoystickLeftX.c14
-rw-r--r--sources/TZR_JoystickLeftY.c14
-rw-r--r--sources/TZR_JoystickRightX.c14
-rw-r--r--sources/TZR_JoystickRightY.c14
-rw-r--r--sources/TZR_PollEvent.c11
-rw-r--r--sources/TZR_Quit.c4
-rw-r--r--sources/globals.c2
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;