aboutsummaryrefslogtreecommitdiff
path: root/games/rstnode/rst-client/src/input.rs
diff options
context:
space:
mode:
Diffstat (limited to 'games/rstnode/rst-client/src/input.rs')
-rw-r--r--games/rstnode/rst-client/src/input.rs56
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!");
+ }
+}