// // Created by Bram on 11/12/2024. // #include #include "GamePadController.h" #include "Utils.h" GamePadController::GamePadController() = default; GamePadController::~GamePadController() { for (auto pGameController : m_pGameControllers) { SDL_GameControllerClose(pGameController); } } void GamePadController::Init() { const int numJoysticks = SDL_NumJoysticks(); for (int i = 0; i < numJoysticks; i++) { if (SDL_IsGameController(i)) { SDL_GameController *pController = SDL_GameControllerOpen(i); if (pController) { m_pGameControllers.push_back(pController); m_GamePads.push_back(GamePad()); } } } } void GamePadController::Update() { const int numJoysticks = SDL_NumJoysticks(); if(numJoysticks > m_pGameControllers.size()){ for (int i = 0; i < numJoysticks; i++) { if (SDL_IsGameController(i)) { bool bFound = false; for (auto pController : m_pGameControllers) { if (SDL_GameControllerGetJoystick(pController) == SDL_JoystickFromInstanceID(i)) { bFound = true; break; } } if (!bFound) { SDL_GameController *pController = SDL_GameControllerOpen(i); if (pController) { m_pGameControllers.push_back(pController); m_GamePads.push_back(GamePad()); std::cout << GREEN << "New Controller Connected" << RESET << std::endl; } } } } } for (int i = 0; i < m_pGameControllers.size(); ++i) { SDL_GameController *pController = m_pGameControllers[i]; if (!SDL_GameControllerGetAttached(pController)) { SDL_GameControllerClose(pController); m_pGameControllers.erase(m_pGameControllers.begin() + i); m_GamePads.erase(m_GamePads.begin() + i); std::cout << RED << "Controller Disconnected" << RESET << std::endl; --i; // Adjust index after removing the controller } } for (int i = 0; i < m_pGameControllers.size(); i++) { SDL_GameController *pController = m_pGameControllers[i]; GamePad &gamePad = m_GamePads[i]; for (int j = 0; j < SDL_CONTROLLER_BUTTON_MAX; j++) { gamePad.prevButtons[j] = gamePad.buttons[j]; } for (int j = 0; j < SDL_CONTROLLER_BUTTON_MAX; j++) { gamePad.buttons[j] = SDL_GameControllerGetButton(pController, (SDL_GameControllerButton) j); } for (int j = 0; j < SDL_CONTROLLER_AXIS_MAX; j++) { gamePad.axis[j] = SDL_GameControllerGetAxis(pController, (SDL_GameControllerAxis) j); } } } bool GamePadController::IsButtonDown(Controllers controller, GamePadButton button) const { return m_GamePads[controller].buttons[static_cast(button)]; } bool GamePadController::IsButtonUp(Controllers controller, GamePadButton button) const { return !m_GamePads[controller].buttons[static_cast(button)]; } float GamePadController::GetAxis(Controllers controller, int axis) const { return m_GamePads[controller].axis[axis]; } bool GamePadController::isButtonPressed(Controllers controller, GamePadButton button) const { if(controller >= m_GamePads.size()) return false; return m_GamePads[controller].buttons[static_cast(button)] && !m_GamePads[controller].prevButtons[static_cast(button)]; }