nightshade 0.10.0

A cross-platform data-oriented game engine.
Documentation
//! Keyboard input state.

/// Keyboard input state tracking key presses.
#[derive(Default)]
pub struct Keyboard {
    /// Current state of each key (pressed or released).
    pub keystates: std::collections::HashMap<winit::keyboard::KeyCode, winit::event::ElementState>,
    /// Characters typed this frame (for text input).
    pub frame_chars: Vec<char>,
    /// Keys pressed/released this frame as (keycode, is_pressed) pairs.
    pub frame_keys: Vec<(winit::keyboard::KeyCode, bool)>,
    /// Keys that transitioned to pressed this frame.
    pub just_pressed_keys: std::collections::HashSet<winit::keyboard::KeyCode>,
    /// Keys that transitioned to released this frame.
    pub just_released_keys: std::collections::HashSet<winit::keyboard::KeyCode>,
}

impl Keyboard {
    /// Returns true if the specified key is currently held down.
    pub fn is_key_pressed(&self, keycode: winit::keyboard::KeyCode) -> bool {
        self.keystates
            .get(&keycode)
            .is_some_and(|state| *state == winit::event::ElementState::Pressed)
    }

    /// Returns true if the specified key was pressed this frame.
    pub fn just_pressed(&self, keycode: winit::keyboard::KeyCode) -> bool {
        self.just_pressed_keys.contains(&keycode)
    }

    /// Returns true if the specified key was released this frame.
    pub fn just_released(&self, keycode: winit::keyboard::KeyCode) -> bool {
        self.just_released_keys.contains(&keycode)
    }

    /// Clears per-frame input (called at frame start).
    pub fn clear_frame_input(&mut self) {
        self.frame_chars.clear();
        self.frame_keys.clear();
    }
}