use winit::event::{ElementState, WindowEvent, KeyEvent, Event}; use std::collections::HashSet; use winit::event::WindowEvent::KeyboardInput; use winit::keyboard::PhysicalKey; use crate::keyboard::Key; #[derive(Debug)] pub struct InputHandler { keys_pressed: Vec, keys_held: Vec, keys_released: Vec } impl InputHandler { pub fn new() -> Self { Self { keys_pressed: Vec::new(), keys_held: Vec::new(), keys_released: Vec::new() } } pub fn update(&mut self, event: &Event) { match event { Event::WindowEvent { event: WindowEvent::KeyboardInput { event: KeyEvent { state, physical_key: PhysicalKey::Code(keycode), .. }, .. }, .. } => { match state { ElementState::Pressed => { if self.keys_pressed.contains(&PhysicalKey::Code(keycode.clone())) { self.keys_held.push(PhysicalKey::Code(keycode.clone())); } else { self.keys_pressed.push(PhysicalKey::Code(keycode.clone())); } self.keys_pressed.push(PhysicalKey::Code(keycode.clone())); } ElementState::Released => { self.keys_released = vec![]; if let Some(index) = self.keys_pressed.iter().position(|&x| x == PhysicalKey::Code(keycode.clone())) { self.keys_pressed.remove(index); } if let Some(index) = self.keys_held.iter().position(|&x| x == PhysicalKey::Code(keycode.clone())) { self.keys_held.remove(index); } self.keys_released.push(PhysicalKey::Code(keycode.clone())); } } } _ => {} } } pub fn key_pressed(&self, key: Key) -> bool { self.keys_pressed.contains(&PhysicalKey::Code(key)) } pub fn key_held(&self, key: Key) -> bool { self.keys_held.contains(&PhysicalKey::Code(key)) } pub fn key_released(&self, key: Key) -> bool { self.keys_released.contains(&PhysicalKey::Code(key)) } }