diff --git a/src/drawables/animated_sprite.rs b/src/drawables/animated_sprite.rs index 948ae0d44e..24b4528cb1 100644 --- a/src/drawables/animated_sprite.rs +++ b/src/drawables/animated_sprite.rs @@ -149,6 +149,27 @@ pub struct AnimatedSprite { pub wait_timer: f32, } +impl From for AnimatedSprite { + fn from(meta: AnimatedSpriteMetadata) -> Self { + let animations = meta + .animations + .into_iter() + .map(Into::into) + .collect::>(); + + let params = AnimatedSpriteParams { + scale: meta.scale.unwrap_or(1.0), + offset: meta.offset, + pivot: meta.pivot, + tint: meta.tint.unwrap_or(color::WHITE), + autoplay_id: meta.autoplay_id, + ..Default::default() + }; + + AnimatedSprite::new(&meta.texture_id, animations.as_slice(), params) + } +} + impl AnimatedSprite { pub fn new(texture_id: &str, animations: &[Animation], params: AnimatedSpriteParams) -> Self { let animations = animations.to_vec(); diff --git a/src/effects/active/triggered.rs b/src/effects/active/triggered.rs index c934e08067..bd83ed8360 100644 --- a/src/effects/active/triggered.rs +++ b/src/effects/active/triggered.rs @@ -13,7 +13,7 @@ use crate::particles::{ParticleEmitter, ParticleEmitterMetadata}; use crate::physics; use crate::player::{Player, PlayerState}; use crate::{ActiveEffectMetadata, AnimatedSpriteMetadata, CollisionWorld, PhysicsBody}; -use crate::{Drawable, PhysicsBodyParams}; +use crate::{Drawable, DrawableKind, PhysicsBodyParams}; const TRIGGERED_EFFECT_DRAW_ORDER: u32 = 5; @@ -114,19 +114,12 @@ pub fn spawn_triggered_effect( )); if let Some(meta) = meta.sprite.clone() { - let animations = meta - .animations - .clone() - .into_iter() - .map(|a| a.into()) - .collect::>(); + let animated_sprite = meta.into(); - let mut drawable = Drawable::new_animated_sprite( - TRIGGERED_EFFECT_DRAW_ORDER, - &meta.texture_id, - animations.as_slice(), - meta.clone().into(), - ); + let mut drawable = Drawable { + draw_order: TRIGGERED_EFFECT_DRAW_ORDER, + kind: DrawableKind::AnimatedSprite(animated_sprite), + }; { let sprite = drawable.get_animated_sprite_mut().unwrap(); diff --git a/src/gui/select_character.rs b/src/gui/select_character.rs index da09176898..d6ed4c6d11 100644 --- a/src/gui/select_character.rs +++ b/src/gui/select_character.rs @@ -10,8 +10,7 @@ use crate::gui::{ }; use crate::player::PlayerCharacterMetadata; use crate::{ - draw_one_animated_sprite, update_one_animated_sprite, AnimatedSprite, AnimatedSpriteMetadata, - Resources, + draw_one_animated_sprite, update_one_animated_sprite, AnimatedSpriteMetadata, Resources, }; use core::input::{update_gamepad_context, GameInputScheme}; use core::Transform; @@ -59,17 +58,7 @@ pub async fn show_select_characters_menu( let meta: AnimatedSpriteMetadata = character.sprite.clone().into(); - let animations = meta - .animations - .iter() - .cloned() - .map(|a| a.into()) - .collect::>(); - - let sprite = - AnimatedSprite::new(&meta.texture_id, animations.as_slice(), meta.clone().into()); - - animated_sprites.push(sprite); + animated_sprites.push(meta.into()); } let mut is_ready = false; @@ -246,18 +235,7 @@ pub async fn show_select_characters_menu( let meta: AnimatedSpriteMetadata = character.sprite.clone().into(); - let animations = meta - .animations - .iter() - .cloned() - .map(|a| a.into()) - .collect::>(); - - animated_sprites[i] = AnimatedSprite::new( - &meta.texture_id, - animations.as_slice(), - meta.clone().into(), - ); + animated_sprites[i] = meta.into(); } is_ready = !selected_params.iter().any(|params| params.is_none()); diff --git a/src/items.rs b/src/items.rs index 1ec8200205..a2af8e2987 100644 --- a/src/items.rs +++ b/src/items.rs @@ -9,8 +9,8 @@ use macroquad::prelude::*; use serde::{Deserialize, Serialize}; use crate::{ - ActiveEffectMetadata, AnimatedSprite, AnimatedSpriteMetadata, CollisionWorld, Drawable, - PassiveEffectMetadata, PhysicsBody, QueuedAnimationAction, Resources, + ActiveEffectMetadata, AnimatedSpriteMetadata, CollisionWorld, Drawable, PassiveEffectMetadata, + PhysicsBody, QueuedAnimationAction, Resources, }; use core::{Result, Transform}; @@ -178,19 +178,7 @@ pub fn spawn_item(world: &mut World, position: Vec2, meta: MapItemMetadata) -> R collider_size.y as i32, ); - let animations = meta - .sprite - .animations - .clone() - .into_iter() - .map(|a| a.into()) - .collect::>(); - - let sprite = AnimatedSprite::new( - &meta.sprite.texture_id, - animations.as_slice(), - meta.sprite.clone().into(), - ); + let sprite = meta.sprite.into(); sprites.push((SPRITE_ANIMATED_SPRITE_ID, sprite)); @@ -257,20 +245,7 @@ pub fn spawn_item(world: &mut World, position: Vec2, meta: MapItemMetadata) -> R } if let Some(effect_sprite) = meta.effect_sprite { - let animations = effect_sprite - .animations - .clone() - .into_iter() - .map(|a| a.into()) - .collect::>(); - - let mut sprite = AnimatedSprite::new( - &effect_sprite.texture_id, - animations.as_slice(), - effect_sprite.clone().into(), - ); - - sprite.is_deactivated = true; + let sprite = effect_sprite.into(); sprites.push((EFFECT_ANIMATED_SPRITE_ID, sprite)); } diff --git a/src/map/decoration.rs b/src/map/decoration.rs index 41dd8a16a7..380f7997d7 100644 --- a/src/map/decoration.rs +++ b/src/map/decoration.rs @@ -4,7 +4,7 @@ use hecs::{Entity, World}; use serde::{Deserialize, Serialize}; -use crate::{AnimatedSpriteMetadata, Drawable}; +use crate::{AnimatedSpriteMetadata, Drawable, DrawableKind}; use core::Transform; const DECORATION_DRAW_ORDER: u32 = 0; @@ -26,22 +26,14 @@ impl Decoration { } pub fn spawn_decoration(world: &mut World, position: Vec2, meta: DecorationMetadata) -> Entity { - let animations = meta - .sprite - .animations - .clone() - .into_iter() - .map(|m| m.into()) - .collect::>(); + let sprite = meta.sprite.into(); world.spawn(( Decoration::new(&meta.id), Transform::from(position), - Drawable::new_animated_sprite( - DECORATION_DRAW_ORDER, - &meta.sprite.texture_id, - animations.as_slice(), - meta.sprite.clone().into(), - ), + Drawable { + draw_order: DECORATION_DRAW_ORDER, + kind: DrawableKind::AnimatedSprite(sprite), + }, )) }