|
1 | 1 | use winit::event::VirtualKeyCode;
|
2 | 2 |
|
3 | 3 | pub struct KeyboardInput {
|
4 |
| - key_states: [bool; 16] |
| 4 | + key_states: [bool; 16], |
| 5 | + last_released_key: Option<u8>, |
| 6 | + track_next_released_key: bool |
5 | 7 | }
|
6 | 8 |
|
7 | 9 | impl KeyboardInput {
|
8 | 10 | pub fn new() -> Self {
|
9 | 11 | KeyboardInput {
|
10 |
| - key_states: [false; 16] |
| 12 | + key_states: [false; 16], |
| 13 | + last_released_key: None, |
| 14 | + track_next_released_key: false |
11 | 15 | }
|
12 | 16 | }
|
13 | 17 |
|
14 |
| - /// Sets a key state. |
| 18 | + /// Checks if we're tracking the next key release |
| 19 | + pub fn is_tracking_next_key_release(&self) -> bool { |
| 20 | + self.track_next_released_key |
| 21 | + } |
| 22 | + |
| 23 | + /// Tracks for the next key |
| 24 | + pub fn track_next_key_release(&mut self, track: bool) { |
| 25 | + self.last_released_key = None; |
| 26 | + self.track_next_released_key = track; |
| 27 | + } |
| 28 | + |
| 29 | + /// Gets the last released key if we're waiting for it |
| 30 | + pub fn get_last_released_key(&self) -> Option<u8> { |
| 31 | + self.last_released_key |
| 32 | + } |
| 33 | + |
| 34 | + /// Sets a key state |
15 | 35 | pub fn set_key_pressed(&mut self, key: u8, pressed: bool) {
|
16 | 36 | self.key_states[key as usize] = pressed;
|
| 37 | + |
| 38 | + if !pressed && self.track_next_released_key { |
| 39 | + self.last_released_key = Some(key); |
| 40 | + } |
17 | 41 | }
|
18 | 42 |
|
19 |
| - /// Checks if a key is currently pressed. |
| 43 | + /// Checks if a key is currently pressed |
20 | 44 | pub fn is_key_pressed(&self, key: u8) -> bool {
|
21 | 45 | self.key_states[key as usize]
|
22 | 46 | }
|
23 | 47 | }
|
24 | 48 |
|
25 |
| -/// Gets a virtual key code from a CHIP-8 key. |
| 49 | +/// Gets a virtual key code from a CHIP-8 key |
26 | 50 | pub fn get_keycode_from_key(key: u8) -> Option<VirtualKeyCode> {
|
27 | 51 | // CHIP-8 keyboard is mapped to PC as follows:
|
28 | 52 |
|
|
0 commit comments