Compare commits

...

2 Commits

Author SHA1 Message Date
43b163fbd9 Make snap turns more reliable, and avoid queuing unnecessary direction removal.
All checks were successful
continuous-integration/drone/push Build is passing
2022-09-21 13:56:57 -05:00
0a38e65d26 Add yaw() to Transform. 2022-09-21 13:56:00 -05:00
2 changed files with 30 additions and 17 deletions

View File

@ -479,6 +479,17 @@ impl From<&dyn PointLike> for (i32, i32) {
}
}
pub trait TransformExt {
fn yaw(&self) -> Angle;
}
impl TransformExt for Transform {
fn yaw(&self) -> Angle {
let forward = self.right();
Angle::Radians(forward.y.atan2(forward.x))
}
}
pub trait GlobalTransformExt {
fn yaw(&self) -> Angle;

View File

@ -58,7 +58,7 @@ struct SnapTimer(Timer);
impl Default for SnapTimer {
fn default() -> Self {
Self(Timer::from_seconds(0.25, false))
Self(Timer::from_seconds(0.2, false))
}
}
@ -171,8 +171,9 @@ fn snap(
>,
) -> Result<(), Box<dyn Error>> {
for (entity, actions, mut transform, mut velocity, direction) in query.iter_mut() {
if actions.just_pressed(NavigationAction::SnapLeft) {
println!("snap left");
if snap_timers.contains_key(&entity) {
continue;
} else if actions.pressed(NavigationAction::SnapLeft) {
snap_timers.insert(entity, SnapTimer::default());
transform.rotation = Quat::from_rotation_z(match direction {
CardinalDirection::North => PI,
@ -181,9 +182,7 @@ fn snap(
CardinalDirection::West => -PI / 2.,
});
velocity.angvel = 0.;
}
if actions.just_pressed(NavigationAction::SnapRight) {
println!("Snap right");
} else if actions.pressed(NavigationAction::SnapRight) {
snap_timers.insert(entity, SnapTimer::default());
transform.rotation = Quat::from_rotation_z(match direction {
CardinalDirection::North => 0.,
@ -192,18 +191,15 @@ fn snap(
CardinalDirection::West => PI / 2.,
});
velocity.angvel = 0.;
}
if actions.just_pressed(NavigationAction::SnapCardinal) {
} else if actions.pressed(NavigationAction::SnapReverse) {
snap_timers.insert(entity, SnapTimer::default());
transform.rotate(Quat::from_rotation_z(PI));
velocity.angvel = 0.;
} else if actions.pressed(NavigationAction::SnapCardinal) {
let yaw: Angle = direction.into();
let yaw = yaw.radians();
transform.rotation = Quat::from_rotation_z(yaw);
velocity.angvel = 0.;
tts.speak(direction.to_string(), true)?;
}
if actions.just_pressed(NavigationAction::SnapReverse) {
snap_timers.insert(entity, SnapTimer::default());
transform.rotate(Quat::from_rotation_z(PI));
velocity.angvel = 0.;
}
}
@ -237,13 +233,19 @@ fn update_direction(
}
}
fn remove_direction(mut commands: Commands, removed: RemovedComponents<Transform>) {
fn remove_direction(
mut commands: Commands,
removed: RemovedComponents<Transform>,
directions: Query<&CardinalDirection>,
) {
for entity in removed.iter() {
if directions.contains(entity) {
commands.run_if_exists(entity, |mut entity| {
entity.remove::<CardinalDirection>();
});
}
}
}
fn speak_direction(
mut tts: ResMut<Tts>,