mirror of
https://github.com/Xevion/Pac-Man.git
synced 2025-12-06 21:15:48 -06:00
82 lines
2.2 KiB
Rust
82 lines
2.2 KiB
Rust
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<Direction, AnimatedTexture>,
|
|
stopped_textures: HashMap<Direction, AnimatedTexture>,
|
|
}
|
|
|
|
impl DirectionalAnimatedTexture {
|
|
pub fn new(textures: HashMap<Direction, AnimatedTexture>, stopped_textures: HashMap<Direction, AnimatedTexture>) -> 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<T: RenderTarget>(
|
|
&self,
|
|
canvas: &mut Canvas<T>,
|
|
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<T: RenderTarget>(
|
|
&self,
|
|
canvas: &mut Canvas<T>,
|
|
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()
|
|
}
|
|
}
|