veloren_voxygen/
key_state.rs

1use vek::Vec2;
2
3pub const GIVE_UP_HOLD_TIME: f32 = 2.0;
4
5pub struct KeyState {
6    pub right: bool,
7    pub left: bool,
8    pub up: bool,
9    pub down: bool,
10    pub swim_up: bool,
11    pub swim_down: bool,
12    pub fly: bool,
13    pub auto_walk: bool,
14    pub speed_mul: f32,
15    pub trade: bool,
16    pub give_up: Option<f32>,
17    pub analog_matrix: Vec2<f32>,
18}
19
20impl Default for KeyState {
21    fn default() -> Self {
22        Self {
23            right: false,
24            left: false,
25            up: false,
26            down: false,
27            swim_up: false,
28            swim_down: false,
29            fly: false,
30            auto_walk: false,
31            speed_mul: 1.0,
32            trade: false,
33            give_up: None,
34            analog_matrix: Vec2::zero(),
35        }
36    }
37}
38
39impl KeyState {
40    pub fn dir_vec(&self) -> Vec2<f32> {
41        let dir = if self.analog_matrix == Vec2::zero() {
42            Vec2::<f32>::new(
43                if self.right { 1.0 } else { 0.0 } + if self.left { -1.0 } else { 0.0 },
44                if self.up || self.auto_walk { 1.0 } else { 0.0 }
45                    + if self.down { -1.0 } else { 0.0 },
46            )
47            .try_normalized()
48            .unwrap_or_default()
49        } else {
50            self.analog_matrix
51        } * self.speed_mul;
52
53        if dir.magnitude_squared() <= 1.0 {
54            dir
55        } else {
56            dir.normalized()
57        }
58    }
59}