use anyhow::Result; use sdl2::rect::Rect; use sdl2::render::{Canvas, RenderTarget}; use std::collections::HashMap; use crate::entity::direction::Direction; use crate::texture::animated::AnimatedTexture; use crate::texture::sprite::SpriteAtlas; #[derive(Clone)] pub struct DirectionalAnimatedTexture { textures: HashMap, stopped_textures: HashMap, } impl DirectionalAnimatedTexture { pub fn new(textures: HashMap, stopped_textures: HashMap) -> Self { Self { textures, stopped_textures, } } pub fn tick(&mut self, dt: f32) { for texture in self.textures.values_mut() { texture.tick(dt); } } pub fn render( &self, canvas: &mut Canvas, atlas: &mut SpriteAtlas, dest: Rect, direction: Direction, ) -> Result<()> { if let Some(texture) = self.textures.get(&direction) { texture.render(canvas, atlas, dest) } else { Ok(()) } } pub fn render_stopped( &self, canvas: &mut Canvas, atlas: &mut SpriteAtlas, dest: Rect, direction: Direction, ) -> Result<()> { if let Some(texture) = self.stopped_textures.get(&direction) { texture.render(canvas, atlas, dest) } else { Ok(()) } } /// Returns true if the texture has a direction. #[allow(dead_code)] pub fn has_direction(&self, direction: Direction) -> bool { self.textures.contains_key(&direction) } /// Returns true if the texture has a stopped direction. #[allow(dead_code)] pub fn has_stopped_direction(&self, direction: Direction) -> bool { self.stopped_textures.contains_key(&direction) } /// Returns the number of textures. #[allow(dead_code)] pub fn texture_count(&self) -> usize { self.textures.len() } /// Returns the number of stopped textures. #[allow(dead_code)] pub fn stopped_texture_count(&self) -> usize { self.stopped_textures.len() } }