From 2df216c15d76e9ece5a0068e53149386a955520f Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Sun, 14 Jul 2024 19:52:32 +0200 Subject: [PATCH] various sprite animation improvements - Added indexers and Count to SpriteAnimation and SpriteAnimationGroup - Marked SpriteAnimation.ByName obsolete in favor of the new indexer --- CHANGELOG.md | 4 +++ MLEM/Animations/SpriteAnimation.cs | 11 +++++-- MLEM/Animations/SpriteAnimationGroup.cs | 44 +++++++++++++++++-------- 3 files changed, 42 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ec39b8..8380f02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,11 +19,15 @@ Jump to version: Additions - **Added the ability for formatted (tokenized) strings to be drawn with custom rotation, origin and flipping** - Added a RectangleF.FromCorners overload that accepts points +- Added indexers and Count to SpriteAnimation and SpriteAnimationGroup Improvements - Allow NumberExtensions.GetPoints to include bottom and right coordinates - Allow AutoTiling overlayTextures to return null texture regions +Removals +- Marked SpriteAnimation.ByName obsolete in favor of the new indexer + ### MLEM.Ui Additions - Added the ability to set the anchor that should be used when a tooltip attaches to an element or the mouse diff --git a/MLEM/Animations/SpriteAnimation.cs b/MLEM/Animations/SpriteAnimation.cs index 06b941d..2326b5a 100644 --- a/MLEM/Animations/SpriteAnimation.cs +++ b/MLEM/Animations/SpriteAnimation.cs @@ -14,6 +14,10 @@ namespace MLEM.Animations { private readonly AnimationFrame[] frames; /// + /// Returns the amount of entries that this sprite animation has. + /// + public int Count => this.frames.Length; + /// /// Returns the at the given index. /// Index ordering is based on the order that animation frames were added in. /// @@ -26,15 +30,16 @@ namespace MLEM.Animations { get { // we might have overshot the end time by a little bit, so just return the last frame if (this.TimeIntoAnimation >= this.TotalTime) - return this.frames[this.frames.Length - 1]; + return this[this.Count - 1]; var accum = 0D; - foreach (var frame in this.frames) { + for (var i = 0; i < this.Count; i++) { + var frame = this[i]; accum += frame.Seconds; if (accum >= this.TimeIntoAnimation) return frame; } // if we're here then the time is negative for some reason, so just return the first frame - return this.frames[0]; + return this[0]; } } /// diff --git a/MLEM/Animations/SpriteAnimationGroup.cs b/MLEM/Animations/SpriteAnimationGroup.cs index 0bacf27..b817077 100644 --- a/MLEM/Animations/SpriteAnimationGroup.cs +++ b/MLEM/Animations/SpriteAnimationGroup.cs @@ -35,13 +35,27 @@ namespace MLEM.Animations { /// public float SpeedMultiplier { set { - foreach (var anim in this.animations) - anim.Animation.SpeedMultiplier = value; + for (var i = 0; i < this.Count; i++) + this[i].SpeedMultiplier = value; } } + /// + /// Returns the amount of entries that this sprite animation group has. + /// + public int Count; + /// + /// Returns the at the given index. + /// + /// The index. + public SpriteAnimation this[int index] => this.animations[index].Animation; + /// + /// Returns the in this animation group with the given , if it exists, and otherwise. + /// + /// The name of the animation. + public SpriteAnimation this[string name] => this.animations.Find(anim => anim.Animation.Name == name)?.Animation; /// - /// A callback for when the currently displaying animation has changed due to a condition with a higher priority being met. + /// A callback for when the currently displaying animation has changed due to a condition with a higher priority being met. /// public event AnimationChanged OnAnimationChanged; @@ -79,8 +93,9 @@ namespace MLEM.Animations { /// /// The of the animation /// The animation by that name, or null if there is none + [Obsolete("Use the name-based indexer instead")] public SpriteAnimation ByName(string name) { - return this.animations.Find(anim => anim.Animation.Name == name)?.Animation; + return this[name]; } private void FindAnimationToPlay() { @@ -90,7 +105,8 @@ namespace MLEM.Animations { if (this.currentAnimation != null && this.currentAnimation.ShouldPlay()) animToPlay = this.currentAnimation; - foreach (var anim in this.animations) { + for (var i = 0; i < this.Count; i++) { + var anim = this.animations[i]; // if we find an animation with a lower priority then it means we can break since the list is sorted by priority if (animToPlay != null && anim.Priority <= animToPlay.Priority) break; @@ -122,18 +138,18 @@ namespace MLEM.Animations { /// The new animation public delegate void AnimationChanged(SpriteAnimation oldAnim, SpriteAnimation newAnim); - } + private class ConditionedAnimation { - internal class ConditionedAnimation { + public readonly SpriteAnimation Animation; + public readonly Func ShouldPlay; + public readonly int Priority; - public readonly SpriteAnimation Animation; - public readonly Func ShouldPlay; - public readonly int Priority; + public ConditionedAnimation(SpriteAnimation animation, Func shouldPlay, int priority) { + this.Animation = animation; + this.ShouldPlay = shouldPlay; + this.Priority = priority; + } - public ConditionedAnimation(SpriteAnimation animation, Func shouldPlay, int priority) { - this.Animation = animation; - this.ShouldPlay = shouldPlay; - this.Priority = priority; } }