From b07cd2daa4de24100d7097eb107006d57536e27b Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 17 Dec 2025 16:38:46 +0900 Subject: [PATCH] Remove beat sync from skip / break overlay This didn't end up feeling as good as I hoped. Will revise at a later stage, adding beat sync in another way that isn't jank transforms on the progress bars. Also closes https://github.com/ppy/osu/issues/35972. --- osu.Game/Screens/Play/BreakOverlay.cs | 33 +++------------------------ osu.Game/Screens/Play/SkipOverlay.cs | 18 ++------------- 2 files changed, 5 insertions(+), 46 deletions(-) diff --git a/osu.Game/Screens/Play/BreakOverlay.cs b/osu.Game/Screens/Play/BreakOverlay.cs index 234daece5e..73f887bfe6 100644 --- a/osu.Game/Screens/Play/BreakOverlay.cs +++ b/osu.Game/Screens/Play/BreakOverlay.cs @@ -2,7 +2,6 @@ // See the LICENCE file in the repository root for full licence text. using System; -using osu.Framework.Audio.Track; using osu.Framework.Bindables; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; @@ -10,10 +9,9 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Effects; using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.UserInterface; -using osu.Game.Beatmaps.ControlPoints; +using osu.Framework.Utils; using osu.Game.Beatmaps.Timing; using osu.Game.Graphics; -using osu.Game.Graphics.Containers; using osu.Game.Rulesets.Scoring; using osu.Game.Scoring; using osu.Game.Screens.Play.Break; @@ -21,7 +19,7 @@ using osu.Game.Utils; namespace osu.Game.Screens.Play { - public partial class BreakOverlay : BeatSyncedContainer + public partial class BreakOverlay : Container { /// /// The duration of the break overlay fading. @@ -51,12 +49,6 @@ namespace osu.Game.Screens.Play this.scoreProcessor = scoreProcessor; RelativeSizeAxes = Axes.Both; - MinimumBeatLength = 200; - - // Doesn't play well with pause/unpause. - // This might mean that some beats don't animate if the user is running <60fps, but we'll deal with that if anyone notices. - AllowMistimedEventFiring = false; - Child = fadeContainer = new Container { Alpha = 0, @@ -142,25 +134,8 @@ namespace osu.Game.Screens.Play { base.Update(); + remainingTimeBox.Width = (float)Interpolation.DampContinuously(remainingTimeBox.Width, remainingTimeForCurrentPeriod, 40, Math.Abs(Time.Elapsed)); remainingTimeBox.Height = Math.Min(8, remainingTimeBox.DrawWidth); - - // Keep things simple by resetting beat synced transforms on a rewind. - if (Clock.ElapsedFrameTime < 0) - { - remainingTimeBox.ClearTransforms(targetMember: nameof(Width)); - remainingTimeBox.Width = remainingTimeForCurrentPeriod; - } - } - - protected override void OnNewBeat(int beatIndex, TimingControlPoint timingPoint, EffectControlPoint effectPoint, ChannelAmplitudes amplitudes) - { - base.OnNewBeat(beatIndex, timingPoint, effectPoint, amplitudes); - - if (currentPeriod.Value == null) - return; - - float timeBoxTargetWidth = (float)Math.Max(0, remainingTimeForCurrentPeriod - timingPoint.BeatLength / currentPeriod.Value.Value.Duration); - remainingTimeBox.ResizeWidthTo(timeBoxTargetWidth, timingPoint.BeatLength * 3.5, Easing.OutQuint); } private void updateDisplay(ValueChangedEvent period) @@ -182,8 +157,6 @@ namespace osu.Game.Screens.Play .Delay(b.Duration) .ResizeWidthTo(0); - remainingTimeBox.ResizeWidthTo(remainingTimeForCurrentPeriod); - remainingTimeCounter.CountTo(b.Duration + BREAK_FADE_DURATION).CountTo(0, b.Duration + BREAK_FADE_DURATION); remainingTimeCounter.MoveToX(-50) diff --git a/osu.Game/Screens/Play/SkipOverlay.cs b/osu.Game/Screens/Play/SkipOverlay.cs index f9752706ad..a7cea71142 100644 --- a/osu.Game/Screens/Play/SkipOverlay.cs +++ b/osu.Game/Screens/Play/SkipOverlay.cs @@ -9,7 +9,6 @@ using osu.Framework; using osu.Framework.Allocation; using osu.Framework.Audio; using osu.Framework.Audio.Sample; -using osu.Framework.Audio.Track; using osu.Framework.Bindables; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; @@ -20,7 +19,6 @@ using osu.Framework.Graphics.Sprites; using osu.Framework.Input.Bindings; using osu.Framework.Input.Events; using osu.Framework.Utils; -using osu.Game.Beatmaps.ControlPoints; using osu.Game.Graphics; using osu.Game.Graphics.Backgrounds; using osu.Game.Graphics.Containers; @@ -32,7 +30,7 @@ using osuTK.Graphics; namespace osu.Game.Screens.Play { - public partial class SkipOverlay : BeatSyncedContainer, IKeyBindingHandler + public partial class SkipOverlay : Container, IKeyBindingHandler { /// /// The total number of successful skips performed by this overlay. @@ -191,7 +189,7 @@ namespace osu.Game.Screens.Play double progress = Math.Max(0, 1 - (gameplayClock.CurrentTime - displayTime) / (fadeOutBeginTime - displayTime)); - RemainingTimeBox.Width = (float)Interpolation.Lerp(RemainingTimeBox.Width, progress, Math.Clamp(Time.Elapsed / 40, 0, 1)); + RemainingTimeBox.Width = (float)Interpolation.DampContinuously(RemainingTimeBox.Width, progress, 40, Math.Abs(Time.Elapsed)); inSkipPeriod.Value = progress > 0; buttonContainer.State.Value = inSkipPeriod.Value ? Visibility.Visible : Visibility.Hidden; @@ -227,18 +225,6 @@ namespace osu.Game.Screens.Play { } - protected override void OnNewBeat(int beatIndex, TimingControlPoint timingPoint, EffectControlPoint effectPoint, ChannelAmplitudes amplitudes) - { - base.OnNewBeat(beatIndex, timingPoint, effectPoint, amplitudes); - - if (fadeOutBeginTime <= gameplayClock.CurrentTime) - return; - - float progress = (float)(gameplayClock.CurrentTime - displayTime) / (float)(fadeOutBeginTime - displayTime); - float newWidth = 1 - Math.Clamp(progress, 0, 1); - RemainingTimeBox.ResizeWidthTo(newWidth, timingPoint.BeatLength * 3.5, Easing.OutQuint); - } - public partial class FadeContainer : Container, IStateful { [CanBeNull]