Skip to content

Commit

Permalink
feat(render): add camera scale adjustment on window resize
Browse files Browse the repository at this point in the history
Implement a new system to adjust the camera scale when the window is resized, ensuring
the board always fits within the viewport. The `adjust_camera_scale` function calculates
the appropriate scale based on the window size and the board dimensions, maintaining
a consistent zoom level.
  • Loading branch information
ShenMian committed Jun 10, 2024
1 parent 2f80815 commit ccb8094
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 14 deletions.
5 changes: 3 additions & 2 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,19 @@ mod components;
mod database;
mod events;
mod input_map;
mod utils;
mod plugins;
mod resources;
mod solve;
mod state;
mod systems;
mod test;
mod utils;

use bevy::prelude::*;
use bevy_kira_audio::prelude::*;
use events::*;
use input_map::*;
use leafwing_input_manager::prelude::*;
use utils::*;
use plugins::performance_matrix::*;
use resources::*;
use state::*;
Expand All @@ -32,6 +31,7 @@ use systems::input::*;
use systems::level::*;
use systems::render::*;
use systems::ui::*;
use utils::*;

const CONFIG_FILE_PATH: &str = "config.toml";

Expand Down Expand Up @@ -97,6 +97,7 @@ fn main() {
update_button_state,
handle_audio_event,
adjust_viewport,
adjust_camera_scale,
save_config.run_if(resource_changed_or_removed::<Config>()),
(button_input_to_action, handle_actions).chain(),
),
Expand Down
2 changes: 1 addition & 1 deletion src/resources.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ use serde::{Deserialize, Serialize};
use soukoban::{Level, Map};

use crate::database;
use crate::utils::PushState;
use crate::solve::solver::*;
use crate::utils::PushState;
use soukoban::direction::Direction;

use std::collections::{HashMap, VecDeque};
Expand Down
2 changes: 1 addition & 1 deletion src/systems/input.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ use nalgebra::Vector2;
use soukoban::{Level, Tiles};

use crate::events::*;
use crate::utils::PushState;
use crate::resources::*;
use crate::solve::solver::*;
use crate::systems::level::*;
use crate::utils::PushState;
use crate::AppState;
use crate::{components::*, Action};
use soukoban::direction::Direction;
Expand Down
11 changes: 2 additions & 9 deletions src/systems/level.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use soukoban::Level;
use soukoban::Tiles;

use crate::board;
use crate::calculate_camera_default_scale;
use crate::components::*;
use crate::database;
use crate::resources::*;
Expand Down Expand Up @@ -80,15 +81,7 @@ pub fn spawn_board(
transform.translation.x = (board_size.x - tile_size.x) / 2.0;
transform.translation.y = (board_size.y + tile_size.y) / 2.0;

let window = window.single();
let width_scale = board_size.x / window.resolution.width();
let height_scale = board_size.y / window.resolution.height();
let scale = if width_scale > height_scale {
width_scale
} else {
height_scale
};
main_camera.target_scale = scale / 0.9;
main_camera.target_scale = calculate_camera_default_scale(window.single(), &level);

// despawn the previous `Board`
commands.entity(board.single()).despawn_recursive();
Expand Down
34 changes: 33 additions & 1 deletion src/systems/render.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
use benimator::{Animation, FrameRate};
use bevy::prelude::*;
use bevy::window::WindowResized;
use bevy::winit::WinitWindows;
use nalgebra::Vector2;
use soukoban::direction::Direction;
use soukoban::Level;

use crate::components::*;
use crate::events::*;
use crate::resources::*;
use soukoban::direction::Direction;

use std::cmp::Ordering;
use std::collections::HashSet;
Expand Down Expand Up @@ -249,3 +251,33 @@ pub fn update_grid_position_from_board(
}
}
}

pub fn adjust_camera_scale(
mut camera: Query<&mut MainCamera>,
window: Query<&Window>,
board: Query<&Board>,
mut events: EventReader<WindowResized>,
) {
if events.is_empty() {
return;
}
events.clear();

camera.single_mut().target_scale =
calculate_camera_default_scale(window.single(), &board.single().board.level);
}

/// Adjust the camera zoom to fit the entire board.
pub fn calculate_camera_default_scale(window: &Window, level: &Level) -> f32 {
let tile_size = Vector2::new(128.0, 128.0);
let board_size = tile_size.x * level.dimensions().map(|x| x as f32);

let width_scale = board_size.x / window.resolution.width();
let height_scale = board_size.y / window.resolution.height();
let scale = if width_scale > height_scale {
width_scale
} else {
height_scale
};
scale / 0.9
}

0 comments on commit ccb8094

Please sign in to comment.