tuxanci2-engine
Game engine for tuxanci2
Log | Files | Refs | README | LICENSE
commit e734aa9fd5fbbb120e8aa0771c8ab26d4d562393
parent 4966e6fcaf99a0b547a71c83d12691a8e8583de5
Author: Connor Thomson <connor@gnufault.org>
Date:   Mon, 19 Oct 2026 09:27:18 -0700

Bind some xbox buttons to the keyboard

Diffstat:
Mplatforms/xbox/Makefile | 2+-
Mplatforms/xbox/xbox.c | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 66 insertions(+), 1 deletion(-)

diff --git a/platforms/xbox/Makefile b/platforms/xbox/Makefile @@ -25,7 +25,7 @@ export NXDK_CFLAGS .PHONY: all clean all: $(STAGED_ENTRY) $(STAGED_SOURCES) $(ASSET_SOURCES) $(CONFIG_HEADER) - SRCS="$(SRCS)" $(MAKE) -C "$(XBOX_BUILD_DIR)" -f "$(NXDK_DIR)/Makefile" NXDK_DIR="$(NXDK_DIR)" OUTPUT_DIR="$(XBOX_BUILD_DIR)" 'XBE_TITLE=Tuxanci\ 2' GEN_XISO="$(MAKEFILE_DIR)tuxanci2.iso" + SRCS="$(SRCS)" $(MAKE) -C "$(XBOX_BUILD_DIR)" -f "$(NXDK_DIR)/Makefile" NXDK_DIR="$(NXDK_DIR)" NXDK_SDL=y OUTPUT_DIR="$(XBOX_BUILD_DIR)" 'XBE_TITLE=Tuxanci\ 2' GEN_XISO="$(MAKEFILE_DIR)tuxanci2.iso" $(STAGED_ENTRY): $(MAKEFILE_DIR)xbox.c mkdir -p $(@D) diff --git a/platforms/xbox/xbox.c b/platforms/xbox/xbox.c @@ -1,4 +1,5 @@ #include "ta_api.h" +#include <SDL.h> #include <hal/video.h> #include <windows.h> #include <stdint.h> @@ -10,8 +11,51 @@ #define TARGET_FPS 60 #define FRAME_TIME_MS (1000 / TARGET_FPS) +static SDL_GameController *open_controller(void) { + for (int i = 0; i < SDL_NumJoysticks(); i++) { + if (SDL_IsGameController(i)) { + return SDL_GameControllerOpen(i); + } + } + + return NULL; +} + +static void update_controller_input(SDL_GameController *controller) { + SDL_GameControllerUpdate(); + + ta_keyboard_keys keys[] = { + KEY_UP, + KEY_DOWN, + KEY_LEFT, + KEY_RIGHT, + KEY_ENTER + }; + + SDL_GameControllerButton buttons[] = { + SDL_CONTROLLER_BUTTON_DPAD_UP, + SDL_CONTROLLER_BUTTON_DPAD_DOWN, + SDL_CONTROLLER_BUTTON_DPAD_LEFT, + SDL_CONTROLLER_BUTTON_DPAD_RIGHT, + SDL_CONTROLLER_BUTTON_A + }; + + for (int i = 0; i < 5; i++) { + if (controller && SDL_GameControllerGetButton(controller, buttons[i])) { + ta_keyboard_key_down(keys[i]); + } else { + ta_keyboard_key_up(keys[i]); + } + } +} + int main(void) { + if (SDL_Init(SDL_INIT_GAMECONTROLLER) != 0) { + return 1; + } + if (!XVideoSetMode(SCREEN_WIDTH, SCREEN_HEIGHT, WINDOW_BPP, REFRESH_DEFAULT)) { + SDL_Quit(); return 1; } @@ -20,8 +64,27 @@ int main(void) { ta_fb.bpp = WINDOW_BPP; ta_main_init(); + SDL_GameController *controller = open_controller(); while (1) { + SDL_Event event; + while (SDL_PollEvent(&event)) { + if (event.type == SDL_CONTROLLERDEVICEADDED && !controller) { + controller = SDL_GameControllerOpen(event.cdevice.which); + } else if (event.type == SDL_CONTROLLERDEVICEREMOVED && controller) { + SDL_Joystick *joystick = SDL_GameControllerGetJoystick(controller); + if (SDL_JoystickInstanceID(joystick) == event.cdevice.which) { + SDL_GameControllerClose(controller); + controller = NULL; + } + } + } + + if (!controller) { + controller = open_controller(); + } + + update_controller_input(controller); ta_main_update(); uint32_t *dest = (uint32_t *)XVideoGetFB(); @@ -37,6 +100,8 @@ int main(void) { Sleep(FRAME_TIME_MS); } + SDL_GameControllerClose(controller); + SDL_Quit(); return 0; }