mirror of
https://github.com/ppy/osu.git
synced 2025-02-21 00:53:31 +08:00
Better pause logic
This commit is contained in:
parent
ffd3040fe2
commit
c2cdf12986
@ -89,6 +89,14 @@ namespace osu.Game.Rulesets.UI
|
||||
Ruleset = ruleset;
|
||||
playfield = new Lazy<Playfield>(CreatePlayfield);
|
||||
|
||||
IsPaused.ValueChanged += paused =>
|
||||
{
|
||||
if (HasReplayLoaded)
|
||||
return;
|
||||
|
||||
KeyBindingInputManager.UseParentInput = !paused;
|
||||
};
|
||||
|
||||
Cursor = CreateCursor();
|
||||
}
|
||||
|
||||
@ -120,6 +128,11 @@ namespace osu.Game.Rulesets.UI
|
||||
|
||||
public Replay Replay { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Whether the game is paused. Used to block user input.
|
||||
/// </summary>
|
||||
public readonly BindableBool IsPaused = new BindableBool();
|
||||
|
||||
/// <summary>
|
||||
/// Sets a replay to be used, overriding local input.
|
||||
/// </summary>
|
||||
|
@ -4,6 +4,7 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using osu.Framework.Allocation;
|
||||
using osu.Framework.Configuration;
|
||||
using osu.Framework.Graphics;
|
||||
using osu.Framework.Graphics.Containers;
|
||||
using osu.Framework.Timing;
|
||||
@ -18,7 +19,7 @@ namespace osu.Game.Screens.Play
|
||||
/// </summary>
|
||||
public class PauseContainer : Container
|
||||
{
|
||||
public bool IsPaused { get; private set; }
|
||||
public readonly BindableBool IsPaused = new BindableBool();
|
||||
|
||||
public Func<bool> CheckCanPause;
|
||||
|
||||
@ -39,9 +40,6 @@ namespace osu.Game.Screens.Play
|
||||
public Action OnRetry;
|
||||
public Action OnQuit;
|
||||
|
||||
public Action OnResume;
|
||||
public Action OnPause;
|
||||
|
||||
private readonly FramedClock framedClock;
|
||||
private readonly DecoupleableInterpolatingFramedClock decoupledClock;
|
||||
|
||||
@ -84,9 +82,8 @@ namespace osu.Game.Screens.Play
|
||||
|
||||
// stop the seekable clock (stops the audio eventually)
|
||||
decoupledClock.Stop();
|
||||
IsPaused = true;
|
||||
IsPaused.Value = true;
|
||||
|
||||
OnPause?.Invoke();
|
||||
pauseOverlay.Show();
|
||||
|
||||
lastPauseActionTime = Time.Current;
|
||||
@ -96,7 +93,7 @@ namespace osu.Game.Screens.Play
|
||||
{
|
||||
if (!IsPaused) return;
|
||||
|
||||
IsPaused = false;
|
||||
IsPaused.Value = false;
|
||||
IsResuming = false;
|
||||
lastPauseActionTime = Time.Current;
|
||||
|
||||
@ -105,7 +102,6 @@ namespace osu.Game.Screens.Play
|
||||
decoupledClock.Seek(decoupledClock.CurrentTime);
|
||||
decoupledClock.Start();
|
||||
|
||||
OnResume?.Invoke();
|
||||
pauseOverlay.Hide();
|
||||
}
|
||||
|
||||
|
@ -165,12 +165,6 @@ namespace osu.Game.Screens.Play
|
||||
OnRetry = Restart,
|
||||
OnQuit = Exit,
|
||||
CheckCanPause = () => AllowPause && ValidForResume && !HasFailed && !RulesetContainer.HasReplayLoaded,
|
||||
OnPause = () =>
|
||||
{
|
||||
pauseContainer.Retries = RestartCount;
|
||||
hudOverlay.KeyCounter.IsCounting = !pauseContainer.IsPaused;
|
||||
},
|
||||
OnResume = () => hudOverlay.KeyCounter.IsCounting = true,
|
||||
Children = new[]
|
||||
{
|
||||
storyboardContainer = new Container
|
||||
@ -227,6 +221,8 @@ namespace osu.Game.Screens.Play
|
||||
hudOverlay.HoldToQuit.Action = Exit;
|
||||
hudOverlay.KeyCounter.Visible.BindTo(RulesetContainer.HasReplayLoaded);
|
||||
|
||||
RulesetContainer.IsPaused.BindTo(pauseContainer.IsPaused);
|
||||
|
||||
if (ShowStoryboard)
|
||||
initializeStoryboard(false);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user