From 0b23ceb7815d3e26b175de600ab7aa76b80cbcc5 Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Thu, 28 Dec 2017 15:36:27 +0100 Subject: [PATCH] fix slider fade out to be eased + move duration calculation to not be done twice + made Slider / Spinner private again as they are not accessed externally anymore --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 12 +++++----- .../Objects/Drawables/DrawableSlider.cs | 16 +++++++------- .../Objects/Drawables/DrawableSpinner.cs | 22 +++++++++---------- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index 318ccab2f1..e8d98aebf3 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -15,6 +15,7 @@ using OpenTK; using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Osu.Objects.Drawables; using osu.Framework.Graphics; +using osu.Game.Rulesets.Objects.Types; namespace osu.Game.Rulesets.Osu.Mods { @@ -53,6 +54,9 @@ namespace osu.Game.Rulesets.Osu.Mods var fadeOutTime = fadeInTime + fadeIn; var fadeOut = d.HitObject.StartTime - preEmpt * fade_out_speed_multiplier - fadeOutTime; + // new duration from completed fade in to end (before fading out) + var newDuration = ((d.HitObject as IHasEndTime)?.EndTime ?? d.HitObject.StartTime) - fadeOutTime; + d.FadeIn = fadeIn; using (drawable.BeginAbsoluteSequence(fadeInTime, true)) @@ -70,10 +74,9 @@ namespace osu.Game.Rulesets.Osu.Mods using (slider.BeginAbsoluteSequence(fadeOutTime, true)) { - var sliderDuration = slider.Slider.EndTime - fadeOutTime; // new duration from fade in to end of the slider - slider.Body.FadeOut(sliderDuration); + slider.Body.FadeOut(newDuration, Easing.Out); // delay a bit less to let the sliderball fade out peacefully instead of having a hard cut - using (slider.BeginDelayedSequence(sliderDuration - fadeOut, true)) + using (slider.BeginDelayedSequence(newDuration - fadeOut, true)) { slider.Ball.FadeOut(fadeOut); slider.Delay(fadeOut).Expire(); @@ -87,8 +90,7 @@ namespace osu.Game.Rulesets.Osu.Mods using (spinner.BeginAbsoluteSequence(fadeOutTime, true)) { - var spinnerDuration = spinner.Spinner.EndTime - fadeOutTime; // new duration from fade in to end of the spinner - var sequence = spinner.Delay(spinnerDuration).FadeOut(fadeOut); + var sequence = spinner.Delay(newDuration).FadeOut(fadeOut); // speed up the end sequence accordingly switch (state) { diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs index 6beb430895..75fa3e0f01 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs @@ -15,7 +15,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { public class DrawableSlider : DrawableOsuHitObject, IDrawableHitObjectWithProxiedApproach { - public readonly Slider Slider; + private readonly Slider slider; public readonly DrawableHitCircle InitialCircle; @@ -29,7 +29,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables public DrawableSlider(Slider s) : base(s) { - Slider = s; + slider = s; Children = new Drawable[] { @@ -111,17 +111,17 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables Tracking = Ball.Tracking; - double progress = MathHelper.Clamp((Time.Current - Slider.StartTime) / Slider.Duration, 0, 1); + double progress = MathHelper.Clamp((Time.Current - slider.StartTime) / slider.Duration, 0, 1); - int repeat = Slider.RepeatAt(progress); - progress = Slider.ProgressAt(progress); + int repeat = slider.RepeatAt(progress); + progress = slider.ProgressAt(progress); if (repeat > currentRepeat) currentRepeat = repeat; //todo: we probably want to reconsider this before adding scoring, but it looks and feels nice. if (!InitialCircle.Judgements.Any(j => j.IsHit)) - InitialCircle.Position = Slider.Curve.PositionAt(progress); + InitialCircle.Position = slider.Curve.PositionAt(progress); foreach (var c in components) c.UpdateProgress(progress, repeat); foreach (var t in ticks.Children) t.Tracking = Ball.Tracking; @@ -129,7 +129,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables protected override void CheckForJudgements(bool userTriggered, double timeOffset) { - if (!userTriggered && Time.Current >= Slider.EndTime) + if (!userTriggered && Time.Current >= slider.EndTime) { var judgementsCount = ticks.Children.Count + repeatPoints.Children.Count + 1; var judgementsHit = ticks.Children.Count(t => t.Judgements.Any(j => j.IsHit)) + repeatPoints.Children.Count(t => t.Judgements.Any(j => j.IsHit)); @@ -152,7 +152,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { Ball.FadeIn(); - using (BeginDelayedSequence(Slider.Duration, true)) + using (BeginDelayedSequence(slider.Duration, true)) { Body.FadeOut(160); Ball.FadeOut(160); diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs index 57aa0f2c09..9e80e3ccd1 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs @@ -18,7 +18,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { public class DrawableSpinner : DrawableOsuHitObject { - public readonly Spinner Spinner; + private readonly Spinner spinner; public readonly SpinnerDisc Disc; public readonly SpinnerTicks Ticks; @@ -49,7 +49,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables // we are slightly bigger than our parent, to clip the top and bottom of the circle Height = 1.3f; - Spinner = s; + spinner = s; Children = new Drawable[] { @@ -90,7 +90,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables Anchor = Anchor.Centre, Origin = Anchor.Centre, }, - Disc = new SpinnerDisc(Spinner) + Disc = new SpinnerDisc(spinner) { Scale = Vector2.Zero, Anchor = Anchor.Centre, @@ -114,7 +114,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables }; } - public float Progress => MathHelper.Clamp(Disc.RotationAbsolute / 360 / Spinner.SpinsRequired, 0, 1); + public float Progress => MathHelper.Clamp(Disc.RotationAbsolute / 360 / spinner.SpinsRequired, 0, 1); protected override void CheckForJudgements(bool userTriggered, double timeOffset) { @@ -135,7 +135,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables glow.FadeColour(completeColour, duration); } - if (!userTriggered && Time.Current >= Spinner.EndTime) + if (!userTriggered && Time.Current >= spinner.EndTime) { if (Progress >= 1) AddJudgement(new OsuJudgement { Result = HitResult.Great }); @@ -143,7 +143,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables AddJudgement(new OsuJudgement { Result = HitResult.Good }); else if (Progress > .75) AddJudgement(new OsuJudgement { Result = HitResult.Meh }); - else if (Time.Current >= Spinner.EndTime) + else if (Time.Current >= spinner.EndTime) AddJudgement(new OsuJudgement { Result = HitResult.Miss }); } } @@ -179,7 +179,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables Ticks.Rotation = Disc.Rotation; spmCounter.SetRotation(Disc.RotationAbsolute); - float relativeCircleScale = Spinner.Scale * circle.DrawHeight / mainContainer.DrawHeight; + float relativeCircleScale = spinner.Scale * circle.DrawHeight / mainContainer.DrawHeight; Disc.ScaleTo(relativeCircleScale + (1 - relativeCircleScale) * Progress, 200, Easing.OutQuint); symbol.RotateTo(Disc.Rotation / 2, 500, Easing.OutQuint); @@ -189,22 +189,22 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { base.UpdatePreemptState(); - circleContainer.ScaleTo(Spinner.Scale * 0.3f); - circleContainer.ScaleTo(Spinner.Scale, TIME_PREEMPT / 1.4f, Easing.OutQuint); + circleContainer.ScaleTo(spinner.Scale * 0.3f); + circleContainer.ScaleTo(spinner.Scale, TIME_PREEMPT / 1.4f, Easing.OutQuint); Disc.RotateTo(-720); symbol.RotateTo(-720); mainContainer .ScaleTo(0) - .ScaleTo(Spinner.Scale * circle.DrawHeight / DrawHeight * 1.4f, TIME_PREEMPT - 150, Easing.OutQuint) + .ScaleTo(spinner.Scale * circle.DrawHeight / DrawHeight * 1.4f, TIME_PREEMPT - 150, Easing.OutQuint) .Then() .ScaleTo(1, 500, Easing.OutQuint); } protected override void UpdateCurrentState(ArmedState state) { - var sequence = this.Delay(Spinner.Duration).FadeOut(160); + var sequence = this.Delay(spinner.Duration).FadeOut(160); switch (state) {