diff --git a/src/game/runtime.rs b/src/game/runtime.rs index 645495f..a0ab185 100644 --- a/src/game/runtime.rs +++ b/src/game/runtime.rs @@ -1,5 +1,8 @@ use avian2d::prelude::*; -use bevy::prelude::*; +use bevy::{ + input::mouse::{AccumulatedMouseScroll, MouseScrollUnit}, + prelude::*, +}; use super::objects::Player; @@ -38,3 +41,18 @@ pub fn move_camera( ) { camera.translation = camera.translation.lerp(player.translation, 0.05); } + +pub fn zoom_camera( + mut camera: Single<&mut Projection, With>, + scroll: Res, +) -> Result { + let Projection::Orthographic(ref mut projection) = **camera else { + return Err("Default camera was not orthographic".into()); + }; + let scroll_type_multiplier = match scroll.unit { + MouseScrollUnit::Line => 0.01, + MouseScrollUnit::Pixel => 0.001, + }; + projection.scale = (projection.scale - scroll.delta.y * scroll_type_multiplier).clamp(0.1, 2.5); + Ok(()) +} diff --git a/src/lib.rs b/src/lib.rs index b21b75b..2b74344 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,7 +5,7 @@ use clap::Parser; mod game; use game::{ - runtime::{move_camera, move_player, quit}, + runtime::{move_camera, move_player, quit, zoom_camera}, seed::Seed, setup::{setup_balls, setup_player, setup_pseudo_random, setup_ui, setup_walls}, }; @@ -44,7 +44,11 @@ impl Plugin for AppSettings { ) .add_systems( Update, - (move_player, quit.run_if(input_pressed(KeyCode::KeyQ))), + ( + move_player, + quit.run_if(input_pressed(KeyCode::KeyQ)), + zoom_camera, + ), ) .add_systems(PostUpdate, move_camera); }