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:
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;
}