1
0
mirror of https://github.com/ppy/osu.git synced 2025-03-21 14:07:18 +08:00

Merge pull request #631 from peppy/pause-clean-up

Pause clean up
This commit is contained in:
Dean Herbert 2017-04-14 11:22:15 +09:00 committed by GitHub
commit d2fd3f1e0c

View File

@ -35,7 +35,7 @@ namespace osu.Game.Screens.Play
public BeatmapInfo BeatmapInfo;
public bool IsPaused { get; private set; }
public bool IsPaused => !interpolatedSourceClock.IsRunning;
public bool HasFailed { get; private set; }
@ -44,7 +44,7 @@ namespace osu.Game.Screens.Play
private const double pause_cooldown = 1000;
private double lastPauseActionTime;
private bool canPause => Time.Current >= lastPauseActionTime + pause_cooldown;
private bool canPause => ValidForResume && !HasFailed && Time.Current >= lastPauseActionTime + pause_cooldown;
private IAdjustableClock sourceClock;
private IFrameBasedClock interpolatedSourceClock;
@ -204,19 +204,30 @@ namespace osu.Game.Screens.Play
public void Pause(bool force = false)
{
if (canPause || force)
if (!canPause && !force) return;
// the actual pausing is potentially happening on a different thread.
// we want to wait for the source clock to stop so we can be sure all components are in a stable state.
if (!IsPaused)
{
sourceClock.Stop();
Schedule(() => Pause(force));
return;
}
// we need to do a final check after all of our children have processed up to the paused clock time.
// this is to cover cases where, for instance, the player fails in the last processed frame (which would change canPause).
// as the scheduler runs before children updates, let's schedule for the next frame.
Schedule(() =>
{
if (!canPause) return;
lastPauseActionTime = Time.Current;
hudOverlay.KeyCounter.IsCounting = false;
pauseOverlay.Retries = RestartCount;
pauseOverlay.Show();
sourceClock.Stop();
IsPaused = true;
}
else
{
IsPaused = false;
}
});
}
public void Resume()
@ -225,13 +236,6 @@ namespace osu.Game.Screens.Play
hudOverlay.KeyCounter.IsCounting = true;
pauseOverlay.Hide();
sourceClock.Start();
IsPaused = false;
}
public void TogglePaused()
{
IsPaused = !IsPaused;
if (IsPaused) Pause(); else Resume();
}
public void Restart()
@ -240,11 +244,11 @@ namespace osu.Game.Screens.Play
var newPlayer = new Player();
ValidForResume = false;
LoadComponentAsync(newPlayer, delegate
{
newPlayer.RestartCount = RestartCount + 1;
ValidForResume = false;
if (!Push(newPlayer))
{
// Error(?)
@ -260,10 +264,11 @@ namespace osu.Game.Screens.Play
if (scoreProcessor.HasFailed || onCompletionEvent != null)
return;
ValidForResume = false;
Delay(1000);
onCompletionEvent = Schedule(delegate
{
ValidForResume = false;
Push(new Results
{
Score = scoreProcessor.CreateScore()
@ -275,8 +280,6 @@ namespace osu.Game.Screens.Play
{
sourceClock.Stop();
Delay(500);
HasFailed = true;
failOverlay.Retries = RestartCount;
failOverlay.Show();
@ -321,12 +324,15 @@ namespace osu.Game.Screens.Play
protected override bool OnExiting(Screen next)
{
if (HasFailed || !ValidForResume)
return false;
if (pauseOverlay != null && !HitRenderer.HasReplayLoaded)
{
//pause screen override logic.
if (pauseOverlay?.State == Visibility.Hidden && !canPause) return true;
if (!IsPaused && sourceClock.IsRunning) // For if the user presses escape quickly when entering the map
if (!IsPaused) // For if the user presses escape quickly when entering the map
{
Pause();
return true;