1
0
Fork 0
mirror of https://github.com/Ellpeck/MLEM.git synced 2024-11-29 15:58:33 +01:00

fixed sprite animation groups not having an animation in the first frame

This commit is contained in:
Ellpeck 2019-09-30 20:55:50 +02:00
parent bc6ad3adef
commit 02500ee1b5

View file

@ -8,21 +8,43 @@ namespace MLEM.Animations {
private readonly List<ConditionedAnimation> animations = new List<ConditionedAnimation>(); private readonly List<ConditionedAnimation> animations = new List<ConditionedAnimation>();
private ConditionedAnimation currAnimation; private ConditionedAnimation currAnimation;
public SpriteAnimation CurrentAnimation => this.currAnimation?.Animation; private ConditionedAnimation CurrAnimation {
get {
if (this.isDirty) {
this.isDirty = false;
this.animations.Sort((a1, a2) => a1.Priority.CompareTo(a2.Priority));
this.FindAnimationToPlay();
}
return this.currAnimation;
}
set => this.currAnimation = value;
}
public SpriteAnimation CurrentAnimation => this.CurrAnimation?.Animation;
public AnimationFrame CurrentFrame => this.CurrentAnimation?.CurrentFrame; public AnimationFrame CurrentFrame => this.CurrentAnimation?.CurrentFrame;
public TextureRegion CurrentRegion => this.CurrentAnimation?.CurrentRegion; public TextureRegion CurrentRegion => this.CurrentAnimation?.CurrentRegion;
public AnimationChanged OnAnimationChanged; public AnimationChanged OnAnimationChanged;
private bool isDirty;
public SpriteAnimationGroup Add(SpriteAnimation anim, Func<bool> condition, int priority = 0) { public SpriteAnimationGroup Add(SpriteAnimation anim, Func<bool> condition, int priority = 0) {
this.animations.Add(new ConditionedAnimation(anim, condition, priority)); this.animations.Add(new ConditionedAnimation(anim, condition, priority));
this.animations.Sort((a1, a2) => a1.Priority.CompareTo(a2.Priority)); this.isDirty = true;
return this; return this;
} }
public void Update(GameTime time) { public void Update(GameTime time) {
this.FindAnimationToPlay();
if (this.CurrAnimation != null)
this.CurrAnimation.Animation.Update(time);
}
public SpriteAnimation ByName(string name) {
return this.animations.Find(anim => anim.Animation.Name == name)?.Animation;
}
private void FindAnimationToPlay() {
ConditionedAnimation animToPlay = null; ConditionedAnimation animToPlay = null;
if (this.currAnimation != null && this.currAnimation.ShouldPlay()) if (this.CurrAnimation != null && this.CurrAnimation.ShouldPlay())
animToPlay = this.currAnimation; animToPlay = this.CurrAnimation;
foreach (var anim in this.animations) { foreach (var anim in this.animations) {
// if we find an animation with a lower priority then it means we can break // if we find an animation with a lower priority then it means we can break
// because the list is sorted by priority // because the list is sorted by priority
@ -31,19 +53,12 @@ namespace MLEM.Animations {
if (anim.ShouldPlay()) if (anim.ShouldPlay())
animToPlay = anim; animToPlay = anim;
} }
if (animToPlay != this.currAnimation) { if (animToPlay != this.CurrAnimation) {
this.OnAnimationChanged?.Invoke(this.currAnimation?.Animation, animToPlay?.Animation); this.OnAnimationChanged?.Invoke(this.CurrAnimation?.Animation, animToPlay?.Animation);
this.currAnimation = animToPlay; this.CurrAnimation = animToPlay;
if (animToPlay != null) if (animToPlay != null)
animToPlay.Animation.Restart(); animToPlay.Animation.Restart();
} }
if (this.currAnimation != null)
this.currAnimation.Animation.Update(time);
}
public SpriteAnimation ByName(string name) {
return this.animations.Find(anim => anim.Animation.Name == name)?.Animation;
} }
public delegate void AnimationChanged(SpriteAnimation oldAnim, SpriteAnimation newAnim); public delegate void AnimationChanged(SpriteAnimation oldAnim, SpriteAnimation newAnim);