瀏覽代碼

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))
== id);
}
/*
static int sdl_event_filter(void*, SDL_Event* event) {
return ( SDL_QUIT == event->type ||
SDL_KEYDOWN == event->type ||
SDL_KEYUP == event->type ||
SDL_CONTROLLERBUTTONDOWN == event->type ||
SDL_CONTROLLERBUTTONUP == event->type ||
SDL_CONTROLLERDEVICEADDED == event->type ||
SDL_CONTROLLERDEVICEREMOVED == event->type
);
}
*/
static int sdl_input_init(nes_Input_Reader* reader) {
int status = SDL_Init(SDL_INIT_EVENTS |
SDL_INIT_GAMECONTROLLER);

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

return status;
@@ -57,13 +59,7 @@ static const int sdl_keycodes[nes_controller_num_buttons] = {
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_B,
SDL_CONTROLLER_BUTTON_BACK,
@@ -74,6 +70,12 @@ static const int sdl_gamepad_buttons[nes_controller_num_buttons] = {
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,
nes_input* input) {
int status = 0;
@@ -86,12 +88,28 @@ static int sdl_input_update(nes_Input_Reader* reader,

} else if ( SDL_KEYDOWN == 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) {
@@ -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;
}



Loading…
取消
儲存