A beginning to controller support

This commit is contained in:
Linus Probert 2018-10-10 23:28:24 +02:00
parent 2919ebf97f
commit bb7f9effd3
2 changed files with 53 additions and 1 deletions

View File

@ -99,6 +99,37 @@ get_event_key(SDL_Event *event)
return key; return key;
} }
static Uint64
get_event_button(SDL_Event *event)
{
Uint64 key;
switch (event->jbutton.button) {
case SDL_CONTROLLER_BUTTON_A:
key = KEY_NUM1 & KEY_ENTER; break;
case SDL_CONTROLLER_BUTTON_X:
key = KEY_NUM2; break;
case SDL_CONTROLLER_BUTTON_Y:
key = KEY_NUM3; break;
case SDL_CONTROLLER_BUTTON_B:
key = KEY_NUM4; break;
case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER:
key = KEY_NUM5; break;
case SDL_CONTROLLER_BUTTON_START:
key = KEY_ESC; break;
case SDL_CONTROLLER_AXIS_TRIGGERRIGHT:
key = KEY_SPACE; break;
case SDL_CONTROLLER_BUTTON_INVALID:
default:
key = 0; break;
}
return key;
}
static Uint64
get_axis_motion(SDL_Event *event)
{
}
static Uint32 static Uint32
get_event_modkey(SDL_Event *event) get_event_modkey(SDL_Event *event)
{ {
@ -173,6 +204,12 @@ input_handle_event(Input *input, SDL_Event *event)
input->mouseX = event->motion.x; input->mouseX = event->motion.x;
input->mouseY = event->motion.y; input->mouseY = event->motion.y;
} }
else if (event->type == SDL_CONTROLLERBUTTONDOWN) {
input->keyState |= get_event_button(event);
}
else if (event->type == SDL_CONTROLLERBUTTONUP) {
input->keyState &= ~get_event_button(event);
}
} }
bool bool

View File

@ -154,6 +154,7 @@ static Screen *scoreScreen = NULL;
static Sprite *new_skill_tooltip = NULL; static Sprite *new_skill_tooltip = NULL;
static Sprite *howto_tooltip = NULL; static Sprite *howto_tooltip = NULL;
static Sprite *new_artifact_tooltip = NULL; static Sprite *new_artifact_tooltip = NULL;
static SDL_GameController *gController = NULL;
static unsigned int cLevel = 1; static unsigned int cLevel = 1;
static float deltaTime = 1.0; static float deltaTime = 1.0;
static double renderScale = 1.0; static double renderScale = 1.0;
@ -183,7 +184,7 @@ bool initSDL(void)
{ {
int imgFlags = IMG_INIT_PNG; int imgFlags = IMG_INIT_PNG;
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0)
{ {
error("Could not initiate SDL2: %s", SDL_GetError()); error("Could not initiate SDL2: %s", SDL_GetError());
return false; return false;
@ -209,6 +210,16 @@ bool initSDL(void)
return false; return false;
} }
if (SDL_NumJoysticks() > 0) {
gController = SDL_JoystickOpen(0);
if (!gController) {
error("Unable to open controller: %s", SDL_GetError());
}
}
else {
error("No controller found");
}
mixer_init(); mixer_init();
char title_buffer[100]; char title_buffer[100];
@ -288,6 +299,7 @@ initGame(void)
gCamera = camera_create(gRenderer); gCamera = camera_create(gRenderer);
gRoomMatrix = roommatrix_create(); gRoomMatrix = roommatrix_create();
gGui = gui_create(gCamera); gGui = gui_create(gCamera);
skillbar_set_controller_mode(gController != NULL);
gSkillBar = skillbar_create(gCamera); gSkillBar = skillbar_create(gCamera);
item_builder_init(gRenderer); item_builder_init(gRenderer);
#ifdef DEBUG #ifdef DEBUG
@ -529,6 +541,7 @@ init(void)
hiscore_init(); hiscore_init();
initMainMenu(); initMainMenu();
tooltip_set_controller_mode(gController != NULL);
howto_tooltip = tooltip_create(how_to_play_tooltip, gCamera); howto_tooltip = tooltip_create(how_to_play_tooltip, gCamera);
new_skill_tooltip = tooltip_create(skills_tooltip, gCamera); new_skill_tooltip = tooltip_create(skills_tooltip, gCamera);
new_artifact_tooltip = tooltip_create(artifacts_tooltip, gCamera); new_artifact_tooltip = tooltip_create(artifacts_tooltip, gCamera);
@ -1105,6 +1118,8 @@ void close(void)
steam_shutdown(); steam_shutdown();
#endif // STEAM_BUILD #endif // STEAM_BUILD
if (gController)
SDL_JoystickClose(gController);
SDL_DestroyRenderer(gRenderer); SDL_DestroyRenderer(gRenderer);
SDL_DestroyWindow(gWindow); SDL_DestroyWindow(gWindow);
gWindow = NULL; gWindow = NULL;