veloren_voxygen/
key_state.rs1use 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}