SDL: improved internal joystick event handling
This commit is contained in:
parent
09a6029781
commit
75004c429c
2 changed files with 28 additions and 24 deletions
|
@ -205,12 +205,12 @@ bool SdlEventSource::handleKbdMouse(Common::Event &event) {
|
||||||
|
|
||||||
if (_km.x_vel || _km.y_vel) {
|
if (_km.x_vel || _km.y_vel) {
|
||||||
if (_km.x_down_count) {
|
if (_km.x_down_count) {
|
||||||
if (curTime > _km.x_down_time + _km.delay_time * 12) {
|
if (curTime > _km.x_down_time + 300) {
|
||||||
if (_km.x_vel > 0)
|
if (_km.x_vel > 0)
|
||||||
_km.x_vel+=_km.multiplier;
|
_km.x_vel += _km.multiplier;
|
||||||
else
|
else
|
||||||
_km.x_vel-=_km.multiplier;
|
_km.x_vel -= _km.multiplier;
|
||||||
} else if (curTime > _km.x_down_time + _km.delay_time * 8) {
|
} else if (curTime > _km.x_down_time + 200) {
|
||||||
if (_km.x_vel > 0)
|
if (_km.x_vel > 0)
|
||||||
_km.x_vel = 5 * _km.multiplier;
|
_km.x_vel = 5 * _km.multiplier;
|
||||||
else
|
else
|
||||||
|
@ -218,27 +218,33 @@ bool SdlEventSource::handleKbdMouse(Common::Event &event) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_km.y_down_count) {
|
if (_km.y_down_count) {
|
||||||
if (curTime > _km.y_down_time + _km.delay_time * 12) {
|
if (curTime > _km.y_down_time + 300) {
|
||||||
if (_km.y_vel > 0)
|
if (_km.y_vel > 0)
|
||||||
_km.y_vel += _km.multiplier;
|
_km.y_vel += _km.multiplier;
|
||||||
else
|
else
|
||||||
_km.y_vel -= _km.multiplier;
|
_km.y_vel -= _km.multiplier;
|
||||||
} else if (curTime > _km.y_down_time + _km.delay_time * 8) {
|
} else if (curTime > _km.y_down_time + 200) {
|
||||||
if (_km.y_vel > 0)
|
if (_km.y_vel > 0)
|
||||||
_km.y_vel = 5 * _km.multiplier;
|
_km.y_vel = 5 * _km.multiplier;
|
||||||
else
|
else
|
||||||
_km.y_vel = -5 * _km.multiplier;
|
_km.y_vel = -5 * _km.multiplier;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The modifier key makes the mouse movement slower
|
// The modifier key makes the mouse movement slower
|
||||||
|
// The extra factor of delay/25 makes velocities
|
||||||
|
// independent of kbdMouse update rate
|
||||||
|
// all velovities were originally chosen
|
||||||
|
// at a delay of 25, so that is the reference
|
||||||
|
// operator order is important to avoid overflow
|
||||||
if (_km.modifier) {
|
if (_km.modifier) {
|
||||||
_km.x += _km.x_vel / 10;
|
_km.x += ((_km.x_vel / 10) * ((int16)_km.delay_time)) / 25;
|
||||||
_km.y += _km.y_vel / 10;
|
_km.y += ((_km.y_vel / 10) * ((int16)_km.delay_time)) / 25;
|
||||||
} else {
|
} else {
|
||||||
_km.x += _km.x_vel;
|
_km.x += (_km.x_vel * ((int16)_km.delay_time)) / 25;
|
||||||
_km.y += _km.y_vel;
|
_km.y += (_km.y_vel * ((int16)_km.delay_time)) / 25;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_km.x < 0) {
|
if (_km.x < 0) {
|
||||||
_km.x = 0;
|
_km.x = 0;
|
||||||
_km.x_vel = -1 * _km.multiplier;
|
_km.x_vel = -1 * _km.multiplier;
|
||||||
|
@ -260,7 +266,7 @@ bool SdlEventSource::handleKbdMouse(Common::Event &event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_graphicsManager) {
|
if (_graphicsManager) {
|
||||||
_graphicsManager->getWindow()->warpMouseInWindow((Uint16) (_km.x / _km.multiplier), (Uint16) (_km.y / _km.multiplier));
|
_graphicsManager->getWindow()->warpMouseInWindow((Uint16)(_km.x / _km.multiplier), (Uint16)(_km.y / _km.multiplier));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_km.x != oldKmX || _km.y != oldKmY) {
|
if (_km.x != oldKmX || _km.y != oldKmY) {
|
||||||
|
@ -446,9 +452,6 @@ Common::KeyCode SdlEventSource::SDLToOSystemKeycode(const SDLKey key) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SdlEventSource::pollEvent(Common::Event &event) {
|
bool SdlEventSource::pollEvent(Common::Event &event) {
|
||||||
if (handleKbdMouse(event)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
// In case we still need to send a key up event for a key down from a
|
// In case we still need to send a key up event for a key down from a
|
||||||
|
@ -474,6 +477,12 @@ bool SdlEventSource::pollEvent(Common::Event &event) {
|
||||||
if (dispatchSDLEvent(ev, event))
|
if (dispatchSDLEvent(ev, event))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handle mouse control via analog joystick and keyboard
|
||||||
|
if (handleKbdMouse(event)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -799,14 +808,12 @@ bool SdlEventSource::handleJoyAxisMotion(SDL_Event &ev, Common::Event &event) {
|
||||||
int axis = ev.jaxis.value;
|
int axis = ev.jaxis.value;
|
||||||
#ifdef JOY_ANALOG
|
#ifdef JOY_ANALOG
|
||||||
// conversion factor between keyboard mouse and joy axis value
|
// conversion factor between keyboard mouse and joy axis value
|
||||||
int vel_to_axis = (3000 / _km.multiplier);
|
int vel_to_axis = (1500 / _km.multiplier);
|
||||||
#else
|
#else
|
||||||
if (axis > JOY_DEADZONE) {
|
if (axis > JOY_DEADZONE) {
|
||||||
axis -= JOY_DEADZONE;
|
axis -= JOY_DEADZONE;
|
||||||
event.type = Common::EVENT_MOUSEMOVE;
|
|
||||||
} else if (axis < -JOY_DEADZONE) {
|
} else if (axis < -JOY_DEADZONE) {
|
||||||
axis += JOY_DEADZONE;
|
axis += JOY_DEADZONE;
|
||||||
event.type = Common::EVENT_MOUSEMOVE;
|
|
||||||
} else
|
} else
|
||||||
axis = 0;
|
axis = 0;
|
||||||
#endif
|
#endif
|
||||||
|
@ -855,16 +862,13 @@ bool SdlEventSource::handleJoyAxisMotion(SDL_Event &ev, Common::Event &event) {
|
||||||
scalingFactor = 1.0f / magnitude * (magnitude - deadZone) / (32769.0f - deadZone);
|
scalingFactor = 1.0f / magnitude * (magnitude - deadZone) / (32769.0f - deadZone);
|
||||||
_km.x_vel = (int16) (analogX * scalingFactor * 32768.0f / vel_to_axis);
|
_km.x_vel = (int16) (analogX * scalingFactor * 32768.0f / vel_to_axis);
|
||||||
_km.y_vel = (int16) (analogY * scalingFactor * 32768.0f / vel_to_axis);
|
_km.y_vel = (int16) (analogY * scalingFactor * 32768.0f / vel_to_axis);
|
||||||
event.type = Common::EVENT_MOUSEMOVE;
|
|
||||||
} else {
|
} else {
|
||||||
_km.y_vel = 0;
|
_km.y_vel = 0;
|
||||||
_km.x_vel = 0;
|
_km.x_vel = 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier);
|
return false;
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
|
bool SdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
|
||||||
|
@ -940,7 +944,6 @@ void SdlEventSource::resetKeyboardEmulation(int16 x_max, int16 y_max) {
|
||||||
_km.y_max = y_max;
|
_km.y_max = y_max;
|
||||||
_km.delay_time = 12;
|
_km.delay_time = 12;
|
||||||
_km.last_time = 0;
|
_km.last_time = 0;
|
||||||
_km.multiplier = 16;
|
|
||||||
_km.modifier = false;
|
_km.modifier = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,8 @@ protected:
|
||||||
//@{
|
//@{
|
||||||
|
|
||||||
struct KbdMouse {
|
struct KbdMouse {
|
||||||
int16 x, y, x_vel, y_vel, x_max, y_max, x_down_count, y_down_count, multiplier;
|
int16 x, y, x_vel, y_vel, x_max, y_max, x_down_count, y_down_count;
|
||||||
|
static const int16 multiplier = 16;
|
||||||
uint32 last_time, delay_time, x_down_time, y_down_time;
|
uint32 last_time, delay_time, x_down_time, y_down_time;
|
||||||
bool modifier;
|
bool modifier;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue