//! 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, /// 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>, } 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 { 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!"); } }