diff --git a/src/bounds.rs b/src/bounds.rs new file mode 100644 index 0000000..f24fca3 --- /dev/null +++ b/src/bounds.rs @@ -0,0 +1,25 @@ +use bevy::prelude::*; + +use crate::{collision::Collider, player::Player}; + +fn constrain_player( + mut player: Single<(&Collider, &mut Transform), With>, + camera: Single<&Camera, With>, +) { + let viewport = camera + .logical_viewport_size() + .unwrap_or(Vec2::new(1920.0, 1080.0)); + let half_width = player.0.size.x / 2.0; + let border = viewport.x / 2.0 - half_width; + + // Restrict player position + player.1.translation.x = player.1.translation.x.clamp(-border, border); +} + +pub struct BoundsPlugin; + +impl Plugin for BoundsPlugin { + fn build(&self, app: &mut App) { + app.add_systems(Update, constrain_player); + } +} diff --git a/src/main.rs b/src/main.rs index 3aabc46..8eaaae1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,14 @@ use bevy::{prelude::*, window::PresentMode}; use crate::background::BackgroundPlugin; +use crate::bounds::BoundsPlugin; use crate::camera::CameraPlugin; use crate::collision::CollisionPlugin; use crate::obstacle::ObstaclePlugin; use crate::player::PlayerPlugin; mod background; +mod bounds; mod camera; mod collision; mod obstacle; @@ -28,5 +30,6 @@ fn main() { .add_plugins(CameraPlugin) // Camera .add_plugins(CollisionPlugin) // Collisions .add_plugins(ObstaclePlugin) + .add_plugins(BoundsPlugin) .run(); }