Skip to content

Commit af22dd8

Browse files
authoredDec 19, 2020
Fix some more joystick issues (#10624)
1 parent 5066fe7 commit af22dd8

7 files changed

+53
-48
lines changed
 

Diff for: ‎builtin/settingtypes.txt

+3
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,9 @@ joystick_type (Joystick type) enum auto auto,generic,xbox
152152
# when holding down a joystick button combination.
153153
repeat_joystick_button_time (Joystick button repetition interval) float 0.17 0.001
154154

155+
# The deadzone of the joystick
156+
joystick_deadzone (Joystick deadzone) int 2048
157+
155158
# The sensitivity of the joystick axes for moving the
156159
# ingame view frustum around.
157160
joystick_frustum_sensitivity (Joystick frustum sensitivity) float 170

Diff for: ‎minetest.conf.example

+3
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,9 @@
129129
# type: float min: 0.001
130130
# repeat_joystick_button_time = 0.17
131131

132+
# The deadzone of the joystick
133+
# joystick_deadzone = 2048
134+
132135
# The sensitivity of the joystick axes for moving the
133136
# ingame view frustum around.
134137
# type: float

Diff for: ‎src/client/game.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -3139,8 +3139,8 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug)
31393139
wasKeyDown(KeyType::DIG);
31403140
wasKeyDown(KeyType::PLACE);
31413141

3142-
input->joystick.clearWasKeyDown(KeyType::DIG);
3143-
input->joystick.clearWasKeyDown(KeyType::PLACE);
3142+
input->joystick.clearWasKeyPressed(KeyType::DIG);
3143+
input->joystick.clearWasKeyPressed(KeyType::PLACE);
31443144

31453145
input->joystick.clearWasKeyReleased(KeyType::DIG);
31463146
input->joystick.clearWasKeyReleased(KeyType::PLACE);

