Files
GP1-DirectX/project/src/GamePadController.cpp
2024-12-26 21:09:52 +01:00

108 lines
3.6 KiB
C++

//
// Created by Bram on 11/12/2024.
//
#include <iostream>
#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<int>(button)];
}
bool GamePadController::IsButtonUp(Controllers controller, GamePadButton button) const {
return !m_GamePads[controller].buttons[static_cast<int>(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<int>(button)] &&
!m_GamePads[controller].prevButtons[static_cast<int>(button)];
}