Skip to content

Commit

Permalink
Handling gamepad plugging
Browse files Browse the repository at this point in the history
  • Loading branch information
MCMic committed Sep 7, 2016
1 parent 297ff16 commit d4eab6a
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 16 deletions.
70 changes: 56 additions & 14 deletions engine/gamepad.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

using namespace std;

std::vector<Gamepad> Gamepad::pads;
std::map<int,shared_ptr<Gamepad>> Gamepad::pads;

Gamepad::Gamepad(int id): joyid(-1) {
controller = SDL_GameControllerOpen(id);
Expand All @@ -26,35 +26,77 @@ Gamepad::Gamepad(int id): joyid(-1) {
}
}

Gamepad::~Gamepad() {
if (controller) {
SDL_GameControllerClose(controller);
}
}

void Gamepad::loadGamepads()
{
/* Open the first available controllers. */
for (int i = 0; ((i < SDL_NumJoysticks()) && (i < NB_PLAYERS)); ++i) {
if (SDL_IsGameController(i)) {
Gamepad g(i);
if (g.controller) {
pads.push_back(g);
for (int i = 0; i < SDL_NumJoysticks(); ++i) {
loadGamepad(i);
}
}

void Gamepad::closeGamepads()
{
pads.erase(pads.begin(), pads.end());
}

void Gamepad::loadGamepad(int i)
{
const char *name = SDL_GameControllerNameForIndex(i);
if (name) {
printf("Opening gamepad %i (%s)\n", i, name);
} else {
printf("Opening gamepad %i\n", i);
}
if (SDL_IsGameController(i)) {
shared_ptr<Gamepad> g = make_shared<Gamepad>(i);
if (g->controller) {
if (pads.find(g->joyid) == pads.end()) {
pads[g->joyid] = g;
} else {
fprintf(stderr, "Could not open gamecontroller %i: %s\n", i, SDL_GetError());
/* Already opened, avoid closing by destructor */
printf("Already opened\n", i);
g->controller = nullptr;
}
} else {
fprintf(stderr, "Could not open gamecontroller %i: %s\n", i, SDL_GetError());
}
} else {
fprintf(stderr, "Controller not supported or invalid %i\n", i);
}
}

void Gamepad::removeGamepad(int joyid)
{
pads.erase(joyid);
}

Uint8 Gamepad::handleEvent(SDL_Event event, int &player)
{
switch (event.type) {
case SDL_CONTROLLERBUTTONDOWN:
for(int i = 0; ((i < NB_PLAYERS) && (i < pads.size())); ++i) {
if (pads[i].joyid == event.cbutton.which) {
player = i;
return event.cbutton.button;
{
int i = 0;
for (auto& pad: pads) {
if (pad.first == event.cbutton.which) {
player = i;
return event.cbutton.button;
}
i++;
}
}
break;
case SDL_CONTROLLERDEVICEADDED:
loadGamepad(event.cdevice.which);
break;
case SDL_CONTROLLERDEVICEREMOVED:
removeGamepad(event.cdevice.which);
break;
}
return SDL_CONTROLLER_BUTTON_MAX;
/*Gestion des évènements:
Joystick débranché, retiré du tableau et fermé, réassigne un pad au joueur
Joystick branché, si joueur sans pad, on assigne et on ouvre (sinon non?)*/
}
7 changes: 6 additions & 1 deletion engine/gamepad.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,25 @@
#define __GAMEPAD_H

#include "config.h"
#include <memory>

class Gamepad {
/* Stores the gamepad for each player */
static std::vector<Gamepad> pads;
static std::map<int,std::shared_ptr<Gamepad>> pads;
static const int NB_PLAYERS = 2;

SDL_GameController *controller;
SDL_JoystickID joyid;
public:
static void loadGamepads();
static void loadGamepad(int i);
static void removeGamepad(int i);
static void closeGamepads();
/* Returns pushed button if any
* Puts player id in player */
static Uint8 handleEvent(SDL_Event event, int &player);
Gamepad(int id);
~Gamepad();
};

#endif
5 changes: 4 additions & 1 deletion freesiege.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,10 +137,13 @@ int main(int argc, char* argv[]) {
} else std::cerr<<"unknown selection "<<selection<<std::endl;
}


Options::save();

Gamepad::closeGamepads();

TTF_Quit();
IMG_Quit();
SDL_Quit();

return 0;
}

0 comments on commit d4eab6a

Please sign in to comment.