From ec65cfef4ab0f8d8b175e04a08adfd0c0b8d5695 Mon Sep 17 00:00:00 2001 From: Carter Anderson Date: Sat, 4 Apr 2020 23:42:39 -0700 Subject: [PATCH] Add mouse input --- examples/{input.rs => input_keyboard.rs} | 0 examples/input_mouse.rs | 21 +++++++++++++++++++++ src/input/keyboard.rs | 8 ++++---- src/input/mod.rs | 3 +++ src/input/mouse.rs | 15 +++++++++++++++ src/window/winit/converters.rs | 19 +++++++++++++++---- src/window/winit/mod.rs | 13 ++++++++++++- 7 files changed, 70 insertions(+), 9 deletions(-) rename examples/{input.rs => input_keyboard.rs} (100%) create mode 100644 examples/input_mouse.rs create mode 100644 src/input/mouse.rs diff --git a/examples/input.rs b/examples/input_keyboard.rs similarity index 100% rename from examples/input.rs rename to examples/input_keyboard.rs diff --git a/examples/input_mouse.rs b/examples/input_mouse.rs new file mode 100644 index 0000000000..5df95005b1 --- /dev/null +++ b/examples/input_mouse.rs @@ -0,0 +1,21 @@ +use bevy::{input::mouse::MouseInput, prelude::*}; + +fn main() { + App::build() + .add_default_plugins() + .build_system(mouse_input_system) + .run(); +} + +pub fn mouse_input_system(resources: &mut Resources) -> Box { + let mut mouse_input_event_reader = resources.get_event_reader::(); + SystemBuilder::new("mouse_input") + .read_resource::>() + .build( + move |_command_buffer, _world, mouse_input_events, _queries| { + for event in mouse_input_events.iter(&mut mouse_input_event_reader) { + println!("{:?}", event); + } + }, + ) +} \ No newline at end of file diff --git a/src/input/keyboard.rs b/src/input/keyboard.rs index 970b82d0cd..3290e1c50c 100644 --- a/src/input/keyboard.rs +++ b/src/input/keyboard.rs @@ -2,19 +2,19 @@ pub struct KeyboardInput { pub scan_code: u32, pub virtual_key_code: Option, - pub state: KeyState, + pub state: ElementState, } #[derive(Debug, Clone)] -pub enum KeyState { +pub enum ElementState { Pressed, Released, } -impl KeyState { +impl ElementState { pub fn is_pressed(&self) -> bool { match self { - KeyState::Pressed => true, + ElementState::Pressed => true, _ => false, } } diff --git a/src/input/mod.rs b/src/input/mod.rs index ada3025edb..1fd2d4504b 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -1,7 +1,9 @@ pub mod keyboard; +pub mod mouse; use crate::{app::AppBuilder, prelude::AppPlugin}; use keyboard::KeyboardInput; +use mouse::MouseInput; #[derive(Default)] pub struct InputPlugin; @@ -9,6 +11,7 @@ pub struct InputPlugin; impl AppPlugin for InputPlugin { fn build(&self, app: AppBuilder) -> AppBuilder { app.add_event::() + .add_event::() } fn name(&self) -> &str { diff --git a/src/input/mouse.rs b/src/input/mouse.rs new file mode 100644 index 0000000000..ebfd234834 --- /dev/null +++ b/src/input/mouse.rs @@ -0,0 +1,15 @@ +use super::keyboard::ElementState; + +#[derive(Debug, Clone)] +pub struct MouseInput { + pub button: MouseButton, + pub state: ElementState, +} + +#[derive(Debug, Hash, PartialEq, Eq, Clone, Copy)] +pub enum MouseButton { + Left, + Right, + Middle, + Other(u8), +} \ No newline at end of file diff --git a/src/window/winit/converters.rs b/src/window/winit/converters.rs index 6f79f9e957..727e808dcc 100644 --- a/src/window/winit/converters.rs +++ b/src/window/winit/converters.rs @@ -1,4 +1,4 @@ -use crate::input::keyboard::{KeyState, KeyboardInput, VirtualKeyCode}; +use crate::input::{mouse::MouseButton, keyboard::{ElementState, KeyboardInput, VirtualKeyCode}}; impl From<&winit::event::KeyboardInput> for KeyboardInput { fn from(keyboard_input: &winit::event::KeyboardInput) -> Self { @@ -10,11 +10,22 @@ impl From<&winit::event::KeyboardInput> for KeyboardInput { } } -impl From for KeyState { +impl From for ElementState { fn from(element_state: winit::event::ElementState) -> Self { match element_state { - winit::event::ElementState::Pressed => KeyState::Pressed, - winit::event::ElementState::Released => KeyState::Released, + winit::event::ElementState::Pressed => ElementState::Pressed, + winit::event::ElementState::Released => ElementState::Released, + } + } +} + +impl From for MouseButton { + fn from(mouse_button: winit::event::MouseButton) -> Self { + match mouse_button { + winit::event::MouseButton::Left => MouseButton::Left, + winit::event::MouseButton::Right => MouseButton::Right, + winit::event::MouseButton::Middle => MouseButton::Middle, + winit::event::MouseButton::Other(val) => MouseButton::Other(val), } } } diff --git a/src/window/winit/mod.rs b/src/window/winit/mod.rs index be2ddc8278..d81e0c0acd 100644 --- a/src/window/winit/mod.rs +++ b/src/window/winit/mod.rs @@ -2,7 +2,10 @@ mod converters; mod winit_windows; pub use winit_windows::*; -use crate::{input::keyboard::KeyboardInput, prelude::*}; +use crate::{ + input::{keyboard::KeyboardInput, mouse::MouseInput}, + prelude::*, +}; use super::{CreateWindow, Window, WindowCreated, WindowResized, Windows}; use winit::{ @@ -81,6 +84,14 @@ pub fn winit_runner(mut app: App) { app.resources.get_mut::>().unwrap(); keyboard_input_events.send(input.into()); } + WindowEvent::MouseInput { state, button, .. } => { + let mut mouse_input_events = + app.resources.get_mut::>().unwrap(); + mouse_input_events.send(MouseInput { + button: button.into(), + state: state.into(), + }); + } _ => {} }, event::Event::MainEventsCleared => {