From e6a00779e994da17db83dde0962aca9098ddc211 Mon Sep 17 00:00:00 2001 From: CoCo_Sol Date: Sun, 31 Mar 2024 22:29:48 +0000 Subject: [PATCH] Add movement with the mouse (#90) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-on: https://git.tipragot.fr/fish-canard/border-wars/pulls/90 Reviewed-by: Raphaƫl Co-authored-by: CoCo_Sol Co-committed-by: CoCo_Sol --- crates/border-wars/src/camera.rs | 37 ++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/crates/border-wars/src/camera.rs b/crates/border-wars/src/camera.rs index 6c2b50b..c19a3e2 100644 --- a/crates/border-wars/src/camera.rs +++ b/crates/border-wars/src/camera.rs @@ -46,7 +46,11 @@ impl Plugin for CameraPlugin { fn build(&self, app: &mut App) { app.add_systems(Startup, init_camera) .add_systems(Startup, init_resources_for_camera) - .add_systems(Update, movement_system.run_if(in_state(CurrentScene::Game))) + .add_systems( + Update, + (keyboard_movement_system, mouse_movement_system) + .run_if(in_state(CurrentScene::Game)), + ) .add_systems(Update, scale_system.run_if(in_state(CurrentScene::Game))); } } @@ -78,7 +82,7 @@ fn init_resources_for_camera(mut commands: Commands) { } /// Moves the camera with keyboard input. -fn movement_system( +fn keyboard_movement_system( mut query: Query<&mut Transform, With>, keys: Res>, keys_settings: Res, @@ -100,6 +104,35 @@ fn movement_system( } } +/// Moves the camera with mouse input. +fn mouse_movement_system( + mouse_button_input: Res>, + mut query: Query<&mut Transform, With>, + windows: Query<&Window>, + mut last_position: Local>, +) { + let window = windows.get_single().expect("Main window not found"); + let Some(position) = window.cursor_position() else { + return; + }; + + if mouse_button_input.just_pressed(MouseButton::Right) { + *last_position = Some(position); + } + + if mouse_button_input.just_released(MouseButton::Right) { + *last_position = None; + } + + if let Some(old_position) = *last_position { + for mut transform in query.iter_mut() { + let offset = (old_position - position).extend(0.0) * Vec3::new(1., -1., 1.); + transform.translation += offset; + } + *last_position = Some(position); + } +} + /// Scales the view with mouse input. fn scale_system( mut scroll_event: EventReader,