#![cfg_attr(docsrs, feature(doc_auto_cfg))]
#![cfg_attr(not(feature = "std"), no_std)]
use core::time::Duration;
#[deprecated(since = "0.1.1", note = "`Animation` is renamed to `AnimationState`")]
pub type Animation = AnimationState;
#[derive(Debug, Clone)]
pub struct AnimationState {
frame_count: usize,
current_frame: usize,
frame_duration: Duration,
elapsed: Duration,
}
impl AnimationState {
#[must_use]
pub fn from_frame_duration(frame_count: usize, frame_duration: Duration) -> Self {
assert!(!frame_duration.is_zero(), "frame-duration must not be zero");
Self {
frame_count,
current_frame: 0,
frame_duration,
elapsed: Duration::ZERO,
}
}
#[must_use]
pub fn from_frame_duration_secs(frame_count: usize, frame_duration: f32) -> Self {
Self::from_frame_duration(frame_count, Duration::from_secs_f32(frame_duration))
}
pub fn update(&mut self, delta_time: Duration) {
self.elapsed += delta_time;
while self.elapsed >= self.frame_duration {
self.elapsed -= self.frame_duration;
self.current_frame += 1;
}
self.current_frame %= self.frame_count;
}
pub fn update_secs(&mut self, delta_time: f32) {
self.update(Duration::from_secs_f32(delta_time));
}
#[must_use]
pub fn current_frame(&self) -> usize {
self.current_frame
}
}