浏览代码

Allow gamepad and keyboard to coexist

master
Nathaniel Walizer 11 个月前
父节点
当前提交
6df2f8f65a
共有 1 个文件被更改,包括 34 次插入29 次删除
  1. +34
    -29
      src/sdl_input.c

+ 34
- 29
src/sdl_input.c 查看文件

@@ -20,23 +20,25 @@ static int sdl_match_gamepad(SDL_JoystickID id, void* data) {
SDL_GameControllerGetJoystick(gamepad)) SDL_GameControllerGetJoystick(gamepad))
== id); == id);
} }
/*
static int sdl_event_filter(void*, SDL_Event* event) { static int sdl_event_filter(void*, SDL_Event* event) {
return ( SDL_QUIT == event->type || return ( SDL_QUIT == event->type ||
SDL_KEYDOWN == event->type || SDL_KEYDOWN == event->type ||
SDL_KEYUP == event->type || SDL_KEYUP == event->type ||
SDL_CONTROLLERBUTTONDOWN == event->type ||
SDL_CONTROLLERBUTTONUP == event->type ||
SDL_CONTROLLERDEVICEADDED == event->type || SDL_CONTROLLERDEVICEADDED == event->type ||
SDL_CONTROLLERDEVICEREMOVED == event->type SDL_CONTROLLERDEVICEREMOVED == event->type
); );
} }
*/
static int sdl_input_init(nes_Input_Reader* reader) { static int sdl_input_init(nes_Input_Reader* reader) {
int status = SDL_Init(SDL_INIT_EVENTS | int status = SDL_Init(SDL_INIT_EVENTS |
SDL_INIT_GAMECONTROLLER); SDL_INIT_GAMECONTROLLER);


if (status == 0) { if (status == 0) {
reader->data = sdl_find_gamepad(); reader->data = sdl_find_gamepad();
SDL_SetEventFilter(sdl_event_filter, NULL);
// SDL_SetEventFilter(sdl_event_filter, NULL);
} }


return status; return status;
@@ -57,13 +59,7 @@ static const int sdl_keycodes[nes_controller_num_buttons] = {
SDLK_RIGHT, SDLK_RIGHT,
}; };


static int button_index(int keycode) {
int index = nes_controller_num_buttons - 1;
for ( ; index > 0 && keycode != sdl_keycodes[index]; --index);
return index;
}

static const int sdl_gamepad_buttons[nes_controller_num_buttons] = {
static const int sdl_buttons[nes_controller_num_buttons] = {
SDL_CONTROLLER_BUTTON_A, SDL_CONTROLLER_BUTTON_A,
SDL_CONTROLLER_BUTTON_B, SDL_CONTROLLER_BUTTON_B,
SDL_CONTROLLER_BUTTON_BACK, SDL_CONTROLLER_BUTTON_BACK,
@@ -74,6 +70,12 @@ static const int sdl_gamepad_buttons[nes_controller_num_buttons] = {
SDL_CONTROLLER_BUTTON_DPAD_RIGHT, SDL_CONTROLLER_BUTTON_DPAD_RIGHT,
}; };


static int button_index(int keycode, const int* codes) {
int index = nes_controller_num_buttons - 1;
for ( ; index >= 0 && keycode != codes[index]; --index);
return index;
}

static int sdl_input_update(nes_Input_Reader* reader, static int sdl_input_update(nes_Input_Reader* reader,
nes_input* input) { nes_input* input) {
int status = 0; int status = 0;
@@ -86,12 +88,28 @@ static int sdl_input_update(nes_Input_Reader* reader,


} else if ( SDL_KEYDOWN == event.type || } else if ( SDL_KEYDOWN == event.type ||
SDL_KEYUP == event.type) { SDL_KEYUP == event.type) {
int index = button_index(event.key.keysym.sym);
uint8_t mask = (1 << index);
if (SDL_KEYDOWN == event.type) {
input->controllers[0].buttons |= mask;
} else {
input->controllers[0].buttons &= ~mask;
int index = button_index(event.key.keysym.sym,
sdl_keycodes);
if (index >= 0) {
uint8_t mask = (1 << index);
if (SDL_KEYDOWN == event.type) {
input->controllers[0].buttons |= mask;
} else {
input->controllers[0].buttons &= ~mask;
}
}

} else if ( SDL_CONTROLLERBUTTONDOWN == event.type ||
SDL_CONTROLLERBUTTONUP == event.type) {
int index = button_index(event.cbutton.button,
sdl_buttons);
if (index >= 0) {
uint8_t mask = (1 << index);
if (SDL_CONTROLLERBUTTONDOWN == event.type) {
input->controllers[0].buttons |= mask;
} else {
input->controllers[0].buttons &= ~mask;
}
} }


} else if (SDL_CONTROLLERDEVICEADDED == event.type) { } else if (SDL_CONTROLLERDEVICEADDED == event.type) {
@@ -108,19 +126,6 @@ static int sdl_input_update(nes_Input_Reader* reader,
} }
} }


if (NULL != reader->data) {
SDL_GameController* gamepad = (SDL_GameController*)reader->data;

for (int b = 0; b < nes_controller_num_buttons; ++b) {
if (SDL_GameControllerGetButton(
gamepad, sdl_gamepad_buttons[b])) {
input->controllers[0].buttons |= (1 << b);
} else {
input->controllers[0].buttons &= ~(1 << b);
}
}
}

return status; return status;
} }




正在加载...
取消
保存