Diff for: ‎src/client/inputhandler.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ class RealInputHandler : public InputHandler
279279
}
280280
virtual bool wasKeyPressed(GameKeyType k)
281281
{
282-
return m_receiver->WasKeyPressed(keycache.key[k]) || joystick.wasKeyReleased(k);
282+
return m_receiver->WasKeyPressed(keycache.key[k]) || joystick.wasKeyPressed(k);
283283
}
284284
virtual bool wasKeyReleased(GameKeyType k)
285285
{

Diff for: ‎src/client/joystick_controller.cpp

+26-24
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ bool JoystickAxisCmb::isTriggered(const irr::SEvent::SJoystickEvent &ev) const
3737
{
3838
s16 ax_val = ev.Axis[axis_to_compare];
3939

40-
return (ax_val * direction < 0) && (thresh * direction > ax_val * direction);
40+
return (ax_val * direction < -thresh);
4141
}
4242

4343
// spares many characters
@@ -48,7 +48,7 @@ JoystickLayout create_default_layout()
4848
{
4949
JoystickLayout jlo;
5050

51-
jlo.axes_dead_border = 1024;
51+
jlo.axes_deadzone = g_settings->getU16("joystick_deadzone");
5252

5353
const JoystickAxisLayout axes[JA_COUNT] = {
5454
{0, 1}, // JA_SIDEWARD_MOVE
@@ -93,14 +93,14 @@ JoystickLayout create_default_layout()
9393
// Now about the buttons simulated by the axes
9494

9595
// Movement buttons, important for vessels
96-
JLO_A_PB(KeyType::FORWARD, 1, 1, 1024);
97-
JLO_A_PB(KeyType::BACKWARD, 1, -1, 1024);
98-
JLO_A_PB(KeyType::LEFT, 0, 1, 1024);
99-
JLO_A_PB(KeyType::RIGHT, 0, -1, 1024);
96+
JLO_A_PB(KeyType::FORWARD, 1, 1, jlo.axes_deadzone);
97+
JLO_A_PB(KeyType::BACKWARD, 1, -1, jlo.axes_deadzone);
98+
JLO_A_PB(KeyType::LEFT, 0, 1, jlo.axes_deadzone);
99+
JLO_A_PB(KeyType::RIGHT, 0, -1, jlo.axes_deadzone);
100100

101101
// Scroll buttons
102-
JLO_A_PB(KeyType::HOTBAR_PREV, 2, -1, 1024);
103-
JLO_A_PB(KeyType::HOTBAR_NEXT, 5, -1, 1024);
102+
JLO_A_PB(KeyType::HOTBAR_PREV, 2, -1, jlo.axes_deadzone);
103+
JLO_A_PB(KeyType::HOTBAR_NEXT, 5, -1, jlo.axes_deadzone);
104104

105105
return jlo;
106106
}
@@ -109,7 +109,7 @@ JoystickLayout create_xbox_layout()
109109
{
110110
JoystickLayout jlo;
111111

112-
jlo.axes_dead_border = 7000;
112+
jlo.axes_deadzone = 7000;
113113

114114
const JoystickAxisLayout axes[JA_COUNT] = {
115115
{0, 1}, // JA_SIDEWARD_MOVE
@@ -146,10 +146,10 @@ JoystickLayout create_xbox_layout()
146146
JLO_B_PB(KeyType::FREEMOVE, 1 << 16, 1 << 16); // down
147147

148148
// Movement buttons, important for vessels
149-
JLO_A_PB(KeyType::FORWARD, 1, 1, 1024);
150-
JLO_A_PB(KeyType::BACKWARD, 1, -1, 1024);
151-
JLO_A_PB(KeyType::LEFT, 0, 1, 1024);
152-
JLO_A_PB(KeyType::RIGHT, 0, -1, 1024);
149+
JLO_A_PB(KeyType::FORWARD, 1, 1, jlo.axes_deadzone);
150+
JLO_A_PB(KeyType::BACKWARD, 1, -1, jlo.axes_deadzone);
151+
JLO_A_PB(KeyType::LEFT, 0, 1, jlo.axes_deadzone);
152+
JLO_A_PB(KeyType::RIGHT, 0, -1, jlo.axes_deadzone);
153153

154154
return jlo;
155155
}
@@ -219,40 +219,42 @@ bool JoystickController::handleEvent(const irr::SEvent::SJoystickEvent &ev)
219219

220220
for (size_t i = 0; i < KeyType::INTERNAL_ENUM_COUNT; i++) {
221221
if (keys_pressed[i]) {
222-
if (!m_past_pressed_keys[i] &&
222+
if (!m_past_keys_pressed[i] &&
223223
m_past_pressed_time[i] < m_internal_time - doubling_dtime) {
224-
m_past_pressed_keys[i] = true;
224+
m_past_keys_pressed[i] = true;
225225
m_past_pressed_time[i] = m_internal_time;
226226
}
227-
} else if (m_pressed_keys[i]) {
228-
m_past_released_keys[i] = true;
227+
} else if (m_keys_down[i]) {
228+
m_keys_released[i] = true;
229229
}
230230

231-
m_pressed_keys[i] = keys_pressed[i];
231+
if (keys_pressed[i] && !(m_keys_down[i]))
232+
m_keys_pressed[i] = true;
233+
234+
m_keys_down[i] = keys_pressed[i];
232235
}
233236

234237
for (size_t i = 0; i < JA_COUNT; i++) {
235238
const JoystickAxisLayout &ax_la = m_layout.axes[i];
236239
m_axes_vals[i] = ax_la.invert * ev.Axis[ax_la.axis_id];
237240
}
238241

239-
240242
return true;
241243
}
242244

243245
void JoystickController::clear()
244246
{
245-
m_pressed_keys.reset();
246-
m_past_pressed_keys.reset();
247-
m_past_released_keys.reset();
247+
m_keys_pressed.reset();
248+
m_keys_down.reset();
249+
m_past_keys_pressed.reset();
250+
m_keys_released.reset();
248251
memset(m_axes_vals, 0, sizeof(m_axes_vals));
249252
}
250253

251254
s16 JoystickController::getAxisWithoutDead(JoystickAxis axis)
252255
{
253256
s16 v = m_axes_vals[axis];
254-
if (((v > 0) && (v < m_layout.axes_dead_border)) ||
255-
((v < 0) && (v > -m_layout.axes_dead_border)))
257+
if (abs(v) < m_layout.axes_deadzone)
256258
return 0;
257259
return v;
258260
}

Diff for: ‎src/client/joystick_controller.h

+17-21
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ struct JoystickLayout {
9696
std::vector<JoystickButtonCmb> button_keys;
9797
std::vector<JoystickAxisCmb> axis_keys;
9898
JoystickAxisLayout axes[JA_COUNT];
99-
s16 axes_dead_border;
99+
s16 axes_deadzone;
100100
};
101101

102102
class JoystickController {
@@ -111,37 +111,32 @@ class JoystickController {
111111

112112
bool wasKeyDown(GameKeyType b)
113113
{
114-
bool r = m_past_pressed_keys[b];
115-
m_past_pressed_keys[b] = false;
114+
bool r = m_past_keys_pressed[b];
115+
m_past_keys_pressed[b] = false;
116116
return r;
117117
}
118-
bool getWasKeyDown(GameKeyType b)
118+
119+
bool wasKeyReleased(GameKeyType b)
119120
{
120-
return m_past_pressed_keys[b];
121+
return m_keys_released[b];
121122
}
122-
void clearWasKeyDown(GameKeyType b)
123+
void clearWasKeyReleased(GameKeyType b)
123124
{
124-
m_past_pressed_keys[b] = false;
125+
m_keys_released[b] = false;
125126
}
126127

127-
bool wasKeyReleased(GameKeyType b)
128+
bool wasKeyPressed(GameKeyType b)
128129
{
129-
bool r = m_past_released_keys[b];
130-
m_past_released_keys[b] = false;
131-
return r;
132-
}
133-
bool getWasKeyReleased(GameKeyType b)
134-
{
135-
return m_past_pressed_keys[b];
130+
return m_keys_pressed[b];
136131
}
137-
void clearWasKeyReleased(GameKeyType b)
132+
void clearWasKeyPressed(GameKeyType b)
138133
{
139-
m_past_pressed_keys[b] = false;
134+
m_keys_pressed[b] = false;
140135
}
141136

142137
bool isKeyDown(GameKeyType b)
143138
{
144-
return m_pressed_keys[b];
139+
return m_keys_down[b];
145140
}
146141

147142
s16 getAxis(JoystickAxis axis)
@@ -162,12 +157,13 @@ class JoystickController {
162157

163158
u8 m_joystick_id = 0;
164159

165-
std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_pressed_keys;
160+
std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_keys_down;
161+
std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_keys_pressed;
166162

167163
f32 m_internal_time;
168164

169165
f32 m_past_pressed_time[KeyType::INTERNAL_ENUM_COUNT];
170166

171-
std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_past_pressed_keys;
172-
std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_past_released_keys;
167+
std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_past_keys_pressed;
168+
std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_keys_released;
173169
};

Diff for: ‎src/defaultsettings.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ void set_default_settings(Settings *settings)
279279
settings->setDefault("joystick_type", "");
280280
settings->setDefault("repeat_joystick_button_time", "0.17");
281281
settings->setDefault("joystick_frustum_sensitivity", "170");
282+
settings->setDefault("joystick_deadzone", "2048");
282283

283284
// Main menu
284285
settings->setDefault("main_menu_path", "");

0 commit comments

Comments
 (0)
Please sign in to comment.