Files
snow_trail/src/utility/input.rs
2026-03-04 09:04:37 +01:00

169 lines
3.6 KiB
Rust
Executable File

use glam::Vec2;
use sdl3::{event::Event, keyboard::Keycode};
pub struct InputState
{
pub w: bool,
pub a: bool,
pub s: bool,
pub d: bool,
pub space: bool,
pub shift: bool,
pub space_just_pressed: bool,
pub debug_cycle_just_pressed: bool,
pub mouse_delta: (f32, f32),
pub mouse_captured: bool,
pub quit_requested: bool,
}
impl InputState
{
pub fn new() -> Self
{
Self {
w: false,
a: false,
s: false,
d: false,
space: false,
shift: false,
space_just_pressed: false,
debug_cycle_just_pressed: false,
mouse_delta: (0.0, 0.0),
mouse_captured: true,
quit_requested: false,
}
}
pub fn handle_event(&mut self, event: &Event) -> bool
{
match event
{
Event::Quit { .. } =>
{
self.quit_requested = true;
return true;
}
Event::KeyDown {
keycode: Some(key),
repeat,
..
} =>
{
if !repeat
{
self.handle_keydown(*key);
if *key == Keycode::Escape
{
self.quit_requested = true;
return true;
}
}
}
Event::KeyUp {
keycode: Some(key), ..
} =>
{
self.handle_keyup(*key);
}
Event::MouseMotion { xrel, yrel, .. } =>
{
self.handle_mouse_motion(*xrel as f32, *yrel as f32);
}
_ =>
{}
}
false
}
pub fn handle_keydown(&mut self, key: Keycode)
{
match key
{
Keycode::W => self.w = true,
Keycode::A => self.a = true,
Keycode::S => self.s = true,
Keycode::D => self.d = true,
Keycode::Space =>
{
if !self.space
{
self.space_just_pressed = true;
}
self.space = true;
}
Keycode::LShift | Keycode::RShift => self.shift = true,
Keycode::F1 => self.debug_cycle_just_pressed = true,
_ =>
{}
}
}
pub fn handle_keyup(&mut self, key: Keycode)
{
match key
{
Keycode::W => self.w = false,
Keycode::A => self.a = false,
Keycode::S => self.s = false,
Keycode::D => self.d = false,
Keycode::Space => self.space = false,
Keycode::LShift | Keycode::RShift => self.shift = false,
_ =>
{}
}
}
pub fn handle_mouse_motion(&mut self, xrel: f32, yrel: f32)
{
if self.mouse_captured
{
self.mouse_delta = (xrel, yrel);
}
}
pub fn clear_just_pressed(&mut self)
{
self.space_just_pressed = false;
self.debug_cycle_just_pressed = false;
self.mouse_delta = (0.0, 0.0);
}
pub fn get_movement_input(&self) -> Vec2
{
let mut input = Vec2::ZERO;
if self.w
{
input.y += 1.0;
}
if self.s
{
input.y -= 1.0;
}
if self.a
{
input.x -= 1.0;
}
if self.d
{
input.x += 1.0;
}
if input.length_squared() > 1.0
{
input = input.normalize();
}
input
}
}