use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Animation {
pub frames: Vec<usize>,
pub current_frame: usize,
pub current_relative_frame: usize,
pub frame_duration: f32,
pub elapsed: f32,
pub looping: bool,
}
impl Animation {
pub fn new(frames: Vec<usize>, frame_duration: f32, looping: bool) -> Self {
Self {
frames,
current_frame: 0,
current_relative_frame: 0,
frame_duration,
elapsed: 0.0,
looping,
}
}
pub fn update(&mut self, dt: f32) {
self.elapsed += dt;
if self.elapsed >= self.frame_duration {
self.elapsed = 0.0;
self.current_relative_frame += 1;
if self.current_relative_frame >= self.frames.len() {
if self.looping {
self.current_relative_frame = 0;
} else {
self.current_relative_frame = self.frames.len() - 1;
}
}
if self.current_relative_frame < self.frames.len() {
self.current_frame = self.frames[self.current_relative_frame];
}
}
}
pub fn get_current_absolute_frame(&self) -> usize {
self.current_frame
}
pub fn reset(&mut self) {
self.current_frame = 0;
self.current_relative_frame = 0;
self.elapsed = 0.0;
}
}