From 56dea9f5e8c293bfdfa350f48669e14a5dd4499d Mon Sep 17 00:00:00 2001 From: HampusM Date: Sun, 2 Nov 2025 17:30:07 +0100 Subject: feat(engine): add & use Keyboard struct QOL fns --- engine/src/camera/fly.rs | 10 +++++----- engine/src/windowing/keyboard.rs | 28 ++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) (limited to 'engine') diff --git a/engine/src/camera/fly.rs b/engine/src/camera/fly.rs index a034851..7996b4d 100644 --- a/engine/src/camera/fly.rs +++ b/engine/src/camera/fly.rs @@ -8,7 +8,7 @@ use ecs::{Component, Query}; use crate::builder; use crate::camera::{Active as ActiveCamera, Camera}; use crate::delta_time::DeltaTime; -use crate::input::keyboard::{Key, KeyState, Keyboard}; +use crate::input::keyboard::{Key, Keyboard}; use crate::input::mouse::Motion as MouseMotion; use crate::transform::WorldPosition; use crate::vector::{Vec2, Vec3}; @@ -112,24 +112,24 @@ fn update( camera.global_up = cam_right.cross(&direction).normalize(); - if keyboard.get_key_state(Key::W) == KeyState::Pressed { + if keyboard.pressed(Key::W) { camera_world_pos.position += direction * fly_camera.speed * delta_time.as_secs_f32(); } - if keyboard.get_key_state(Key::S) == KeyState::Pressed { + if keyboard.pressed(Key::S) { camera_world_pos.position -= direction * fly_camera.speed * delta_time.as_secs_f32(); } - if keyboard.get_key_state(Key::A) == KeyState::Pressed { + if keyboard.pressed(Key::A) { let cam_left = -direction.cross(&Vec3::UP).normalize(); camera_world_pos.position += cam_left * fly_camera.speed * delta_time.as_secs_f32(); } - if keyboard.get_key_state(Key::D) == KeyState::Pressed { + if keyboard.pressed(Key::D) { let cam_right = direction.cross(&Vec3::UP).normalize(); camera_world_pos.position += diff --git a/engine/src/windowing/keyboard.rs b/engine/src/windowing/keyboard.rs index e4fffe5..a1c3e22 100644 --- a/engine/src/windowing/keyboard.rs +++ b/engine/src/windowing/keyboard.rs @@ -10,6 +10,34 @@ pub struct Keyboard impl Keyboard { + /// Returns whether the given key was just pressed this frame. This function will + /// return `false` if the key was also pressed the previous frame. + pub fn just_pressed(&self, key: Key) -> bool + { + self.get_key_state(key) == KeyState::Pressed + && self.get_prev_key_state(key) == KeyState::Released + } + + /// Returns whether the given key was just released this frame. This function will + /// return `false` if the key was also released the previous frame. + pub fn just_released(&self, key: Key) -> bool + { + self.get_key_state(key) == KeyState::Released + && self.get_prev_key_state(key) == KeyState::Pressed + } + + /// Returns whether the given key is currently pressed. + pub fn pressed(&self, key: Key) -> bool + { + self.get_key_state(key) == KeyState::Pressed + } + + /// Returns whether the given key is currently released. + pub fn released(&self, key: Key) -> bool + { + self.get_key_state(key) == KeyState::Released + } + #[must_use] pub fn get_key_state(&self, key: Key) -> KeyState { -- cgit v1.2.3-18-g5258