use image::ImageError;
pub struct SpriteSheet {
pub width: u32, pub height: u32, pub rgba_data: Vec<u8>,
pub frame_width: u32, pub frame_height: u32,}
impl SpriteSheet {
pub fn load(path: &str, frame_width: u32, frame_height: u32) -> Result<Self, ImageError> {
let img = image::open(path)?;
let rgba_image = img.to_rgba8();
Ok(Self {
width: img.width(),
height: img.height(),
rgba_data: rgba_image.into_raw(),
frame_width,
frame_height,
})
}
pub fn create_placeholder() -> Self {
const FRAME_WIDTH: u32 = 32;
const FRAME_HEIGHT: u32 = 32;
const NUM_FRAMES: u32 = 2;
let width = FRAME_WIDTH * NUM_FRAMES;
let height = FRAME_HEIGHT;
let mut rgba_data = vec![0; (width * height * 4) as usize];
for y in 0..FRAME_HEIGHT {
for x in 0..FRAME_WIDTH {
let index = ((y * width) + x) as usize * 4;
if (x + y) % 2 == 0 {
rgba_data[index..index + 4].copy_from_slice(&[255, 0, 255, 255]);
} else {
rgba_data[index..index + 4].copy_from_slice(&[0, 0, 0, 255]);
}
}
}
for y in 0..FRAME_HEIGHT {
for x in 0..FRAME_WIDTH {
let index = ((y * width) + (x + FRAME_WIDTH)) as usize * 4;
if (x + y) % 2 == 0 {
rgba_data[index..index + 4].copy_from_slice(&[0, 255, 255, 255]);
} else {
rgba_data[index..index + 4].copy_from_slice(&[255, 255, 255, 255]);
}
}
}
Self { width, height, rgba_data, frame_width: FRAME_WIDTH, frame_height: FRAME_HEIGHT }
}
pub fn num_frames(&self) -> usize {
(self.width / self.frame_width) as usize
}
}