Skip to content

Commit dfa1533

Browse files
committed
Add quick hack to fix movement.
Previous code would cause keys to stick.
1 parent e349689 commit dfa1533

2 files changed

Lines changed: 73 additions & 0 deletions

File tree

src/input_movement.hpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#pragma once
2+
#include <array>
3+
#include <tuple>
4+
5+
#include <SDL.h>
6+
7+
/// @brief Simple mapping of movement keys to directions.
8+
struct MoveKey {
9+
int scancode;
10+
int dx;
11+
int dy;
12+
};
13+
14+
/// @brief A list of common movement keys.
15+
static constexpr std::array MOVE_KEYS {
16+
MoveKey{SDL_SCANCODE_A, -1, 0},
17+
MoveKey{SDL_SCANCODE_D, 1, 0},
18+
MoveKey{SDL_SCANCODE_W, 0, -1},
19+
MoveKey{SDL_SCANCODE_S, 0, 1},
20+
MoveKey{SDL_SCANCODE_LEFT, -1, 0},
21+
MoveKey{SDL_SCANCODE_RIGHT, 1, 0},
22+
MoveKey{SDL_SCANCODE_UP, 0, -1},
23+
MoveKey{SDL_SCANCODE_DOWN, 0, 1},
24+
MoveKey{SDL_SCANCODE_KP_4, -1, 0},
25+
MoveKey{SDL_SCANCODE_KP_6, 1, 0},
26+
MoveKey{SDL_SCANCODE_KP_8, 0, -1},
27+
MoveKey{SDL_SCANCODE_KP_2, 0, 1},
28+
29+
MoveKey{SDL_SCANCODE_KP_7, -1, -1},
30+
MoveKey{SDL_SCANCODE_KP_1, -1, 1},
31+
MoveKey{SDL_SCANCODE_KP_9, 1, -1},
32+
MoveKey{SDL_SCANCODE_KP_3, 1, 1},
33+
34+
MoveKey{SDL_SCANCODE_HOME, -1, -1},
35+
MoveKey{SDL_SCANCODE_END, -1, 1},
36+
MoveKey{SDL_SCANCODE_PAGEUP, 1, -1},
37+
MoveKey{SDL_SCANCODE_PAGEDOWN, 1, 1},
38+
39+
MoveKey{SDL_SCANCODE_H, -1, 0},
40+
MoveKey{SDL_SCANCODE_J, 0, 1},
41+
MoveKey{SDL_SCANCODE_K, 0, -1},
42+
MoveKey{SDL_SCANCODE_L, 1, 0},
43+
MoveKey{SDL_SCANCODE_Y, -1, -1},
44+
MoveKey{SDL_SCANCODE_U, 1, -1},
45+
MoveKey{SDL_SCANCODE_B, -1, 1},
46+
MoveKey{SDL_SCANCODE_N, 1, 1},
47+
};
48+
49+
/// @brief Return the current direction from the active keyboard state.
50+
/// @return A {dx, dy} tuple of all held keys.
51+
inline auto get_current_movement_dir() -> std::tuple<int, int> {
52+
const auto* keyboard_state = SDL_GetKeyboardState(NULL);
53+
int dx = 0;
54+
int dy = 0;
55+
for (const auto& move_key : MOVE_KEYS) {
56+
if(keyboard_state[move_key.scancode]) {
57+
dx += move_key.dx;
58+
dy += move_key.dy;
59+
}
60+
}
61+
return {dx, dy};
62+
}

src/mob_player.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
*/
2626
#include <ctype.h>
2727
#include <assert.h>
28+
29+
#include "input_movement.hpp"
2830
#include "main.hpp"
2931

3032
// maximum sprint : 2 times faster
@@ -355,6 +357,15 @@ bool Player::update(float elapsed, TCOD_key_t key,TCOD_mouse_t *mouse) {
355357

356358
bool tryToMove=Player::getMoveKey(key,&up,&down,&left,&right);
357359

360+
{
361+
// Hack to fix movement.
362+
auto [new_dx, new_dy] = get_current_movement_dir();
363+
left = new_dx < 0;
364+
right = new_dx > 0;
365+
up = new_dy < 0;
366+
down = new_dy > 0;
367+
}
368+
358369
// mouse coordinates
359370
int dungeonx=mouse->cx+gameEngine->xOffset;
360371
int dungeony=mouse->cy+gameEngine->yOffset;

0 commit comments

Comments
 (0)