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:
parent
021717dfb4
commit
0b23ceb781
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user