debug cam

This commit is contained in:
2026-09-18 17:40:09 +02:00
parent c9d43770b8
commit 582f9ed226
+113
View File
@@ -0,0 +1,113 @@
use bevy::prelude::*;
use crate::{camera::MainCamera, player::Player};
#[derive(Component)]
pub struct DebugCamera;
fn spawn_debug_camera(mut commands: Commands) {
commands.spawn((
DebugCamera,
Camera2d,
Camera {
is_active: false,
..default()
},
));
}
fn setup_debug_camera(mut camera: Single<&mut Projection, With<DebugCamera>>) {
if let Projection::Orthographic(ref mut projection) = **camera {
projection.scale = 4.0;
}
}
fn toggle_debug_camera(
input: Res<ButtonInput<KeyCode>>,
mut main_camera: Single<&mut Camera, (With<MainCamera>, Without<DebugCamera>)>,
mut debug_camera: Single<&mut Camera, (With<DebugCamera>, Without<MainCamera>)>,
) {
if input.just_pressed(KeyCode::Tab) {
main_camera.is_active = !main_camera.is_active;
debug_camera.is_active = !debug_camera.is_active;
}
}
fn follow_player_debug(
player: Single<&Transform, (With<Player>, Without<DebugCamera>)>,
mut debug_camera: Single<&mut Transform, (With<DebugCamera>, Without<Player>)>,
) {
debug_camera.translation.y = player.translation.y;
}
enum FrameSide {
Top,
Bottom,
Left,
Right,
}
#[derive(Component)]
struct FramePart(FrameSide);
fn spawn_debug_frame(mut commands: Commands) {
for side in [
FrameSide::Top,
FrameSide::Bottom,
FrameSide::Left,
FrameSide::Right,
] {
let size = match side {
FrameSide::Top | FrameSide::Bottom => Vec2::new(1936.0, 8.0),
FrameSide::Left | FrameSide::Right => Vec2::new(8.0, 1096.0),
};
commands.spawn((
FramePart(side),
Sprite::from_color(Color::srgb(1.0, 0.0, 0.0), size),
Visibility::Hidden,
));
}
}
fn draw_view_frame(
main_camera: Single<&Transform, (With<MainCamera>, Without<DebugCamera>)>,
debug_camera: Single<&Camera, (With<DebugCamera>, Without<MainCamera>)>,
mut frame: Query<
(&FramePart, &mut Transform, &mut Visibility),
(Without<MainCamera>, Without<DebugCamera>),
>,
) {
let center = main_camera.translation;
let half_width = 960.0;
let half_height = 540.0;
let visible = if debug_camera.is_active {
Visibility::Visible
} else {
Visibility::Hidden
};
for (frame_part, mut frame_transform, mut visibility) in &mut frame {
let position = match frame_part.0 {
FrameSide::Top => Vec3::new(center.x, center.y + half_height, 10.0),
FrameSide::Bottom => Vec3::new(center.x, center.y - half_height, 10.0),
FrameSide::Left => Vec3::new(center.x - half_width, center.y, 10.0),
FrameSide::Right => Vec3::new(center.x + half_width, center.y, 10.0),
};
frame_transform.translation = position;
*visibility = visible;
}
}
pub struct DebugPlugin;
impl Plugin for DebugPlugin {
fn build(&self, app: &mut App) {
app.add_systems(Startup, spawn_debug_camera)
.add_systems(Startup, setup_debug_camera.after(spawn_debug_camera))
.add_systems(Startup, spawn_debug_frame)
.add_systems(Update, draw_view_frame)
.add_systems(Update, follow_player_debug)
.add_systems(Update, toggle_debug_camera);
}
}