From 57f588fa8697841524c070567659c8dece6817c6 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 10 Oct 2023 15:23:50 +0900 Subject: [PATCH] Ensure health displays don't pile up transforms when off-screen --- osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs | 15 +++++++++------ .../Screens/Play/HUD/DefaultHealthDisplay.cs | 16 +++++++--------- osu.Game/Screens/Play/HUD/HealthDisplay.cs | 8 +++++--- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs b/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs index aa3b6c1f41..b6e2f494d1 100644 --- a/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs +++ b/osu.Game/Screens/Play/HUD/ArgonHealthDisplay.cs @@ -142,14 +142,17 @@ namespace osu.Game.Screens.Play.HUD Current.BindValueChanged(v => { - if (v.NewValue >= GlowBarValue) - finishMissDisplay(); + Scheduler.AddOnce(() => + { + if (v.NewValue >= GlowBarValue) + finishMissDisplay(); - double time = v.NewValue > GlowBarValue ? 500 : 250; + double time = v.NewValue > GlowBarValue ? 500 : 250; - this.TransformTo(nameof(HealthBarValue), v.NewValue, time, Easing.OutQuint); - if (resetMissBarDelegate == null) - this.TransformTo(nameof(GlowBarValue), v.NewValue, time, Easing.OutQuint); + this.TransformTo(nameof(HealthBarValue), v.NewValue, time, Easing.OutQuint); + if (resetMissBarDelegate == null) + this.TransformTo(nameof(GlowBarValue), v.NewValue, time, Easing.OutQuint); + }); }, true); BarLength.BindValueChanged(l => Width = l.NewValue, true); diff --git a/osu.Game/Screens/Play/HUD/DefaultHealthDisplay.cs b/osu.Game/Screens/Play/HUD/DefaultHealthDisplay.cs index c4d04c5580..0d3bd8d46f 100644 --- a/osu.Game/Screens/Play/HUD/DefaultHealthDisplay.cs +++ b/osu.Game/Screens/Play/HUD/DefaultHealthDisplay.cs @@ -112,6 +112,13 @@ namespace osu.Game.Screens.Play.HUD }; } + protected override void Flash(JudgementResult result) + { + fill.FadeEdgeEffectTo(Math.Min(1, fill.EdgeEffect.Colour.Linear.A + (1f - base_glow_opacity) / glow_max_hits), 50, Easing.OutQuint) + .Delay(glow_fade_delay) + .FadeEdgeEffectTo(base_glow_opacity, glow_fade_time, Easing.OutQuint); + } + [BackgroundDependencyLoader] private void load(OsuColour colours) { @@ -119,15 +126,6 @@ namespace osu.Game.Screens.Play.HUD GlowColour = colours.BlueDarker; } - protected override void Flash(JudgementResult result) => Scheduler.AddOnce(flash); - - private void flash() - { - fill.FadeEdgeEffectTo(Math.Min(1, fill.EdgeEffect.Colour.Linear.A + (1f - base_glow_opacity) / glow_max_hits), 50, Easing.OutQuint) - .Delay(glow_fade_delay) - .FadeEdgeEffectTo(base_glow_opacity, glow_fade_time, Easing.OutQuint); - } - protected override void Update() { base.Update(); diff --git a/osu.Game/Screens/Play/HUD/HealthDisplay.cs b/osu.Game/Screens/Play/HUD/HealthDisplay.cs index 986efe3036..e297ffc411 100644 --- a/osu.Game/Screens/Play/HUD/HealthDisplay.cs +++ b/osu.Game/Screens/Play/HUD/HealthDisplay.cs @@ -39,6 +39,7 @@ namespace osu.Game.Screens.Play.HUD /// /// Triggered when a is a successful hit, signaling the health display to perform a flash animation (if designed to do so). + /// Calls to this method are debounced. /// /// The judgement result. protected virtual void Flash(JudgementResult result) @@ -47,6 +48,7 @@ namespace osu.Game.Screens.Play.HUD /// /// Triggered when a resulted in the player losing health. + /// Calls to this method are debounced. /// /// The judgement result. protected virtual void Miss(JudgementResult result) @@ -92,7 +94,7 @@ namespace osu.Game.Screens.Play.HUD { double newValue = Current.Value + 0.05f; this.TransformBindableTo(Current, newValue, increase_delay); - Flash(new JudgementResult(new HitObject(), new Judgement())); + Scheduler.AddOnce(Flash, new JudgementResult(new HitObject(), new Judgement())); if (newValue >= 1) finishInitialAnimation(); @@ -115,9 +117,9 @@ namespace osu.Game.Screens.Play.HUD private void onNewJudgement(JudgementResult judgement) { if (judgement.IsHit && judgement.Type != HitResult.IgnoreHit) - Flash(judgement); + Scheduler.AddOnce(Flash, judgement); else if (judgement.Judgement.HealthIncreaseFor(judgement) < 0) - Miss(judgement); + Scheduler.AddOnce(Miss, judgement); } protected override void Dispose(bool isDisposing)