simple_game_engine/input/
button.rs

1//! Contains the `Button` type, which stores the state (pressed, held, released) of a single button
2//! or key.
3
4/// Represents the state of a button, such as a keyboard key or mouse button.
5#[derive(Clone, Copy, Debug, Default, PartialEq)]
6pub struct Button {
7    /// Was the key pressed on this frame?
8    pub pressed: bool,
9    /// Was the key released on this frame?
10    pub released: bool,
11    /// Is the key held down?
12    pub held: bool,
13}
14
15impl Button {
16    /// Create a new Button struct from an initial state.
17    pub fn new(state: bool) -> Self {
18        Self {
19            pressed: state,
20            released: false,
21            held: state,
22        }
23    }
24
25    /// Change the state based on if the key is currently held.
26    /// This is called internally by the engine every frame.
27    pub fn update(&mut self, state: bool) {
28        self.pressed = state && !self.held;
29        self.released = !state && self.held;
30        self.held = state;
31    }
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37
38    /// Check initial state on construction.
39    #[test]
40    fn test_initial_state() {
41        assert_eq!(
42            Button::new(false),
43            Button {
44                pressed: false,
45                released: false,
46                held: false
47            }
48        );
49        assert_eq!(
50            Button::new(true),
51            Button {
52                pressed: true,
53                released: false,
54                held: true
55            }
56        );
57    }
58
59    /// Test updating a Button's state.
60    #[test]
61    fn test_update_state() {
62        let mut btn = Button::new(false);
63        // Pressed (first frame)
64        btn.update(true);
65        assert_eq!(
66            btn,
67            Button {
68                pressed: true,
69                released: false,
70                held: true,
71            }
72        );
73        // Held (subsequent frames)
74        btn.update(true);
75        assert_eq!(
76            btn,
77            Button {
78                pressed: false,
79                released: false,
80                held: true,
81            }
82        );
83        // Released (first frame)
84        btn.update(false);
85        assert_eq!(
86            btn,
87            Button {
88                pressed: false,
89                released: true,
90                held: false,
91            }
92        );
93        // Not held (subsequent frames)
94        btn.update(false);
95        assert_eq!(
96            btn,
97            Button {
98                pressed: false,
99                released: false,
100                held: false,
101            }
102        );
103    }
104}