input
This commit is contained in:
97
src/input.rs
Normal file
97
src/input.rs
Normal file
@@ -0,0 +1,97 @@
|
||||
use winit::{ScanCode, ModifiersState, MouseButton, ElementState};
|
||||
use std::collections::{HashMap};
|
||||
|
||||
pub struct VirtualButton {
|
||||
pub digital_inputs: Vec<DigitalInput>
|
||||
}
|
||||
|
||||
pub struct VirtualAxis {
|
||||
pub analog_inputs: Vec<AxisInput>
|
||||
}
|
||||
|
||||
pub struct InputState {
|
||||
pub virtual_buttons: HashMap<String, VirtualButton>,
|
||||
pub virtual_axes: HashMap<String, VirtualAxis>,
|
||||
pressed_digital: HashMap<DigitalInput, (bool, bool)>
|
||||
}
|
||||
|
||||
impl InputState {
|
||||
pub fn new() -> InputState {
|
||||
InputState { virtual_buttons: HashMap::new(), virtual_axes: HashMap::new(), pressed_digital: HashMap::new() }
|
||||
}
|
||||
|
||||
pub fn button_down(self: &Self, button_code: &str) -> bool {
|
||||
if let Some(input) = self.virtual_buttons.get(button_code) {
|
||||
self.pressed_digital.iter().any(|(registered_input, _)| input.digital_inputs.iter().any(|digital_input| digital_input == registered_input))
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
pub fn button_just_pressed(self: &Self, input: VirtualButton) -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
pub fn button_just_released(self: &Self, input: VirtualButton) -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
pub fn on_keyboard_event(self: &mut Self, state: ElementState, scancode: ScanCode, modifiers: ModifiersState) {
|
||||
match state {
|
||||
ElementState::Pressed => {
|
||||
self.pressed_digital.insert(DigitalInput::Keyboard(KeyboardInput { scancode, modifiers }), (true, false));
|
||||
},
|
||||
ElementState::Released => {
|
||||
if let Some((_, recent_release)) = self.pressed_digital.get_mut(&DigitalInput::Keyboard(KeyboardInput { scancode, modifiers })) {
|
||||
*recent_release = true;
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
pub fn finish_update(self: &mut Self) {
|
||||
self.pressed_digital.iter_mut().for_each(|(_, (recent_press, _))| {
|
||||
if *recent_press { *recent_press = false }
|
||||
});
|
||||
self.pressed_digital.retain(|_, (recent_press, recent_release)| *recent_release == false);
|
||||
}
|
||||
}
|
||||
|
||||
pub enum AxisInput {
|
||||
Analog(AnalogInput),
|
||||
Digital(DigitalInput, DigitalInput),
|
||||
}
|
||||
|
||||
#[derive(Debug, Eq, PartialEq, Hash)]
|
||||
pub enum DigitalInput {
|
||||
Keyboard(KeyboardInput),
|
||||
Mouse(MouseInput)
|
||||
}
|
||||
|
||||
impl DigitalInput {
|
||||
pub fn simple_key(scancode: ScanCode) -> DigitalInput {
|
||||
DigitalInput::Keyboard(KeyboardInput { scancode, modifiers: ModifiersState {
|
||||
shift: false,
|
||||
ctrl: false,
|
||||
alt: false,
|
||||
logo: false
|
||||
} })
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Eq, PartialEq, Hash)]
|
||||
pub struct KeyboardInput {
|
||||
scancode: ScanCode,
|
||||
modifiers: ModifiersState
|
||||
}
|
||||
|
||||
#[derive(Debug, Eq, PartialEq, Hash)]
|
||||
pub struct MouseInput {
|
||||
button: MouseButton,
|
||||
modifiers: ModifiersState
|
||||
}
|
||||
|
||||
#[derive(Debug, Eq, PartialEq)]
|
||||
pub struct AnalogInput {
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user