mirror of
git://projects.qi-hardware.com/gmenu2x.git
synced 2024-11-22 22:20:36 +02:00
Make the InputManager handle analog sticks as input
This commit is contained in:
parent
dba6c32109
commit
3ce314c65d
@ -48,8 +48,13 @@ InputManager::InputManager()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < SDL_NumJoysticks(); i++)
|
for (i = 0; i < SDL_NumJoysticks(); i++) {
|
||||||
joysticks.push_back(SDL_JoystickOpen(i));
|
struct Joystick joystick = {
|
||||||
|
SDL_JoystickOpen(i), false, false, false, false,
|
||||||
|
};
|
||||||
|
joysticks.push_back(joystick);
|
||||||
|
}
|
||||||
|
|
||||||
DEBUG("Opening %i joysticks\n", i);
|
DEBUG("Opening %i joysticks\n", i);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -57,9 +62,8 @@ InputManager::InputManager()
|
|||||||
InputManager::~InputManager()
|
InputManager::~InputManager()
|
||||||
{
|
{
|
||||||
#ifndef SDL_JOYSTICK_DISABLED
|
#ifndef SDL_JOYSTICK_DISABLED
|
||||||
for (std::vector<SDL_Joystick *>::iterator it = joysticks.begin();
|
for (auto it : joysticks)
|
||||||
it < joysticks.end(); it++)
|
SDL_JoystickClose(it.joystick);
|
||||||
SDL_JoystickClose(*it);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,8 +134,6 @@ bool InputManager::getButton(Button *button, bool wait) {
|
|||||||
//TODO: when an event is processed, program a new event
|
//TODO: when an event is processed, program a new event
|
||||||
//in some time, and when it occurs, do a key repeat
|
//in some time, and when it occurs, do a key repeat
|
||||||
|
|
||||||
int i;
|
|
||||||
|
|
||||||
#ifndef SDL_JOYSTICK_DISABLED
|
#ifndef SDL_JOYSTICK_DISABLED
|
||||||
if (joysticks.size() > 0)
|
if (joysticks.size() > 0)
|
||||||
SDL_JoystickUpdate();
|
SDL_JoystickUpdate();
|
||||||
@ -152,6 +154,34 @@ bool InputManager::getButton(Button *button, bool wait) {
|
|||||||
case SDL_JOYBUTTONDOWN:
|
case SDL_JOYBUTTONDOWN:
|
||||||
source = JOYSTICK;
|
source = JOYSTICK;
|
||||||
break;
|
break;
|
||||||
|
case SDL_JOYAXISMOTION: {
|
||||||
|
source = JOYSTICK;
|
||||||
|
|
||||||
|
unsigned int axis = event.jaxis.axis;
|
||||||
|
/* We only handle the first joystick */
|
||||||
|
if (axis > 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool *axisState = joysticks[event.jaxis.which].axisState[axis];
|
||||||
|
|
||||||
|
if (event.jaxis.value < -20000) {
|
||||||
|
if (axisState[AXIS_STATE_NEGATIVE])
|
||||||
|
return false;
|
||||||
|
axisState[AXIS_STATE_NEGATIVE] = true;
|
||||||
|
axisState[AXIS_STATE_POSITIVE] = false;
|
||||||
|
*button = axis ? UP : LEFT;
|
||||||
|
} else if (event.jaxis.value > 20000) {
|
||||||
|
if (axisState[AXIS_STATE_POSITIVE])
|
||||||
|
return false;
|
||||||
|
axisState[AXIS_STATE_NEGATIVE] = false;
|
||||||
|
axisState[AXIS_STATE_POSITIVE] = true;
|
||||||
|
*button = axis ? DOWN : RIGHT;
|
||||||
|
} else {
|
||||||
|
axisState[0] = axisState[1] = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
case SDL_USEREVENT:
|
case SDL_USEREVENT:
|
||||||
switch ((enum EventCode) event.user.code) {
|
switch ((enum EventCode) event.user.code) {
|
||||||
@ -180,6 +210,7 @@ bool InputManager::getButton(Button *button, bool wait) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
if (source == KEYBOARD) {
|
if (source == KEYBOARD) {
|
||||||
for (i = 0; i < BUTTON_TYPE_SIZE; i++) {
|
for (i = 0; i < BUTTON_TYPE_SIZE; i++) {
|
||||||
if (buttonMap[i].source == KEYBOARD
|
if (buttonMap[i].source == KEYBOARD
|
||||||
@ -189,7 +220,7 @@ bool InputManager::getButton(Button *button, bool wait) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifndef SDL_JOYSTICK_DISABLED
|
#ifndef SDL_JOYSTICK_DISABLED
|
||||||
} else if (source == JOYSTICK) {
|
} else if (source == JOYSTICK && event.type != SDL_JOYAXISMOTION) {
|
||||||
for (i = 0; i < BUTTON_TYPE_SIZE; i++) {
|
for (i = 0; i < BUTTON_TYPE_SIZE; i++) {
|
||||||
if (buttonMap[i].source == JOYSTICK
|
if (buttonMap[i].source == JOYSTICK
|
||||||
&& (unsigned int)event.jbutton.button == buttonMap[i].code) {
|
&& (unsigned int)event.jbutton.button == buttonMap[i].code) {
|
||||||
|
@ -66,7 +66,14 @@ private:
|
|||||||
|
|
||||||
ButtonMapEntry buttonMap[BUTTON_TYPE_SIZE];
|
ButtonMapEntry buttonMap[BUTTON_TYPE_SIZE];
|
||||||
#ifndef SDL_JOYSTICK_DISABLED
|
#ifndef SDL_JOYSTICK_DISABLED
|
||||||
std::vector<SDL_Joystick *> joysticks;
|
#define AXIS_STATE_POSITIVE 0
|
||||||
|
#define AXIS_STATE_NEGATIVE 1
|
||||||
|
struct Joystick {
|
||||||
|
SDL_Joystick *joystick;
|
||||||
|
bool axisState[2][2];
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<Joystick> joysticks;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user