mirror of
https://github.com/isledecomp/isle-portable.git
synced 2026-01-16 04:11:15 +00:00
Refine gamepad touch controls (#591)
This commit is contained in:
parent
232ef07b51
commit
c9930d10f9
@ -183,7 +183,7 @@ class LegoInputManager : public MxPresenter {
|
|||||||
|
|
||||||
std::map<SDL_FingerID, SDL_FPoint> m_touchOrigins;
|
std::map<SDL_FingerID, SDL_FPoint> m_touchOrigins;
|
||||||
std::map<SDL_FingerID, MxU32> m_touchFlags;
|
std::map<SDL_FingerID, MxU32> m_touchFlags;
|
||||||
std::map<SDL_FingerID, Uint64> m_touchLastMotion;
|
std::map<SDL_FingerID, std::pair<MxU32, SDL_FPoint>> m_touchLastMotion;
|
||||||
};
|
};
|
||||||
|
|
||||||
// TEMPLATE: LEGO1 0x10028850
|
// TEMPLATE: LEGO1 0x10028850
|
||||||
|
|||||||
@ -532,9 +532,14 @@ MxResult LegoInputManager::GetNavigationTouchStates(MxU32& p_keyStates)
|
|||||||
p_keyStates |= touchFlags;
|
p_keyStates |= touchFlags;
|
||||||
|
|
||||||
// We need to clear these as they are not meant to be persistent in e_gamepad mode.
|
// We need to clear these as they are not meant to be persistent in e_gamepad mode.
|
||||||
if (m_touchOrigins.count(fingerID) && SDL_GetTicks() - m_touchLastMotion[fingerID] > 5) {
|
if (m_touchOrigins.count(fingerID) && m_touchLastMotion.count(fingerID)) {
|
||||||
touchFlags &= ~c_left;
|
const MxU32 inactivityThreshold = 3;
|
||||||
touchFlags &= ~c_right;
|
|
||||||
|
if (m_touchLastMotion[fingerID].first++ > inactivityThreshold) {
|
||||||
|
touchFlags &= ~c_left;
|
||||||
|
touchFlags &= ~c_right;
|
||||||
|
m_touchOrigins[fingerID].x = m_touchLastMotion[fingerID].second.x;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -586,12 +591,11 @@ MxBool LegoInputManager::HandleTouchEvent(SDL_Event* p_event, TouchScheme p_touc
|
|||||||
break;
|
break;
|
||||||
case SDL_EVENT_FINGER_MOTION:
|
case SDL_EVENT_FINGER_MOTION:
|
||||||
if (m_touchOrigins.count(event.fingerID)) {
|
if (m_touchOrigins.count(event.fingerID)) {
|
||||||
m_touchFlags[event.fingerID] = 0;
|
const float activationThreshold = 0.03f;
|
||||||
m_touchLastMotion[event.fingerID] = SDL_GetTicks();
|
m_touchFlags[event.fingerID] &= ~c_down;
|
||||||
|
m_touchFlags[event.fingerID] &= ~c_up;
|
||||||
|
|
||||||
const float deltaY = event.y - m_touchOrigins[event.fingerID].y;
|
const float deltaY = event.y - m_touchOrigins[event.fingerID].y;
|
||||||
const float activationThreshold = 0.05f;
|
|
||||||
|
|
||||||
if (SDL_fabsf(deltaY) > activationThreshold) {
|
if (SDL_fabsf(deltaY) > activationThreshold) {
|
||||||
if (deltaY > 0) {
|
if (deltaY > 0) {
|
||||||
m_touchFlags[event.fingerID] |= c_down;
|
m_touchFlags[event.fingerID] |= c_down;
|
||||||
@ -601,12 +605,18 @@ MxBool LegoInputManager::HandleTouchEvent(SDL_Event* p_event, TouchScheme p_touc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const float deltaX = event.dx;
|
const float deltaX = event.x - m_touchOrigins[event.fingerID].x;
|
||||||
if (deltaX > 0) {
|
if (SDL_fabsf(deltaX) > activationThreshold && event.dx) {
|
||||||
m_touchFlags[event.fingerID] |= c_right;
|
if (event.dx > 0) {
|
||||||
}
|
m_touchFlags[event.fingerID] |= c_right;
|
||||||
else if (deltaX < 0) {
|
m_touchFlags[event.fingerID] &= ~c_left;
|
||||||
m_touchFlags[event.fingerID] |= c_left;
|
}
|
||||||
|
else if (event.dx < 0) {
|
||||||
|
m_touchFlags[event.fingerID] |= c_left;
|
||||||
|
m_touchFlags[event.fingerID] &= ~c_right;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_touchLastMotion[event.fingerID] = {0, {event.x, event.y}};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user