use monotonic_time_rs::{Millis, MillisDuration};
#[derive(Debug)]
pub struct TimeTick {
tick_duration: MillisDuration,
consumed_absolute_time: Millis,
max_tick_per_update: u16,
}
impl TimeTick {
pub const fn new(now: Millis, tick_duration: MillisDuration, max_tick_per_update: u16) -> Self {
TimeTick {
tick_duration,
consumed_absolute_time: now,
max_tick_per_update,
}
}
pub fn set_tick_duration(&mut self, tick_duration: MillisDuration) {
self.tick_duration = tick_duration;
}
pub fn reset(&mut self, now: Millis) {
self.consumed_absolute_time = now;
}
#[inline]
pub fn calculate_ticks(&mut self, now: Millis) -> u16 {
let time_ahead = now - self.consumed_absolute_time;
let tick_count = (time_ahead.as_millis() / self.tick_duration.as_millis()) as u16;
if tick_count >= self.max_tick_per_update {
self.max_tick_per_update
} else {
tick_count
}
}
#[inline]
pub fn performed_ticks(&mut self, tick_count: u16) {
self.consumed_absolute_time +=
MillisDuration::from_millis(tick_count as u64 * self.tick_duration.as_millis())
}
}