From 647c6778e2c850c865f1d84d65dffbe82d828139 Mon Sep 17 00:00:00 2001 From: DaniTheSkunk <> Date: Fri, 20 Jan 2023 09:01:15 +0000 Subject: [PATCH] gamepad fully working :) --- examples/gsa_simple.c | 11 ++++++++++- include/gamepad.h | 32 +++++++++++++++++++++++++++----- include/skunkworks.h | 1 + src/gamepad.c | 7 ++++--- src/window.c | 1 + 5 files changed, 43 insertions(+), 9 deletions(-) diff --git a/examples/gsa_simple.c b/examples/gsa_simple.c index 706601f..3b36a81 100644 --- a/examples/gsa_simple.c +++ b/examples/gsa_simple.c @@ -1,3 +1,4 @@ +#include "gamepad.h" #include void init() { @@ -23,5 +24,13 @@ void init() { } void tick() { - sprites[0].x += 1; + i32 x, y; + + x = sw_gamepads[0].button_down[SW_GAMEPAD_BUTTON_DPAD_LEFT] - + sw_gamepads[0].button_down[SW_GAMEPAD_BUTTON_DPAD_RIGHT]; + y = sw_gamepads[0].button_down[SW_GAMEPAD_BUTTON_DPAD_UP] - + sw_gamepads[0].button_down[SW_GAMEPAD_BUTTON_DPAD_DOWN]; + + maps[0].scrollx -= x; + maps[0].scrolly -= y; } diff --git a/include/gamepad.h b/include/gamepad.h index 6e1a052..fb2ec69 100644 --- a/include/gamepad.h +++ b/include/gamepad.h @@ -1,17 +1,39 @@ #ifndef GUARD_F8BB6BA29F6FB6745AF8B6E15CD1C086 #define GUARD_F8BB6BA29F6FB6745AF8B6E15CD1C086 -#include "gamepad.h" #include "types.h" #define SW_MAX_GAMEPADS 4 -#define SW_MAX_GAMEPAD_AXES 4 -#define SW_MAX_GAMEPAD_BUTTONS 14 +#define SW_MAX_GAMEPAD_AXES 6 +#define SW_MAX_GAMEPAD_BUTTONS 15 + +#define SW_GAMEPAD_BUTTON_FACE_DOWN 0 +#define SW_GAMEPAD_BUTTON_FACE_RIGHT 1 +#define SW_GAMEPAD_BUTTON_FACE_LEFT 2 +#define SW_GAMEPAD_BUTTON_FACE_UP 3 +#define SW_GAMEPAD_BUTTON_LEFT_SHOULDER 4 +#define SW_GAMEPAD_BUTTON_RIGHT_SHOULDER 5 +#define SW_GAMEPAD_BUTTON_BACK 6 +#define SW_GAMEPAD_BUTTON_START 7 +#define SW_GAMEPAD_BUTTON_GUIDE 8 +#define SW_GAMEPAD_BUTTON_LEFT_STICK 9 +#define SW_GAMEPAD_BUTTON_RIGHT_STICK 10 +#define SW_GAMEPAD_BUTTON_DPAD_UP 11 +#define SW_GAMEPAD_BUTTON_DPAD_RIGHT 12 +#define SW_GAMEPAD_BUTTON_DPAD_DOWN 13 +#define SW_GAMEPAD_BUTTON_DPAD_LEFT 14 + +#define SW_GAMEPAD_AXIS_LEFT_X 0 +#define SW_GAMEPAD_AXIS_RIGHT_X 1 +#define SW_GAMEPAD_AXIS_LEFT_Y 2 +#define SW_GAMEPAD_AXIS_RIGHT_Y 3 +#define SW_GAMEPAD_AXIS_LEFT_TRIGGER 4 +#define SW_GAMEPAD_AXIS_RIGHT_TRIGGER 5 struct sw_gamepad { f32 axes[SW_MAX_GAMEPAD_AXES]; - bool button_down; - bool button_pressed; + bool button_down[SW_MAX_GAMEPAD_BUTTONS]; + bool button_pressed[SW_MAX_GAMEPAD_BUTTONS]; }; extern struct sw_gamepad sw_gamepads[SW_MAX_GAMEPADS]; diff --git a/include/skunkworks.h b/include/skunkworks.h index 31c687d..a104330 100644 --- a/include/skunkworks.h +++ b/include/skunkworks.h @@ -4,6 +4,7 @@ #include "color32.h" #include "error.h" #include "file.h" +#include "gamepad.h" #include "image32.h" #include "image8.h" #include "types.h" diff --git a/src/gamepad.c b/src/gamepad.c index 63c3b4f..e5da0d2 100644 --- a/src/gamepad.c +++ b/src/gamepad.c @@ -1,5 +1,6 @@ #include "gamepad.h" #include "GLFW/glfw3.h" +#include "error.h" #include "string.h" struct sw_gamepad sw_gamepads[SW_MAX_GAMEPADS]; @@ -19,9 +20,9 @@ void sw_gamepad_tick() { } for(j = 0; j < SW_MAX_GAMEPAD_BUTTONS; ++j) { bool down = state.buttons[j]; - sw_gamepads[i].button_pressed = - !sw_gamepads[i].button_pressed && down; - sw_gamepads[i].button_down = down; + sw_gamepads[i].button_pressed[j] = + !sw_gamepads[i].button_pressed[j] && down; + sw_gamepads[i].button_down[j] = down; } } } diff --git a/src/window.c b/src/window.c index 26eb354..4a81eb4 100644 --- a/src/window.c +++ b/src/window.c @@ -83,6 +83,7 @@ void sw_window_run(struct sw_window *window, void (*callback)()) { /* private functions */ void _tick() { + sw_gamepad_tick(); glViewport(0, 0, _tick_window->game_size.x, _tick_window->game_size.y); glBindFramebuffer(GL_FRAMEBUFFER, _tick_window->_scaler_fb->_fb); _tick_fn();