mirror of
https://github.com/ppy/osu.git
synced 2025-01-13 03:13:21 +08:00
Simplify gameplay pause sequence
This commit is contained in:
parent
e260e75fac
commit
799c74cfe5
@ -93,15 +93,12 @@ namespace osu.Game.Tests.Visual.Gameplay
|
|||||||
|
|
||||||
double currentTime = masterClock.CurrentTime;
|
double currentTime = masterClock.CurrentTime;
|
||||||
|
|
||||||
bool goingForward = currentTime >= (masterClock.LastStopTime ?? lastStopTime);
|
bool goingForward = currentTime >= lastStopTime;
|
||||||
|
|
||||||
alwaysGoingForward &= goingForward;
|
alwaysGoingForward &= goingForward;
|
||||||
|
|
||||||
if (!goingForward)
|
if (!goingForward)
|
||||||
Logger.Log($"Went too far backwards (last stop: {lastStopTime:N1} current: {currentTime:N1})");
|
Logger.Log($"Went too far backwards (last stop: {lastStopTime:N1} current: {currentTime:N1})");
|
||||||
|
|
||||||
if (masterClock.LastStopTime != null)
|
|
||||||
lastStopTime = masterClock.LastStopTime.Value;
|
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -7,7 +7,6 @@ using osu.Framework.Allocation;
|
|||||||
using osu.Framework.Audio;
|
using osu.Framework.Audio;
|
||||||
using osu.Framework.Audio.Track;
|
using osu.Framework.Audio.Track;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
using osu.Framework.Graphics;
|
|
||||||
using osu.Framework.Logging;
|
using osu.Framework.Logging;
|
||||||
using osu.Framework.Timing;
|
using osu.Framework.Timing;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
@ -60,17 +59,6 @@ namespace osu.Game.Screens.Play
|
|||||||
|
|
||||||
private readonly double skipTargetTime;
|
private readonly double skipTargetTime;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Stores the time at which the last <see cref="StopGameplayClock"/> call was triggered.
|
|
||||||
/// This is used to ensure we resume from that precise point in time, ignoring the proceeding frequency ramp.
|
|
||||||
///
|
|
||||||
/// Optimally, we'd have gameplay ramp down with the frequency, but I believe this was intentionally disabled
|
|
||||||
/// to avoid fails occurring after the pause screen has been shown.
|
|
||||||
///
|
|
||||||
/// In the future I want to change this.
|
|
||||||
/// </summary>
|
|
||||||
internal double? LastStopTime;
|
|
||||||
|
|
||||||
[Resolved]
|
[Resolved]
|
||||||
private MusicController musicController { get; set; } = null!;
|
private MusicController musicController { get; set; } = null!;
|
||||||
|
|
||||||
@ -113,71 +101,17 @@ namespace osu.Game.Screens.Play
|
|||||||
return time;
|
return time;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void StopGameplayClock()
|
|
||||||
{
|
|
||||||
LastStopTime = GameplayClock.CurrentTime;
|
|
||||||
|
|
||||||
if (IsLoaded)
|
|
||||||
{
|
|
||||||
// During normal operation, the source is stopped after performing a frequency ramp.
|
|
||||||
this.TransformBindableTo(GameplayClock.ExternalPauseFrequencyAdjust, 0, 200, Easing.Out).OnComplete(_ =>
|
|
||||||
{
|
|
||||||
if (IsPaused.Value)
|
|
||||||
base.StopGameplayClock();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
base.StopGameplayClock();
|
|
||||||
|
|
||||||
// If not yet loaded, we still want to ensure relevant state is correct, as it is used for offset calculations.
|
|
||||||
GameplayClock.ExternalPauseFrequencyAdjust.Value = 0;
|
|
||||||
|
|
||||||
// We must also process underlying gameplay clocks to update rate-adjusted offsets with the new frequency adjustment.
|
|
||||||
// Without doing this, an initial seek may be performed with the wrong offset.
|
|
||||||
GameplayClock.ProcessFrame();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Seek(double time)
|
public override void Seek(double time)
|
||||||
{
|
{
|
||||||
// Safety in case the clock is seeked while stopped.
|
|
||||||
LastStopTime = null;
|
|
||||||
elapsedValidationTime = null;
|
elapsedValidationTime = null;
|
||||||
|
|
||||||
base.Seek(time);
|
base.Seek(time);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void PrepareStart()
|
|
||||||
{
|
|
||||||
if (LastStopTime != null)
|
|
||||||
{
|
|
||||||
Seek(LastStopTime.Value);
|
|
||||||
LastStopTime = null;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
base.PrepareStart();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void StartGameplayClock()
|
protected override void StartGameplayClock()
|
||||||
{
|
{
|
||||||
addAdjustmentsToTrack();
|
addAdjustmentsToTrack();
|
||||||
|
|
||||||
base.StartGameplayClock();
|
base.StartGameplayClock();
|
||||||
|
|
||||||
if (IsLoaded)
|
|
||||||
{
|
|
||||||
this.TransformBindableTo(GameplayClock.ExternalPauseFrequencyAdjust, 1, 200, Easing.In);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// If not yet loaded, we still want to ensure relevant state is correct, as it is used for offset calculations.
|
|
||||||
GameplayClock.ExternalPauseFrequencyAdjust.Value = 1;
|
|
||||||
|
|
||||||
// We must also process underlying gameplay clocks to update rate-adjusted offsets with the new frequency adjustment.
|
|
||||||
// Without doing this, an initial seek may be performed with the wrong offset.
|
|
||||||
GameplayClock.ProcessFrame();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
Loading…
Reference in New Issue
Block a user