diff options
Diffstat (limited to 'games/rstnode/rst-client/src/input.rs')
-rw-r--r-- | games/rstnode/rst-client/src/input.rs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/games/rstnode/rst-client/src/input.rs b/games/rstnode/rst-client/src/input.rs new file mode 100644 index 000000000000..4e901b8ade06 --- /dev/null +++ b/games/rstnode/rst-client/src/input.rs @@ -0,0 +1,56 @@ +//! Advanced input handler + +use ggez::{ + event::EventHandler, + input::mouse::{self, MouseButton}, + Context, GameResult, +}; +use mint::Point2; + +pub struct InputHandle { + /// The mouse position on the viewport + pub mouse_pos: Point2<f32>, + /// Whether the left mouse button is pressed this frame + pub left_pressed: bool, + /// Whether the right mouse button is pressed this frame + pub right_pressed: bool, + /// Set when pressing left mouse and unset when releasing it + pub drag_point: Option<Point2<f32>>, +} + +impl InputHandle { + pub fn new() -> Self { + Self { + mouse_pos: [0.0, 0.0].into(), + left_pressed: false, + right_pressed: false, + drag_point: None, + } + } + + /// Get the unprojected mouse coordinates + pub fn unproject(&self) -> Point2<f32> { + self.mouse_pos.clone(); + todo!() + } +} + +impl EventHandler for InputHandle { + fn update(&mut self, ctx: &mut Context) -> GameResult<()> { + self.mouse_pos = mouse::position(&ctx); + self.left_pressed = mouse::button_pressed(ctx, MouseButton::Left); + self.right_pressed = mouse::button_pressed(ctx, MouseButton::Right); + + // Only set the drag_point once and unset when we release Left button + if self.left_pressed && self.drag_point.is_none() { + self.drag_point = Some(self.mouse_pos.clone()); + } else if !self.left_pressed { + self.drag_point = None; + } + + Ok(()) + } + fn draw(&mut self, _: &mut Context) -> GameResult<()> { + panic!("Don't draw the input handle!"); + } +} |