bevy-playground/src/movement.rs

41 lines
1.2 KiB
Rust

use bevy::prelude::*;
#[derive(Component, Deref, DerefMut, Debug, Default)]
pub struct Velocity(pub Vec2);
#[derive(Component, Deref, DerefMut, Debug, Default)]
pub struct Heading(pub Vec2);
#[derive(Component, Deref, DerefMut, Debug, Default)]
pub struct Speed(pub f32);
#[derive(Component, Deref, DerefMut, Debug, Default)]
pub struct Height(pub f32);
#[derive(Component, Debug, Default)]
pub struct YSortable;
pub fn resolve_velocity(mut query: Query<(&Velocity, &mut Transform)>, time: Res<Time>) {
for (velocity, mut transform) in query.iter_mut() {
transform.translation += (velocity.0 * time.delta_seconds()).extend(0.);
}
}
pub fn update_velocity_by_heading(mut query: Query<(&mut Velocity, &Speed, &Heading)>) {
if let Ok((mut velocity, speed, heading)) = query.get_single_mut() {
**velocity = heading.normalize_or_zero() * (**speed);
}
}
pub fn ysort(mut q: Query<(&mut Transform, Option<&Height>), With<YSortable>>) {
q.iter_mut()
.for_each(|(mut tf, z)| tf.translation.z = -tf.translation.y - z.map(|z| z.0).unwrap_or(0.))
}
#[derive(Bundle, Debug, Default)]
pub struct Mover {
pub velocity: Velocity,
pub heading: Heading,
pub speed: Speed,
}