#include "input.h" #include #include // Constructor Input::Input(int source) { // Inicializa las variables for (int i = 0; i < 17; i++) { mKeyBindings[i].scancode = 0; mKeyBindings[i].active = false; mGameControllerBindings[i].button = SDL_CONTROLLER_BUTTON_INVALID; mGameControllerBindings[i].active = false; } mSource = source; if (mSource == INPUT_USE_KEYBOARD) printf("\nInput requested KEYBOARD\n"); else printf("\nInput requested GAMECONTROLLER"); if (mSource == INPUT_USE_GAMECONTROLLER) if (!discoverGameController()) mSource = INPUT_USE_KEYBOARD; if (mSource == INPUT_USE_KEYBOARD) printf("Input asigned was KEYBOARD\n"); else printf("Input asigned was GAMECONTROLLER (%s)\n", SDL_GameControllerNameForIndex(0)); } // Destructor Input::~Input() { } // Asigna uno de los posibles inputs a una tecla del teclado void Input::bindKey(Uint8 input, SDL_Scancode code) { mKeyBindings[input].scancode = code; } // Asigna uno de los posibles inputs a un botón del mando void Input::bindGameController(Uint8 input, SDL_GameControllerButton button) { mGameControllerBindings[input].button = button; } // Comprueba si un input esta activo bool Input::checkInput(Uint8 input, bool repeat) { if (mSource == INPUT_USE_KEYBOARD) { const Uint8 *mKeystates = SDL_GetKeyboardState(NULL); if (repeat) { if (mKeystates[mKeyBindings[input].scancode] != 0) return true; else return false; } else { if (!mKeyBindings[input].active) { if (mKeystates[mKeyBindings[input].scancode] != 0) { mKeyBindings[input].active = true; return true; } else { return false; } } else { if (mKeystates[mKeyBindings[input].scancode] == 0) { mKeyBindings[input].active = false; return false; } else { return false; } } } } else // Utiliza mando { if (repeat) { if (SDL_GameControllerGetButton(mGameController, mGameControllerBindings[input].button) != 0) return true; else return false; } else { if (!mGameControllerBindings[input].active) { if (SDL_GameControllerGetButton(mGameController, mGameControllerBindings[input].button) != 0) { mGameControllerBindings[input].active = true; return true; } else { return false; } } else { if (SDL_GameControllerGetButton(mGameController, mGameControllerBindings[input].button) == 0) { mGameControllerBindings[input].active = false; return false; } else { return false; } } } } } // Comprueba si hay un mando conectado bool Input::discoverGameController() { bool found = false; if (SDL_WasInit(SDL_INIT_GAMECONTROLLER) != 1) SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER); int nJoysticks = SDL_NumJoysticks(); mNumGamepads = 0; // Count how many controllers there are for (int i = 0; i < nJoysticks; i++) if (SDL_IsGameController(i)) mNumGamepads++; printf(" (%i joysticks found, %i are gamepads)\n", nJoysticks, mNumGamepads); if (mNumGamepads > 0) { found = true; for (int i = 0; i < mNumGamepads; i++) { // Open the controller and add it to our list SDL_GameController *pad = SDL_GameControllerOpen(i); if (SDL_GameControllerGetAttached(pad) == 1) mConnectedControllers.push_back(pad); else std::cout << "SDL_GetError() = " << SDL_GetError() << std::endl; } mGameController = mConnectedControllers[0]; SDL_GameControllerEventState(SDL_ENABLE); } return found; }