1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-11 15:07:44 +08:00

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
This commit is contained in:
Aergwyn 2017-12-28 15:36:27 +01:00
parent 021717dfb4
commit 0b23ceb781
3 changed files with 26 additions and 24 deletions

View File

@ -15,6 +15,7 @@ using OpenTK;
using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Objects.Drawables;
using osu.Game.Rulesets.Osu.Objects.Drawables; using osu.Game.Rulesets.Osu.Objects.Drawables;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Game.Rulesets.Objects.Types;
namespace osu.Game.Rulesets.Osu.Mods namespace osu.Game.Rulesets.Osu.Mods
{ {
@ -53,6 +54,9 @@ namespace osu.Game.Rulesets.Osu.Mods
var fadeOutTime = fadeInTime + fadeIn; var fadeOutTime = fadeInTime + fadeIn;
var fadeOut = d.HitObject.StartTime - preEmpt * fade_out_speed_multiplier - fadeOutTime; 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; d.FadeIn = fadeIn;
using (drawable.BeginAbsoluteSequence(fadeInTime, true)) using (drawable.BeginAbsoluteSequence(fadeInTime, true))
@ -70,10 +74,9 @@ namespace osu.Game.Rulesets.Osu.Mods
using (slider.BeginAbsoluteSequence(fadeOutTime, true)) using (slider.BeginAbsoluteSequence(fadeOutTime, true))
{ {
var sliderDuration = slider.Slider.EndTime - fadeOutTime; // new duration from fade in to end of the slider slider.Body.FadeOut(newDuration, Easing.Out);
slider.Body.FadeOut(sliderDuration);
// delay a bit less to let the sliderball fade out peacefully instead of having a hard cut // 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.Ball.FadeOut(fadeOut);
slider.Delay(fadeOut).Expire(); slider.Delay(fadeOut).Expire();
@ -87,8 +90,7 @@ namespace osu.Game.Rulesets.Osu.Mods
using (spinner.BeginAbsoluteSequence(fadeOutTime, true)) 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(newDuration).FadeOut(fadeOut);
var sequence = spinner.Delay(spinnerDuration).FadeOut(fadeOut);
// speed up the end sequence accordingly // speed up the end sequence accordingly
switch (state) switch (state)
{ {

View File

@ -15,7 +15,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
{ {
public class DrawableSlider : DrawableOsuHitObject, IDrawableHitObjectWithProxiedApproach public class DrawableSlider : DrawableOsuHitObject, IDrawableHitObjectWithProxiedApproach
{ {
public readonly Slider Slider; private readonly Slider slider;
public readonly DrawableHitCircle InitialCircle; public readonly DrawableHitCircle InitialCircle;
@ -29,7 +29,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
public DrawableSlider(Slider s) : base(s) public DrawableSlider(Slider s) : base(s)
{ {
Slider = s; slider = s;
Children = new Drawable[] Children = new Drawable[]
{ {
@ -111,17 +111,17 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
Tracking = Ball.Tracking; 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); int repeat = slider.RepeatAt(progress);
progress = Slider.ProgressAt(progress); progress = slider.ProgressAt(progress);
if (repeat > currentRepeat) if (repeat > currentRepeat)
currentRepeat = repeat; currentRepeat = repeat;
//todo: we probably want to reconsider this before adding scoring, but it looks and feels nice. //todo: we probably want to reconsider this before adding scoring, but it looks and feels nice.
if (!InitialCircle.Judgements.Any(j => j.IsHit)) 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 c in components) c.UpdateProgress(progress, repeat);
foreach (var t in ticks.Children) t.Tracking = Ball.Tracking; 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) 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 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)); 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(); Ball.FadeIn();
using (BeginDelayedSequence(Slider.Duration, true)) using (BeginDelayedSequence(slider.Duration, true))
{ {
Body.FadeOut(160); Body.FadeOut(160);
Ball.FadeOut(160); Ball.FadeOut(160);

View File

@ -18,7 +18,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
{ {
public class DrawableSpinner : DrawableOsuHitObject public class DrawableSpinner : DrawableOsuHitObject
{ {
public readonly Spinner Spinner; private readonly Spinner spinner;
public readonly SpinnerDisc Disc; public readonly SpinnerDisc Disc;
public readonly SpinnerTicks Ticks; 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 // we are slightly bigger than our parent, to clip the top and bottom of the circle
Height = 1.3f; Height = 1.3f;
Spinner = s; spinner = s;
Children = new Drawable[] Children = new Drawable[]
{ {
@ -90,7 +90,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
Anchor = Anchor.Centre, Anchor = Anchor.Centre,
Origin = Anchor.Centre, Origin = Anchor.Centre,
}, },
Disc = new SpinnerDisc(Spinner) Disc = new SpinnerDisc(spinner)
{ {
Scale = Vector2.Zero, Scale = Vector2.Zero,
Anchor = Anchor.Centre, 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) protected override void CheckForJudgements(bool userTriggered, double timeOffset)
{ {
@ -135,7 +135,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
glow.FadeColour(completeColour, duration); glow.FadeColour(completeColour, duration);
} }
if (!userTriggered && Time.Current >= Spinner.EndTime) if (!userTriggered && Time.Current >= spinner.EndTime)
{ {
if (Progress >= 1) if (Progress >= 1)
AddJudgement(new OsuJudgement { Result = HitResult.Great }); AddJudgement(new OsuJudgement { Result = HitResult.Great });
@ -143,7 +143,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
AddJudgement(new OsuJudgement { Result = HitResult.Good }); AddJudgement(new OsuJudgement { Result = HitResult.Good });
else if (Progress > .75) else if (Progress > .75)
AddJudgement(new OsuJudgement { Result = HitResult.Meh }); AddJudgement(new OsuJudgement { Result = HitResult.Meh });
else if (Time.Current >= Spinner.EndTime) else if (Time.Current >= spinner.EndTime)
AddJudgement(new OsuJudgement { Result = HitResult.Miss }); AddJudgement(new OsuJudgement { Result = HitResult.Miss });
} }
} }
@ -179,7 +179,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
Ticks.Rotation = Disc.Rotation; Ticks.Rotation = Disc.Rotation;
spmCounter.SetRotation(Disc.RotationAbsolute); 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); Disc.ScaleTo(relativeCircleScale + (1 - relativeCircleScale) * Progress, 200, Easing.OutQuint);
symbol.RotateTo(Disc.Rotation / 2, 500, Easing.OutQuint); symbol.RotateTo(Disc.Rotation / 2, 500, Easing.OutQuint);
@ -189,22 +189,22 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
{ {
base.UpdatePreemptState(); base.UpdatePreemptState();
circleContainer.ScaleTo(Spinner.Scale * 0.3f); circleContainer.ScaleTo(spinner.Scale * 0.3f);
circleContainer.ScaleTo(Spinner.Scale, TIME_PREEMPT / 1.4f, Easing.OutQuint); circleContainer.ScaleTo(spinner.Scale, TIME_PREEMPT / 1.4f, Easing.OutQuint);
Disc.RotateTo(-720); Disc.RotateTo(-720);
symbol.RotateTo(-720); symbol.RotateTo(-720);
mainContainer mainContainer
.ScaleTo(0) .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() .Then()
.ScaleTo(1, 500, Easing.OutQuint); .ScaleTo(1, 500, Easing.OutQuint);
} }
protected override void UpdateCurrentState(ArmedState state) protected override void UpdateCurrentState(ArmedState state)
{ {
var sequence = this.Delay(Spinner.Duration).FadeOut(160); var sequence = this.Delay(spinner.Duration).FadeOut(160);
switch (state) switch (state)
{ {