1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-16 23:42:54 +08:00

Merge pull request #29925 from nekupaw/skip-overlay-beat-synced-animation

Implement beat-synchronized animation in skip overlay
This commit is contained in:
Dean Herbert 2024-09-19 18:53:45 +09:00 committed by GitHub
commit cd61aecad1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -9,6 +9,7 @@ using osu.Framework;
using osu.Framework.Allocation;
using osu.Framework.Audio;
using osu.Framework.Audio.Sample;
using osu.Framework.Audio.Track;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
@ -16,6 +17,7 @@ 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.Containers;
using osu.Game.Graphics.Sprites;
@ -26,7 +28,7 @@ using osuTK.Graphics;
namespace osu.Game.Screens.Play
{
public partial class SkipOverlay : CompositeDrawable, IKeyBindingHandler<GlobalAction>
public partial class SkipOverlay : BeatSyncedContainer, IKeyBindingHandler<GlobalAction>
{
/// <summary>
/// The total number of successful skips performed by this overlay.
@ -36,10 +38,9 @@ namespace osu.Game.Screens.Play
private readonly double startTime;
public Action RequestSkip;
private Button button;
private ButtonContainer buttonContainer;
private Box remainingTimeBox;
private Circle remainingTimeBox;
private FadeContainer fadeContainer;
private double displayTime;
@ -51,7 +52,6 @@ namespace osu.Game.Screens.Play
private IGameplayClock gameplayClock { get; set; }
internal bool IsButtonVisible => fadeContainer.State == Visibility.Visible && buttonContainer.State.Value == Visibility.Visible;
public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => true;
/// <summary>
@ -87,13 +87,13 @@ namespace osu.Game.Screens.Play
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
},
remainingTimeBox = new Box
remainingTimeBox = new Circle
{
Height = 5,
RelativeSizeAxes = Axes.X,
Colour = colours.Yellow,
Anchor = Anchor.BottomCentre,
Origin = Anchor.BottomCentre,
Colour = colours.Yellow,
RelativeSizeAxes = Axes.X
}
}
}
@ -210,6 +210,18 @@ 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 * 2, Easing.OutQuint);
}
public partial class FadeContainer : Container, IStateful<Visibility>
{
[CanBeNull]