Files
rust-smb/src/sprite.rs
2015-11-20 17:31:18 +01:00

76 lines
1.8 KiB
Rust

use sdl2::render::{Texture, Renderer};
use sdl2::rect::Rect;
pub trait Sprite {
fn update(&mut self, u64) {}
fn render(&self, &mut Renderer, &Rect);
}
pub struct StaticSprite<'a> {
texture: &'a Texture,
x: i32,
y: i32,
pub flip: (bool, bool)
}
impl<'a> StaticSprite<'a> {
pub fn new(texture: &'a Texture, x: i32, y: i32) -> StaticSprite<'a> {
StaticSprite {
texture: texture,
x: x,
y: y,
flip: (false, false)
}
}
}
impl<'a> Sprite for StaticSprite<'a> {
fn render(&self, drawer: &mut Renderer, destination: &Rect) {
drawer.copy_ex(self.texture, Some(Rect::new_unwrap(self.x, self.y, 16, 16)), Some(*destination), 0.0, None, self.flip);
}
}
pub struct AnimatedSprite<'a> {
texture: &'a Texture,
x: i32,
y: i32,
pub flip: (bool, bool),
frame: u32,
frames: u32,
time: u64,
frame_time: u64
}
impl<'a> AnimatedSprite<'a> {
pub fn new(texture: &'a Texture, x: i32, y: i32, frames: u32, fps: u32) -> AnimatedSprite<'a> {
AnimatedSprite {
texture: texture,
x: x,
y: y,
flip: (false, false),
frame: 0,
frames: frames,
time: 0,
frame_time: 1000 / fps as u64
}
}
}
impl<'a> Sprite for AnimatedSprite<'a> {
fn update(&mut self, elapsed: u64) {
self.time += elapsed;
self.frame += (self.time / self.frame_time) as u32;
self.frame %= self.frames;
self.time %= self.frame_time;
}
fn render(&self, drawer: &mut Renderer, destination: &Rect) {
let x = self.x + (self.frame * 16) as i32;
drawer.copy_ex(self.texture, Some(Rect::new_unwrap(x, self.y, 16, 16)), Some(*destination), 0.0, None, self.flip);
}
}