use crate::event::*;
use crate::utils::{Number, Vec2};
use crate::Layer;
use crate::Origin;
struct EventCollection {
move_: Vec<Move>,
movex_: Vec<MoveX>,
movey_: Vec<MoveY>,
fade_: Vec<Fade>,
rotate_: Vec<Rotate>,
scale_: Vec<Scale>,
scalevec_: Vec<ScaleVec>,
color_: Vec<Color>,
hflip_: Vec<HFlip>,
vflip_: Vec<VFlip>,
additive_: Vec<Additive>,
}
fn events_to_str<T>(events: &Vec<T>) -> String
where
T: Event,
{
events
.iter()
.map(|event| event.to_line() + "\n")
.collect::<Vec<String>>()
.join("")
}
impl EventCollection {
pub fn new() -> Self {
Self {
move_: Vec::<Move>::new(),
movex_: Vec::<MoveX>::new(),
movey_: Vec::<MoveY>::new(),
fade_: Vec::<Fade>::new(),
rotate_: Vec::<Rotate>::new(),
scale_: Vec::<Scale>::new(),
scalevec_: Vec::<ScaleVec>::new(),
color_: Vec::<Color>::new(),
hflip_: Vec::<HFlip>::new(),
vflip_: Vec::<VFlip>::new(),
additive_: Vec::<Additive>::new(),
}
}
pub fn to_str(&self) -> String {
format!(
"{}{}{}{}{}{}{}{}{}{}{}",
events_to_str(&self.move_),
events_to_str(&self.movex_),
events_to_str(&self.movey_),
events_to_str(&self.fade_),
events_to_str(&self.rotate_),
events_to_str(&self.scale_),
events_to_str(&self.scalevec_),
events_to_str(&self.color_),
events_to_str(&self.hflip_),
events_to_str(&self.vflip_),
events_to_str(&self.additive_),
)
}
}
pub struct Sprite {
events: EventCollection,
current_depth: usize,
path: String,
pos: Vec2,
layer: Layer,
origin: Origin,
start_time: Option<i32>,
end_time: Option<i32>,
}
macro_rules! add_event {
($sprite:ident, $event:ident, $events:expr) => {
let (event_start, event_end) = ($event.get_start_time(), $event.get_end_time());
match $sprite.start_time {
Some(sprite_start) => {
if event_start < sprite_start {
$sprite.start_time = Some(event_start)
}
}
None => $sprite.start_time = Some(event_start),
}
match $sprite.end_time {
Some(sprite_end) => {
if sprite_end < event_end {
$sprite.end_time = Some(event_end)
}
}
None => $sprite.end_time = Some(event_end),
}
$event.set_depth($sprite.current_depth);
$events.push($event);
};
}
impl Sprite {
pub fn new<T>(args: T) -> Self
where
T: Into<Sprite>,
{
args.into()
}
pub fn move_<T>(&mut self, args: T)
where
T: Into<Move>,
{
let mut event = args.into();
add_event!(self, event, self.events.move_);
}
pub fn movex_<T>(&mut self, args: T)
where
T: Into<MoveX>,
{
let mut event = args.into();
add_event!(self, event, self.events.movex_);
}
pub fn movey_<T>(&mut self, args: T)
where
T: Into<MoveY>,
{
let mut event = args.into();
add_event!(self, event, self.events.movey_);
}
pub fn fade_<T>(&mut self, args: T)
where
T: Into<Fade>,
{
let mut event = args.into();
add_event!(self, event, self.events.fade_);
}
pub fn rotate_<T>(&mut self, args: T)
where
T: Into<Rotate>,
{
let mut event = args.into();
add_event!(self, event, self.events.rotate_);
}
pub fn scale_<T>(&mut self, args: T)
where
T: Into<Scale>,
{
let mut event = args.into();
add_event!(self, event, self.events.scale_);
}
pub fn scalevec_<T>(&mut self, args: T)
where
T: Into<ScaleVec>,
{
let mut event = args.into();
add_event!(self, event, self.events.scalevec_);
}
pub fn color_<T>(&mut self, args: T)
where
T: Into<Color>,
{
let mut event = args.into();
add_event!(self, event, self.events.color_);
}
pub fn hflip_<T>(&mut self, args: T)
where
T: Into<HFlip>,
{
let mut event = args.into();
add_event!(self, event, self.events.hflip_);
}
pub fn vflip_<T>(&mut self, args: T)
where
T: Into<VFlip>,
{
let mut event = args.into();
add_event!(self, event, self.events.vflip_);
}
pub fn additive_<T>(&mut self, args: T)
where
T: Into<Additive>,
{
let mut event = args.into();
add_event!(self, event, self.events.additive_);
}
pub fn get_x(&self) -> Number {
self.pos.x
}
pub fn get_y(&self) -> Number {
self.pos.y
}
pub fn start_time(&self) -> Option<i32> {
self.start_time
}
pub fn end_time(&self) -> Option<i32> {
self.end_time
}
pub fn to_str(&self) -> String {
format!(
"Sprite,{},{},\"{}\",{},{}\n{}",
self.layer,
self.origin,
self.path,
self.pos.x,
self.pos.y,
self.events.to_str()
)
}
pub fn set_layer(&mut self, layer: Layer) {
self.layer = layer;
}
}
impl Into<Sprite> for String {
fn into(self) -> Sprite {
Sprite {
events: EventCollection::new(),
current_depth: 0,
path: self,
pos: Vec2::from(320, 240),
layer: Layer::Background,
origin: Origin::Centre,
start_time: None,
end_time: None,
}
}
}
impl Into<Sprite> for &str {
fn into(self) -> Sprite {
Sprite {
events: EventCollection::new(),
current_depth: 0,
path: String::from(self),
pos: Vec2::from(320, 240),
layer: Layer::Background,
origin: Origin::Centre,
start_time: None,
end_time: None,
}
}
}
impl Into<Sprite> for (Origin, String) {
fn into(self) -> Sprite {
Sprite {
events: EventCollection::new(),
current_depth: 0,
path: self.1,
pos: Vec2::from(320, 240),
layer: Layer::Background,
origin: self.0,
start_time: None,
end_time: None,
}
}
}
impl Into<Sprite> for (Origin, &str) {
fn into(self) -> Sprite {
Sprite {
events: EventCollection::new(),
current_depth: 0,
path: String::from(self.1),
pos: Vec2::from(320, 240),
layer: Layer::Background,
origin: self.0,
start_time: None,
end_time: None,
}
}
}
impl Into<Sprite> for (String, Vec2) {
fn into(self) -> Sprite {
Sprite {
events: EventCollection::new(),
current_depth: 0,
path: self.0,
pos: self.1,
layer: Layer::Background,
origin: Origin::Centre,
start_time: None,
end_time: None,
}
}
}
impl<T, U> Into<Sprite> for (String, T, U)
where
T: Into<Number>,
U: Into<Number>,
{
fn into(self) -> Sprite {
Sprite {
events: EventCollection::new(),
current_depth: 0,
path: self.0,
pos: Vec2::from(self.1, self.2),
layer: Layer::Background,
origin: Origin::Centre,
start_time: None,
end_time: None,
}
}
}
impl Into<Sprite> for (&str, Vec2) {
fn into(self) -> Sprite {
Sprite {
events: EventCollection::new(),
current_depth: 0,
path: String::from(self.0),
pos: self.1,
layer: Layer::Background,
origin: Origin::Centre,
start_time: None,
end_time: None,
}
}
}
impl<T, U> Into<Sprite> for (&str, T, U)
where
T: Into<Number>,
U: Into<Number>,
{
fn into(self) -> Sprite {
Sprite {
events: EventCollection::new(),
current_depth: 0,
path: String::from(self.0),
pos: Vec2::from(self.1, self.2),
layer: Layer::Background,
origin: Origin::Centre,
start_time: None,
end_time: None,
}
}
}
impl Into<Sprite> for (Origin, String, Vec2) {
fn into(self) -> Sprite {
Sprite {
events: EventCollection::new(),
current_depth: 0,
path: self.1,
pos: self.2,
layer: Layer::Background,
origin: self.0,
start_time: None,
end_time: None,
}
}
}
impl<T, U> Into<Sprite> for (Origin, String, T, U)
where
T: Into<Number>,
U: Into<Number>,
{
fn into(self) -> Sprite {
Sprite {
events: EventCollection::new(),
current_depth: 0,
path: self.1,
pos: Vec2::from(self.2, self.3),
layer: Layer::Background,
origin: self.0,
start_time: None,
end_time: None,
}
}
}
impl Into<Sprite> for (Origin, &str, Vec2) {
fn into(self) -> Sprite {
Sprite {
events: EventCollection::new(),
current_depth: 0,
path: String::from(self.1),
pos: self.2,
layer: Layer::Background,
origin: self.0,
start_time: None,
end_time: None,
}
}
}
impl<T, U> Into<Sprite> for (Origin, &str, T, U)
where
T: Into<Number>,
U: Into<Number>,
{
fn into(self) -> Sprite {
Sprite {
events: EventCollection::new(),
current_depth: 0,
path: String::from(self.1),
pos: Vec2::from(self.2, self.3),
layer: Layer::Background,
origin: self.0,
start_time: None,
end_time: None,
}
}
}