2022-05-03 19:20:13 +00:00
|
|
|
|
use bevy_reflect::prelude::*;
|
2021-03-05 19:59:14 +00:00
|
|
|
|
use bevy_reflect::Reflect;
|
|
|
|
|
use bevy_utils::Duration;
|
|
|
|
|
|
|
|
|
|
/// A Stopwatch is a struct that track elapsed time when started.
|
|
|
|
|
///
|
|
|
|
|
/// # Examples
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
2022-05-26 00:27:18 +00:00
|
|
|
|
/// # use bevy_time::*;
|
2021-03-05 19:59:14 +00:00
|
|
|
|
/// use std::time::Duration;
|
|
|
|
|
/// let mut stopwatch = Stopwatch::new();
|
|
|
|
|
/// assert_eq!(stopwatch.elapsed_secs(), 0.0);
|
2021-04-16 19:13:08 +00:00
|
|
|
|
///
|
2021-03-05 19:59:14 +00:00
|
|
|
|
/// stopwatch.tick(Duration::from_secs_f32(1.0)); // tick one second
|
|
|
|
|
/// assert_eq!(stopwatch.elapsed_secs(), 1.0);
|
2021-04-16 19:13:08 +00:00
|
|
|
|
///
|
2021-03-05 19:59:14 +00:00
|
|
|
|
/// stopwatch.pause();
|
|
|
|
|
/// stopwatch.tick(Duration::from_secs_f32(1.0)); // paused stopwatches don't tick
|
|
|
|
|
/// assert_eq!(stopwatch.elapsed_secs(), 1.0);
|
2021-04-16 19:13:08 +00:00
|
|
|
|
///
|
2021-03-05 19:59:14 +00:00
|
|
|
|
/// stopwatch.reset(); // reset the stopwatch
|
|
|
|
|
/// assert!(stopwatch.paused());
|
|
|
|
|
/// assert_eq!(stopwatch.elapsed_secs(), 0.0);
|
|
|
|
|
/// ```
|
2022-02-03 23:56:57 +00:00
|
|
|
|
#[derive(Clone, Debug, Default, Reflect)]
|
2022-05-03 19:20:13 +00:00
|
|
|
|
#[reflect(Default)]
|
2021-03-05 19:59:14 +00:00
|
|
|
|
pub struct Stopwatch {
|
|
|
|
|
elapsed: Duration,
|
|
|
|
|
paused: bool,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Stopwatch {
|
|
|
|
|
/// Create a new unpaused `Stopwatch` with no elapsed time.
|
|
|
|
|
///
|
|
|
|
|
/// # Examples
|
|
|
|
|
/// ```
|
2022-05-26 00:27:18 +00:00
|
|
|
|
/// # use bevy_time::*;
|
2021-03-05 19:59:14 +00:00
|
|
|
|
/// let stopwatch = Stopwatch::new();
|
|
|
|
|
/// assert_eq!(stopwatch.elapsed_secs(), 0.0);
|
|
|
|
|
/// assert_eq!(stopwatch.paused(), false);
|
|
|
|
|
/// ```
|
|
|
|
|
pub fn new() -> Self {
|
|
|
|
|
Default::default()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Returns the elapsed time since the last [`reset`](Stopwatch::reset)
|
|
|
|
|
/// of the stopwatch.
|
|
|
|
|
///
|
|
|
|
|
/// # Examples
|
|
|
|
|
/// ```
|
2022-05-26 00:27:18 +00:00
|
|
|
|
/// # use bevy_time::*;
|
2021-03-05 19:59:14 +00:00
|
|
|
|
/// use std::time::Duration;
|
|
|
|
|
/// let mut stopwatch = Stopwatch::new();
|
|
|
|
|
/// stopwatch.tick(Duration::from_secs(1));
|
|
|
|
|
/// assert_eq!(stopwatch.elapsed(), Duration::from_secs(1));
|
|
|
|
|
/// ```
|
2022-01-02 20:36:40 +00:00
|
|
|
|
///
|
|
|
|
|
/// # See Also
|
|
|
|
|
///
|
2022-09-26 21:47:31 +00:00
|
|
|
|
/// [`elapsed_secs`](Stopwatch::elapsed_secs) - if an `f32` value is desirable instead.
|
|
|
|
|
/// [`elapsed_secs_f64`](Stopwatch::elapsed_secs_f64) - if an `f64` is desirable instead.
|
2021-03-05 19:59:14 +00:00
|
|
|
|
#[inline]
|
|
|
|
|
pub fn elapsed(&self) -> Duration {
|
|
|
|
|
self.elapsed
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-02 20:36:40 +00:00
|
|
|
|
/// Returns the elapsed time since the last [`reset`](Stopwatch::reset)
|
|
|
|
|
/// of the stopwatch, in seconds.
|
|
|
|
|
///
|
|
|
|
|
/// # Examples
|
|
|
|
|
/// ```
|
2022-05-26 00:27:18 +00:00
|
|
|
|
/// # use bevy_time::*;
|
2022-01-02 20:36:40 +00:00
|
|
|
|
/// use std::time::Duration;
|
|
|
|
|
/// let mut stopwatch = Stopwatch::new();
|
|
|
|
|
/// stopwatch.tick(Duration::from_secs(1));
|
|
|
|
|
/// assert_eq!(stopwatch.elapsed_secs(), 1.0);
|
|
|
|
|
/// ```
|
|
|
|
|
///
|
|
|
|
|
/// # See Also
|
|
|
|
|
///
|
|
|
|
|
/// [`elapsed`](Stopwatch::elapsed) - if a `Duration` is desirable instead.
|
2022-09-26 21:47:31 +00:00
|
|
|
|
/// [`elapsed_secs_f64`](Stopwatch::elapsed_secs_f64) - if an `f64` is desirable instead.
|
2021-03-05 19:59:14 +00:00
|
|
|
|
#[inline]
|
|
|
|
|
pub fn elapsed_secs(&self) -> f32 {
|
|
|
|
|
self.elapsed().as_secs_f32()
|
|
|
|
|
}
|
|
|
|
|
|
2022-09-13 22:41:29 +00:00
|
|
|
|
/// Returns the elapsed time since the last [`reset`](Stopwatch::reset)
|
|
|
|
|
/// of the stopwatch, in seconds, as f64.
|
|
|
|
|
///
|
|
|
|
|
/// # See Also
|
|
|
|
|
///
|
|
|
|
|
/// [`elapsed`](Stopwatch::elapsed) - if a `Duration` is desirable instead.
|
2022-09-26 21:47:31 +00:00
|
|
|
|
/// [`elapsed_secs`](Stopwatch::elapsed_secs) - if an `f32` is desirable instead.
|
2022-09-13 22:41:29 +00:00
|
|
|
|
#[inline]
|
|
|
|
|
pub fn elapsed_secs_f64(&self) -> f64 {
|
|
|
|
|
self.elapsed().as_secs_f64()
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-05 19:59:14 +00:00
|
|
|
|
/// Sets the elapsed time of the stopwatch.
|
|
|
|
|
///
|
|
|
|
|
/// # Examples
|
|
|
|
|
/// ```
|
2022-05-26 00:27:18 +00:00
|
|
|
|
/// # use bevy_time::*;
|
2021-03-05 19:59:14 +00:00
|
|
|
|
/// use std::time::Duration;
|
|
|
|
|
/// let mut stopwatch = Stopwatch::new();
|
|
|
|
|
/// stopwatch.set_elapsed(Duration::from_secs_f32(1.0));
|
|
|
|
|
/// assert_eq!(stopwatch.elapsed_secs(), 1.0);
|
|
|
|
|
/// ```
|
|
|
|
|
#[inline]
|
|
|
|
|
pub fn set_elapsed(&mut self, time: Duration) {
|
|
|
|
|
self.elapsed = time;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Advance the stopwatch by `delta` seconds.
|
|
|
|
|
/// If the stopwatch is paused, ticking will not have any effect
|
|
|
|
|
/// on elapsed time.
|
|
|
|
|
///
|
|
|
|
|
/// # Examples
|
|
|
|
|
/// ```
|
2022-05-26 00:27:18 +00:00
|
|
|
|
/// # use bevy_time::*;
|
2021-03-05 19:59:14 +00:00
|
|
|
|
/// use std::time::Duration;
|
|
|
|
|
/// let mut stopwatch = Stopwatch::new();
|
|
|
|
|
/// stopwatch.tick(Duration::from_secs_f32(1.5));
|
|
|
|
|
/// assert_eq!(stopwatch.elapsed_secs(), 1.5);
|
|
|
|
|
/// ```
|
|
|
|
|
pub fn tick(&mut self, delta: Duration) -> &Self {
|
|
|
|
|
if !self.paused() {
|
|
|
|
|
self.elapsed += delta;
|
|
|
|
|
}
|
|
|
|
|
self
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Pauses the stopwatch. Any call to [`tick`](Stopwatch::tick) while
|
|
|
|
|
/// paused will not have any effect on the elapsed time.
|
|
|
|
|
///
|
|
|
|
|
/// # Examples
|
|
|
|
|
/// ```
|
2022-05-26 00:27:18 +00:00
|
|
|
|
/// # use bevy_time::*;
|
2021-03-05 19:59:14 +00:00
|
|
|
|
/// use std::time::Duration;
|
|
|
|
|
/// let mut stopwatch = Stopwatch::new();
|
|
|
|
|
/// stopwatch.pause();
|
|
|
|
|
/// stopwatch.tick(Duration::from_secs_f32(1.5));
|
|
|
|
|
/// assert!(stopwatch.paused());
|
|
|
|
|
/// assert_eq!(stopwatch.elapsed_secs(), 0.0);
|
|
|
|
|
/// ```
|
|
|
|
|
#[inline]
|
|
|
|
|
pub fn pause(&mut self) {
|
|
|
|
|
self.paused = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Unpauses the stopwatch. Resume the effect of ticking on elapsed time.
|
|
|
|
|
///
|
|
|
|
|
/// # Examples
|
|
|
|
|
/// ```
|
2022-05-26 00:27:18 +00:00
|
|
|
|
/// # use bevy_time::*;
|
2021-03-05 19:59:14 +00:00
|
|
|
|
/// use std::time::Duration;
|
|
|
|
|
/// let mut stopwatch = Stopwatch::new();
|
|
|
|
|
/// stopwatch.pause();
|
|
|
|
|
/// stopwatch.tick(Duration::from_secs_f32(1.0));
|
|
|
|
|
/// stopwatch.unpause();
|
|
|
|
|
/// stopwatch.tick(Duration::from_secs_f32(1.0));
|
|
|
|
|
/// assert!(!stopwatch.paused());
|
|
|
|
|
/// assert_eq!(stopwatch.elapsed_secs(), 1.0);
|
|
|
|
|
/// ```
|
|
|
|
|
#[inline]
|
|
|
|
|
pub fn unpause(&mut self) {
|
|
|
|
|
self.paused = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Returns `true` if the stopwatch is paused.
|
|
|
|
|
///
|
|
|
|
|
/// # Examples
|
|
|
|
|
/// ```
|
2022-05-26 00:27:18 +00:00
|
|
|
|
/// # use bevy_time::*;
|
2021-03-05 19:59:14 +00:00
|
|
|
|
/// let mut stopwatch = Stopwatch::new();
|
|
|
|
|
/// assert!(!stopwatch.paused());
|
|
|
|
|
/// stopwatch.pause();
|
|
|
|
|
/// assert!(stopwatch.paused());
|
|
|
|
|
/// stopwatch.unpause();
|
|
|
|
|
/// assert!(!stopwatch.paused());
|
|
|
|
|
/// ```
|
|
|
|
|
#[inline]
|
|
|
|
|
pub fn paused(&self) -> bool {
|
|
|
|
|
self.paused
|
|
|
|
|
}
|
|
|
|
|
|
2022-09-18 23:36:05 +00:00
|
|
|
|
/// Resets the stopwatch. The reset doesn’t affect the paused state of the stopwatch.
|
2021-03-05 19:59:14 +00:00
|
|
|
|
///
|
|
|
|
|
/// # Examples
|
|
|
|
|
/// ```
|
2022-05-26 00:27:18 +00:00
|
|
|
|
/// # use bevy_time::*;
|
2021-03-05 19:59:14 +00:00
|
|
|
|
/// use std::time::Duration;
|
|
|
|
|
/// let mut stopwatch = Stopwatch::new();
|
|
|
|
|
/// stopwatch.tick(Duration::from_secs_f32(1.5));
|
|
|
|
|
/// stopwatch.reset();
|
|
|
|
|
/// assert_eq!(stopwatch.elapsed_secs(), 0.0);
|
|
|
|
|
/// ```
|
|
|
|
|
#[inline]
|
|
|
|
|
pub fn reset(&mut self) {
|
|
|
|
|
self.elapsed = Default::default();
|
|
|
|
|
}
|
|
|
|
|
}
|