diff --git a/crates/border-wars/src/camera.rs b/crates/border-wars/src/camera.rs index 36a7ae6..2f16056 100644 --- a/crates/border-wars/src/camera.rs +++ b/crates/border-wars/src/camera.rs @@ -1,13 +1,24 @@ //! TODO +use bevy::input::mouse::MouseScrollUnit; use bevy::prelude::*; +use bevy::input::mouse::MouseWheel; + +/// TODO +const CAMERRA_SPEED: f32 = 10.; +const CAMERRA_SPEED_ZOOM: f32 = 0.1; +const SMOOTHING: f32 = 0.5; +const MIN_ZOOM: f32 = 0.5; +const MAX_ZOOM: f32 = 5.; /// TODO pub struct CameraPlugin; impl Plugin for CameraPlugin { fn build(&self, app: &mut App) { - app.add_systems(Startup, init_camera); + app.add_systems(Startup, init_camera) + .add_systems(Update, handle_movement) + .add_systems(Update, zoom_system); } } @@ -16,6 +27,41 @@ fn init_camera(mut commands: Commands) { commands.spawn(Camera2dBundle::default()); } -fn movement_system(){} -fn zoom_system(){} +fn handle_movement(mut query: Query<&mut Transform, With>, keys: Res>,){ + for mut camera_transform in query.iter_mut() { + let mut target = camera_transform.translation.clone(); + if keys.pressed(KeyCode::Z) { + target.y += CAMERRA_SPEED; + } + else if keys.pressed(KeyCode::S) { + target.y -= CAMERRA_SPEED; + } + + if keys.pressed(KeyCode::D) { + target.x += CAMERRA_SPEED; + } + else if keys.pressed(KeyCode::Q) { + target.x -= CAMERRA_SPEED; + } + camera_transform.translation = camera_transform + .translation + .lerp(target, SMOOTHING); + } +} + +fn zoom_system(mut scroll_evr: EventReader, mut query: Query<&mut OrthographicProjection, With>){ + for ev in scroll_evr.read() { + for mut camera_projection in query.iter_mut() { + + if ev.unit == MouseScrollUnit::Pixel { + return; + } + + if camera_projection.scale + ev.y * CAMERRA_SPEED_ZOOM > MIN_ZOOM && camera_projection.scale + ev.y * CAMERRA_SPEED_ZOOM < MAX_ZOOM { + + camera_projection.scale += ev.y * CAMERRA_SPEED_ZOOM; + } + } + } +}