use crate::prelude::*;
use bevy::prelude::*;
#[derive(Component, Reflect, Copy, Clone, Debug)]
#[reflect(Component, Debug)]
#[require(Visibility, Transform, TiledName)]
pub enum TiledLayer {
Tiles,
Objects,
Image,
Group,
}
#[derive(Component, Reflect, Clone, Debug, Copy)]
#[reflect(Component, Debug)]
pub struct TiledLayerParallax {
pub parallax_x: f32,
pub parallax_y: f32,
pub base_position: Vec2,
}
#[derive(Component, Reflect, Clone, Debug, Copy)]
#[reflect(Component, Debug)]
pub struct TiledParallaxCamera;
pub(crate) fn plugin(app: &mut App) {
app.register_type::<TiledLayer>();
app.register_type::<TiledLayerParallax>();
app.register_type::<TiledParallaxCamera>();
app.add_systems(
Update,
update_layer_parallax.in_set(TiledUpdateSystems::UpdateParallaxLayers),
);
}
fn update_layer_parallax(
camera_query: Query<&Transform, (With<TiledParallaxCamera>, Changed<Transform>)>,
mut layer_query: Query<(&TiledLayerParallax, &mut Transform), Without<TiledParallaxCamera>>,
) {
let Ok(camera_transform) = camera_query.single() else {
return;
};
for (parallax, mut transform) in layer_query.iter_mut() {
let camera_position = Vec2::new(
camera_transform.translation.x,
camera_transform.translation.y,
);
if parallax.parallax_x != 1.0 {
let offset_x = camera_position.x * (1.0 - parallax.parallax_x);
transform.translation.x = parallax.base_position.x + offset_x;
}
if parallax.parallax_y != 1.0 {
let offset_y = camera_position.y * (1.0 - parallax.parallax_y);
transform.translation.y = parallax.base_position.y + offset_y;
}
}
}