1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-18 14:43:22 +08:00

Merge pull request #31342 from minetoblend/feature/speedy-metronome

Speed up metronome in timing screen when pressing control key
This commit is contained in:
Bartłomiej Dach 2024-12-31 14:49:48 +01:00 committed by GitHub
commit 929173c971
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -12,6 +12,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Colour;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.Shapes;
using osu.Framework.Input.Events;
using osu.Framework.Threading; using osu.Framework.Threading;
using osu.Framework.Timing; using osu.Framework.Timing;
using osu.Framework.Utils; using osu.Framework.Utils;
@ -41,6 +42,9 @@ namespace osu.Game.Screens.Edit.Timing
[Resolved] [Resolved]
private OverlayColourProvider overlayColourProvider { get; set; } = null!; private OverlayColourProvider overlayColourProvider { get; set; } = null!;
[Resolved]
private BindableBeatDivisor beatDivisor { get; set; } = null!;
public bool EnableClicking public bool EnableClicking
{ {
get => metronomeTick.EnableClicking; get => metronomeTick.EnableClicking;
@ -222,7 +226,7 @@ namespace osu.Game.Screens.Edit.Timing
Clock = new FramedClock(metronomeClock = new StopwatchClock(true)); Clock = new FramedClock(metronomeClock = new StopwatchClock(true));
} }
private double beatLength; private double effectiveBeatLength;
private TimingControlPoint timingPoint = null!; private TimingControlPoint timingPoint = null!;
@ -232,11 +236,26 @@ namespace osu.Game.Screens.Edit.Timing
private ScheduledDelegate? latchDelegate; private ScheduledDelegate? latchDelegate;
private bool spedUp;
private int computeSpedUpDivisor()
{
if (!spedUp)
return 1;
if (beatDivisor.Value % 3 == 0)
return 3;
if (beatDivisor.Value % 2 == 0)
return 2;
return 1;
}
protected override void LoadComplete() protected override void LoadComplete()
{ {
base.LoadComplete(); base.LoadComplete();
interpolatedBpm.BindValueChanged(bpm => bpmText.Text = bpm.NewValue.ToLocalisableString()); interpolatedBpm.BindValueChanged(_ => bpmText.Text = interpolatedBpm.Value.ToLocalisableString());
} }
protected override void Update() protected override void Update()
@ -250,16 +269,20 @@ namespace osu.Game.Screens.Edit.Timing
timingPoint = BeatSyncSource.ControlPoints.TimingPointAt(BeatSyncSource.Clock.CurrentTime); timingPoint = BeatSyncSource.ControlPoints.TimingPointAt(BeatSyncSource.Clock.CurrentTime);
if (beatLength != timingPoint.BeatLength) Divisor = metronomeTick.Divisor = computeSpedUpDivisor();
if (effectiveBeatLength != timingPoint.BeatLength / Divisor)
{ {
beatLength = timingPoint.BeatLength; effectiveBeatLength = timingPoint.BeatLength / Divisor;
EarlyActivationMilliseconds = timingPoint.BeatLength / 2; EarlyActivationMilliseconds = timingPoint.BeatLength / 2;
float bpmRatio = (float)Interpolation.ApplyEasing(Easing.OutQuad, Math.Clamp((timingPoint.BPM - 30) / 480, 0, 1)); double effectiveBpm = 60000 / effectiveBeatLength;
float bpmRatio = (float)Interpolation.ApplyEasing(Easing.OutQuad, Math.Clamp((effectiveBpm - 30) / 480, 0, 1));
weight.MoveToY((float)Interpolation.Lerp(0.1f, 0.83f, bpmRatio), 600, Easing.OutQuint); weight.MoveToY((float)Interpolation.Lerp(0.1f, 0.83f, bpmRatio), 600, Easing.OutQuint);
this.TransformBindableTo(interpolatedBpm, (int)Math.Round(timingPoint.BPM), 600, Easing.OutQuint); this.TransformBindableTo(interpolatedBpm, (int)Math.Round(effectiveBpm), 600, Easing.OutQuint);
} }
if (!BeatSyncSource.Clock.IsRunning && isSwinging) if (!BeatSyncSource.Clock.IsRunning && isSwinging)
@ -305,7 +328,7 @@ namespace osu.Game.Screens.Edit.Timing
float currentAngle = swing.Rotation; float currentAngle = swing.Rotation;
float targetAngle = currentAngle > 0 ? -angle : angle; float targetAngle = currentAngle > 0 ? -angle : angle;
swing.RotateTo(targetAngle, beatLength, Easing.InOutQuad); swing.RotateTo(targetAngle, effectiveBeatLength, Easing.InOutQuad);
} }
private void onTickPlayed() private void onTickPlayed()
@ -313,9 +336,25 @@ namespace osu.Game.Screens.Edit.Timing
// Originally, this flash only occurred when the pendulum correctly passess the centre. // Originally, this flash only occurred when the pendulum correctly passess the centre.
// Mappers weren't happy with the metronome tick not playing immediately after starting playback // Mappers weren't happy with the metronome tick not playing immediately after starting playback
// so now this matches the actual tick sample. // so now this matches the actual tick sample.
stick.FlashColour(overlayColourProvider.Content1, beatLength, Easing.OutQuint); stick.FlashColour(overlayColourProvider.Content1, effectiveBeatLength, Easing.OutQuint);
} }
protected override bool OnKeyDown(KeyDownEvent e)
{
updateDivisorFromKey(e);
return base.OnKeyDown(e);
}
protected override void OnKeyUp(KeyUpEvent e)
{
base.OnKeyUp(e);
updateDivisorFromKey(e);
}
private void updateDivisorFromKey(UIEvent e) => spedUp = e.ControlPressed;
private partial class MetronomeTick : BeatSyncedContainer private partial class MetronomeTick : BeatSyncedContainer
{ {
public bool EnableClicking; public bool EnableClicking;