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}