169 lines
3.6 KiB
Rust
Executable File
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
|
|
}
|
|
}
|