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 { pub trait GlobalTransformExt {
fn yaw(&self) -> Angle; fn yaw(&self) -> Angle;

View File

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