This commit is contained in:
2019-07-27 03:49:02 +02:00
parent e26c64c253
commit de5fa84ac7
3 changed files with 121 additions and 7 deletions

97
src/input.rs Normal file
View 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 {
}