diff --git a/crates/bevy_input/src/input.rs b/crates/bevy_input/src/input.rs index 7840f9476c..86fa083f0c 100644 --- a/crates/bevy_input/src/input.rs +++ b/crates/bevy_input/src/input.rs @@ -1,72 +1,52 @@ -use crate::keyboard::{KeyCode, KeyboardInput, ElementState}; -use bevy_app::{EventReader, Events}; -use legion::prelude::{Res, ResMut}; -use std::collections::HashSet; +use std::{collections::HashSet, hash::Hash}; -#[derive(Default)] -pub struct Input { - pressed_keys: HashSet, - just_pressed_keys: HashSet, - just_released_keys: HashSet, +pub struct Input { + pressed: HashSet, + just_pressed: HashSet, + just_released: HashSet, } -impl Input { - pub fn press_key(&mut self, key_code: KeyCode) { - if !self.key_pressed(key_code) { - self.just_pressed_keys.insert(key_code); +impl Default for Input { + fn default() -> Self { + Self { + pressed: Default::default(), + just_pressed: Default::default(), + just_released: Default::default(), + } + } +} + +impl Input +where + T: Copy + Eq + Hash, +{ + pub fn press(&mut self, input: T) { + if !self.pressed(input) { + self.just_pressed.insert(input); } - self.pressed_keys.insert(key_code); + self.pressed.insert(input); } - pub fn release_key(&mut self, key_code: KeyCode) { - self.pressed_keys.remove(&key_code); - self.just_released_keys.insert(key_code); + pub fn pressed(&self, input: T) -> bool { + self.pressed.contains(&input) } - pub fn key_pressed(&self, key_code: KeyCode) -> bool { - self.pressed_keys.contains(&key_code) + pub fn release(&mut self, input: T) { + self.pressed.remove(&input); + self.just_released.insert(input); } - pub fn key_just_pressed(&self, key_code: KeyCode) -> bool { - self.just_pressed_keys.contains(&key_code) + pub fn just_pressed(&self, input: T) -> bool { + self.just_pressed.contains(&input) } - pub fn key_just_released(&self, key_code: KeyCode) -> bool { - self.just_released_keys.contains(&key_code) + pub fn just_released(&self, input: T) -> bool { + self.just_released.contains(&input) } pub fn update(&mut self) { - self.just_pressed_keys.clear(); - self.just_released_keys.clear(); - } -} - -#[derive(Default)] -pub struct InputState { - keyboard_input_event_reader: EventReader, -} - -pub fn input_system( - mut state: ResMut, - mut input: ResMut, - keyboard_input_events: Res>, -) { - input.update(); - for event in state - .keyboard_input_event_reader - .iter(&keyboard_input_events) - { - if let KeyboardInput { - key_code: Some(key_code), - state, - .. - } = event - { - match state { - ElementState::Pressed => input.press_key(*key_code), - ElementState::Released => input.release_key(*key_code), - } - } + self.just_pressed.clear(); + self.just_released.clear(); } } diff --git a/crates/bevy_input/src/keyboard.rs b/crates/bevy_input/src/keyboard.rs index 7c3afb4dd9..bdd25a4997 100644 --- a/crates/bevy_input/src/keyboard.rs +++ b/crates/bevy_input/src/keyboard.rs @@ -1,3 +1,7 @@ +use bevy_app::{Events, EventReader}; +use legion::prelude::{Res, ResMut}; +use crate::Input; + #[derive(Debug, Clone)] pub struct KeyboardInput { pub scan_code: u32, @@ -20,6 +24,35 @@ impl ElementState { } } +#[derive(Default)] +pub struct KeyboardInputState { + keyboard_input_event_reader: EventReader, +} + +pub fn keyboard_input_system( + mut state: ResMut, + mut keyboard_input: ResMut>, + keyboard_input_events: Res>, +) { + keyboard_input.update(); + for event in state + .keyboard_input_event_reader + .iter(&keyboard_input_events) + { + if let KeyboardInput { + key_code: Some(key_code), + state, + .. + } = event + { + match state { + ElementState::Pressed => keyboard_input.press(*key_code), + ElementState::Released => keyboard_input.release(*key_code), + } + } + } +} + #[derive(Debug, Hash, Ord, PartialOrd, PartialEq, Eq, Clone, Copy)] #[repr(u32)] pub enum KeyCode { diff --git a/crates/bevy_input/src/lib.rs b/crates/bevy_input/src/lib.rs index e4448f25ac..b96055cab7 100644 --- a/crates/bevy_input/src/lib.rs +++ b/crates/bevy_input/src/lib.rs @@ -6,9 +6,12 @@ pub mod system; pub use input::*; use bevy_app::{AppBuilder, AppPlugin}; -use keyboard::KeyboardInput; -use mouse::{MouseButtonInput, MouseMotionInput}; +use keyboard::{keyboard_input_system, KeyCode, KeyboardInput, KeyboardInputState}; use legion::prelude::IntoSystem; +use mouse::{ + mouse_button_input_system, MouseButton, MouseButtonInput, MouseButtonInputState, + MouseMotion, +}; #[derive(Default)] pub struct InputPlugin; @@ -17,9 +20,18 @@ impl AppPlugin for InputPlugin { fn build(&self, app: &mut AppBuilder) { app.add_event::() .add_event::() - .add_event::() - .init_resource::() - .init_resource::() - .add_system_to_stage(bevy_app::stage::EVENT_UPDATE, input_system.system()); + .add_event::() + .init_resource::>() + .init_resource::() + .add_system_to_stage( + bevy_app::stage::EVENT_UPDATE, + keyboard_input_system.system(), + ) + .init_resource::>() + .init_resource::() + .add_system_to_stage( + bevy_app::stage::EVENT_UPDATE, + mouse_button_input_system.system(), + ); } } diff --git a/crates/bevy_input/src/mouse.rs b/crates/bevy_input/src/mouse.rs index ce0014b606..4b9917d9d6 100644 --- a/crates/bevy_input/src/mouse.rs +++ b/crates/bevy_input/src/mouse.rs @@ -1,5 +1,8 @@ use super::keyboard::ElementState; +use crate::Input; +use bevy_app::{EventReader, Events}; use glam::Vec2; +use legion::prelude::{Res, ResMut}; #[derive(Debug, Clone)] pub struct MouseButtonInput { @@ -16,6 +19,28 @@ pub enum MouseButton { } #[derive(Debug, Clone)] -pub struct MouseMotionInput { +pub struct MouseMotion { pub delta: Vec2, -} \ No newline at end of file +} + +#[derive(Default)] +pub struct MouseButtonInputState { + mouse_button_input_event_reader: EventReader, +} + +pub fn mouse_button_input_system( + mut state: ResMut, + mut mouse_button_input: ResMut>, + mouse_button_input_events: Res>, +) { + mouse_button_input.update(); + for event in state + .mouse_button_input_event_reader + .iter(&mouse_button_input_events) + { + match event.state { + ElementState::Pressed => mouse_button_input.press(event.button), + ElementState::Released => mouse_button_input.release(event.button), + } + } +} diff --git a/crates/bevy_winit/src/lib.rs b/crates/bevy_winit/src/lib.rs index 1edf64390d..6e964a8e29 100644 --- a/crates/bevy_winit/src/lib.rs +++ b/crates/bevy_winit/src/lib.rs @@ -4,7 +4,7 @@ pub use winit_windows::*; use bevy_input::{ keyboard::KeyboardInput, - mouse::{MouseButtonInput, MouseMotionInput}, + mouse::{MouseButtonInput, MouseMotion}, }; use bevy_app::{App, AppBuilder, AppExit, AppPlugin, EventReader, Events}; @@ -125,8 +125,8 @@ pub fn winit_runner(mut app: App) { event::Event::DeviceEvent { ref event, .. } => match event { DeviceEvent::MouseMotion { delta } => { let mut mouse_motion_events = - app.resources.get_mut::>().unwrap(); - mouse_motion_events.send(MouseMotionInput { + app.resources.get_mut::>().unwrap(); + mouse_motion_events.send(MouseMotion { delta: Vec2::new(delta.0 as f32, delta.1 as f32), }); } diff --git a/examples/input/input_keyboard.rs b/examples/input/input_keyboard.rs index fa6d578bbf..35f517cce6 100644 --- a/examples/input/input_keyboard.rs +++ b/examples/input/input_keyboard.rs @@ -13,17 +13,17 @@ fn main() { fn move_on_input( world: &mut SubWorld, time: Res