mirror of
https://github.com/ppy/osu.git
synced 2025-01-18 11: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:
commit
929173c971
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user