mirror of
https://git.sr.ht/~rabbits/uxn
synced 2024-11-28 00:33:02 +00:00
Added joystick support
This commit is contained in:
parent
9f743399b1
commit
87507f7f03
1 changed files with 30 additions and 19 deletions
47
src/uxnemu.c
47
src/uxnemu.c
|
@ -163,6 +163,7 @@ redraw(Uxn *u)
|
||||||
static int
|
static int
|
||||||
init(void)
|
init(void)
|
||||||
{
|
{
|
||||||
|
SDL_Joystick *gGameController;
|
||||||
SDL_AudioSpec as;
|
SDL_AudioSpec as;
|
||||||
SDL_zero(as);
|
SDL_zero(as);
|
||||||
as.freq = SAMPLE_FREQUENCY;
|
as.freq = SAMPLE_FREQUENCY;
|
||||||
|
@ -171,7 +172,7 @@ init(void)
|
||||||
as.callback = audio_callback;
|
as.callback = audio_callback;
|
||||||
as.samples = 512;
|
as.samples = 512;
|
||||||
as.userdata = NULL;
|
as.userdata = NULL;
|
||||||
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_GAMECONTROLLER) < 0) {
|
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0) {
|
||||||
error("sdl", SDL_GetError());
|
error("sdl", SDL_GetError());
|
||||||
if(SDL_Init(SDL_INIT_VIDEO) < 0)
|
if(SDL_Init(SDL_INIT_VIDEO) < 0)
|
||||||
return error("sdl", SDL_GetError());
|
return error("sdl", SDL_GetError());
|
||||||
|
@ -186,13 +187,17 @@ init(void)
|
||||||
gRenderer = SDL_CreateRenderer(gWindow, -1, 0);
|
gRenderer = SDL_CreateRenderer(gWindow, -1, 0);
|
||||||
if(gRenderer == NULL)
|
if(gRenderer == NULL)
|
||||||
return error("sdl_renderer", SDL_GetError());
|
return error("sdl_renderer", SDL_GetError());
|
||||||
|
if(SDL_NumJoysticks()) {
|
||||||
|
gGameController = SDL_JoystickOpen(0);
|
||||||
|
if(gGameController == NULL)
|
||||||
|
return error("sdl_joystick", SDL_GetError());
|
||||||
|
}
|
||||||
stdin_event = SDL_RegisterEvents(1);
|
stdin_event = SDL_RegisterEvents(1);
|
||||||
audio0_event = SDL_RegisterEvents(POLYPHONY);
|
audio0_event = SDL_RegisterEvents(POLYPHONY);
|
||||||
SDL_CreateThread(stdin_handler, "stdin", NULL);
|
SDL_CreateThread(stdin_handler, "stdin", NULL);
|
||||||
SDL_StartTextInput();
|
SDL_StartTextInput();
|
||||||
SDL_ShowCursor(SDL_DISABLE);
|
SDL_ShowCursor(SDL_DISABLE);
|
||||||
SDL_EventState(SDL_DROPFILE, SDL_ENABLE);
|
SDL_EventState(SDL_DROPFILE, SDL_ENABLE);
|
||||||
SDL_GameControllerEventState(SDL_ENABLE);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -409,20 +414,19 @@ get_button(SDL_Event *event)
|
||||||
}
|
}
|
||||||
|
|
||||||
static Uint8
|
static Uint8
|
||||||
get_button_dpad(SDL_Event *e)
|
get_button_joystick(SDL_Event *event)
|
||||||
{
|
{
|
||||||
switch(e->cbutton.button) {
|
return 0x01 << (event->jbutton.button & 0x3);
|
||||||
case SDL_CONTROLLER_BUTTON_A: return 0x01;
|
|
||||||
case SDL_CONTROLLER_BUTTON_B: return 0x02;
|
|
||||||
case SDL_CONTROLLER_BUTTON_X: return 0x04;
|
|
||||||
case SDL_CONTROLLER_BUTTON_Y:
|
|
||||||
case SDL_CONTROLLER_BUTTON_START: return 0x08;
|
|
||||||
case SDL_CONTROLLER_BUTTON_DPAD_UP: return 0x10;
|
|
||||||
case SDL_CONTROLLER_BUTTON_DPAD_DOWN: return 0x20;
|
|
||||||
case SDL_CONTROLLER_BUTTON_DPAD_LEFT: return 0x40;
|
|
||||||
case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: return 0x80;
|
|
||||||
}
|
}
|
||||||
return 0x00;
|
|
||||||
|
static Uint8
|
||||||
|
get_vector_joystick(SDL_Event *event)
|
||||||
|
{
|
||||||
|
if(event->jaxis.value < -3200)
|
||||||
|
return 1;
|
||||||
|
if(event->jaxis.value > 3200)
|
||||||
|
return 2;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Uint8
|
static Uint8
|
||||||
|
@ -509,10 +513,17 @@ run(Uxn *u)
|
||||||
controller_up(devctrl, get_button(&event));
|
controller_up(devctrl, get_button(&event));
|
||||||
else if(event.type == SDL_TEXTINPUT)
|
else if(event.type == SDL_TEXTINPUT)
|
||||||
controller_key(devctrl, event.text.text[0]);
|
controller_key(devctrl, event.text.text[0]);
|
||||||
else if(event.type == SDL_CONTROLLERBUTTONDOWN)
|
else if(event.type == SDL_JOYBUTTONDOWN)
|
||||||
controller_down(devctrl, get_button_dpad(&event));
|
controller_down(devctrl, get_button_joystick(&event));
|
||||||
else if(event.type == SDL_CONTROLLERBUTTONUP)
|
else if(event.type == SDL_JOYBUTTONUP)
|
||||||
controller_up(devctrl, get_button_dpad(&event));
|
controller_up(devctrl, get_button_joystick(&event));
|
||||||
|
else if(event.type == SDL_JOYAXISMOTION) {
|
||||||
|
Uint8 vec = get_vector_joystick(&event);
|
||||||
|
if(!vec)
|
||||||
|
controller_up(devctrl, (0x03 << (!event.jaxis.axis * 2)) << 4);
|
||||||
|
else
|
||||||
|
controller_down(devctrl, (0x01 << ((vec + !event.jaxis.axis * 2) - 1)) << 4);
|
||||||
|
}
|
||||||
/* Console */
|
/* Console */
|
||||||
else if(event.type == stdin_event)
|
else if(event.type == stdin_event)
|
||||||
console_input(u, event.cbutton.button);
|
console_input(u, event.cbutton.button);
|
||||||
|
|
Loading…
Reference in a new issue