From 78273d76e3cef6fe52b011e4a5392586031ee236 Mon Sep 17 00:00:00 2001 From: ocboogie Date: Sun, 16 Apr 2017 20:18:41 -0700 Subject: [PATCH 01/11] Added basic loading screen and test case --- .../Tests/TestCasePlayerLoadingScreen.cs | 31 ++++++++++++++++ osu.Game/Screens/Play/LoadingScreen.cs | 37 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 osu.Desktop.VisualTests/Tests/TestCasePlayerLoadingScreen.cs create mode 100644 osu.Game/Screens/Play/LoadingScreen.cs diff --git a/osu.Desktop.VisualTests/Tests/TestCasePlayerLoadingScreen.cs b/osu.Desktop.VisualTests/Tests/TestCasePlayerLoadingScreen.cs new file mode 100644 index 0000000000..9e0ba161c9 --- /dev/null +++ b/osu.Desktop.VisualTests/Tests/TestCasePlayerLoadingScreen.cs @@ -0,0 +1,31 @@ +// Copyright (c) 2007-2017 ppy Pty Ltd . +// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE + +using osu.Framework.Graphics; +using osu.Framework.Graphics.Primitives; +using osu.Framework.Testing; +using osu.Game.Database; +using osu.Game.Screens.Select; +using System.Linq; +using osu.Game.Screens.Play; +using OpenTK; + +namespace osu.Desktop.VisualTests.Tests +{ + public class TestCasePlayerLoadingScreen : TestCase + { + public override string Description => @"Loading screen in player"; + + public override void Reset() + { + base.Reset(); + + Add(new LoadingScreen + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + }); + } + } +} + diff --git a/osu.Game/Screens/Play/LoadingScreen.cs b/osu.Game/Screens/Play/LoadingScreen.cs new file mode 100644 index 0000000000..7ac6b83cd8 --- /dev/null +++ b/osu.Game/Screens/Play/LoadingScreen.cs @@ -0,0 +1,37 @@ +using osu.Framework.Allocation; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Primitives; +using osu.Framework.Graphics.Sprites; +using osu.Framework.Screens; +using osu.Game.Beatmaps; +using osu.Game.Database; +using osu.Game.Graphics; +using osu.Game.Graphics.Sprites; +using osu.Game.Screens.Backgrounds; +using osu.Game.Screens.Menu; +using OpenTK; + +namespace osu.Game.Screens.Play +{ + public class LoadingScreen : OsuScreen + { + + private string loadingText = "loading..."; + + [BackgroundDependencyLoader] + private void load() + { + Add( + new OsuSpriteText + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Text = loadingText, + TextSize = 48, + Font = @"Exo2.0-MediumItalic" + } + ); + } + } +} From aa466d0e84d8b4c60deb98f27b5533999d3c08d1 Mon Sep 17 00:00:00 2001 From: ocboogie Date: Mon, 17 Apr 2017 21:30:51 -0700 Subject: [PATCH 02/11] PlayerLoader creates a new instance of the Player class on Restart --- .../Tests/TestCasePlayerLoadingScreen.cs | 31 ---------------- osu.Game/Screens/Play/LoadingScreen.cs | 37 ------------------- osu.Game/Screens/Play/Player.cs | 19 +++------- osu.Game/Screens/Play/PlayerLoader.cs | 34 ++++++++++++++++- 4 files changed, 38 insertions(+), 83 deletions(-) delete mode 100644 osu.Desktop.VisualTests/Tests/TestCasePlayerLoadingScreen.cs delete mode 100644 osu.Game/Screens/Play/LoadingScreen.cs diff --git a/osu.Desktop.VisualTests/Tests/TestCasePlayerLoadingScreen.cs b/osu.Desktop.VisualTests/Tests/TestCasePlayerLoadingScreen.cs deleted file mode 100644 index 9e0ba161c9..0000000000 --- a/osu.Desktop.VisualTests/Tests/TestCasePlayerLoadingScreen.cs +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2007-2017 ppy Pty Ltd . -// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE - -using osu.Framework.Graphics; -using osu.Framework.Graphics.Primitives; -using osu.Framework.Testing; -using osu.Game.Database; -using osu.Game.Screens.Select; -using System.Linq; -using osu.Game.Screens.Play; -using OpenTK; - -namespace osu.Desktop.VisualTests.Tests -{ - public class TestCasePlayerLoadingScreen : TestCase - { - public override string Description => @"Loading screen in player"; - - public override void Reset() - { - base.Reset(); - - Add(new LoadingScreen - { - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - }); - } - } -} - diff --git a/osu.Game/Screens/Play/LoadingScreen.cs b/osu.Game/Screens/Play/LoadingScreen.cs deleted file mode 100644 index 7ac6b83cd8..0000000000 --- a/osu.Game/Screens/Play/LoadingScreen.cs +++ /dev/null @@ -1,37 +0,0 @@ -using osu.Framework.Allocation; -using osu.Framework.Graphics; -using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Primitives; -using osu.Framework.Graphics.Sprites; -using osu.Framework.Screens; -using osu.Game.Beatmaps; -using osu.Game.Database; -using osu.Game.Graphics; -using osu.Game.Graphics.Sprites; -using osu.Game.Screens.Backgrounds; -using osu.Game.Screens.Menu; -using OpenTK; - -namespace osu.Game.Screens.Play -{ - public class LoadingScreen : OsuScreen - { - - private string loadingText = "loading..."; - - [BackgroundDependencyLoader] - private void load() - { - Add( - new OsuSpriteText - { - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - Text = loadingText, - TextSize = 48, - Font = @"Exo2.0-MediumItalic" - } - ); - } - } -} diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index fa564cdd61..6539fdb732 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -35,6 +35,8 @@ namespace osu.Game.Screens.Play public BeatmapInfo BeatmapInfo; + public Action OnRestart; + public bool IsPaused => !interpolatedSourceClock.IsRunning; public bool HasFailed { get; private set; } @@ -243,20 +245,9 @@ namespace osu.Game.Screens.Play public void Restart() { - sourceClock.Stop(); // If the clock is running and Restart is called the game will lag until relaunch - - var newPlayer = new Player(); - - ValidForResume = false; - - LoadComponentAsync(newPlayer, delegate - { - newPlayer.RestartCount = RestartCount + 1; - if (!Push(newPlayer)) - { - // Error(?) - } - }); + System.Diagnostics.Debug.WriteLine("TEST"); + OnRestart?.Invoke(); + Exit(); } private ScheduledDelegate onCompletionEvent; diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index 64d17fd5bb..0841ec6afc 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -19,15 +19,22 @@ namespace osu.Game.Screens.Play { public class PlayerLoader : OsuScreen { - private readonly Player player; + private Player player; + private readonly OsuLogo logo; private BeatmapMetadataDisplay info; + private bool showOverlays = false; + internal override bool ShowOverlays => showOverlays; + protected override BackgroundScreen CreateBackground() => new BackgroundScreenBeatmap(Beatmap); public PlayerLoader(Player player) { ValidForResume = false; + + player.OnRestart = restart; + this.player = player; Children = new Drawable[] @@ -38,6 +45,7 @@ namespace osu.Game.Screens.Play Interactive = false, }, }; + } [BackgroundDependencyLoader] @@ -53,6 +61,30 @@ namespace osu.Game.Screens.Play LoadComponentAsync(player); } + protected override void OnResuming(Screen last) + { + base.OnResuming(last); + if (last != player) return; + var newPlayer = new Player + { + RestartCount = player.RestartCount + 1, + OnRestart = restart + }; + player = newPlayer; + LoadComponentAsync(newPlayer, delegate + { + if (!Push(newPlayer)) + Exit(); + ValidForResume = false; + }); + } + + private void restart() + { + showOverlays = false; + ValidForResume = true; + } + protected override void OnEntering(Screen last) { base.OnEntering(last); From 5c48fa6cb15320de4eaf414b15a73142fa226abb Mon Sep 17 00:00:00 2001 From: ocboogie Date: Mon, 17 Apr 2017 21:35:48 -0700 Subject: [PATCH 03/11] Removed testing line --- osu.Game/Screens/Play/Player.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index 6539fdb732..60903d66c4 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -245,7 +245,6 @@ namespace osu.Game.Screens.Play public void Restart() { - System.Diagnostics.Debug.WriteLine("TEST"); OnRestart?.Invoke(); Exit(); } From be8d32688b99c7aae8b7444ed4b021187c7ccd0a Mon Sep 17 00:00:00 2001 From: ocboogie Date: Mon, 17 Apr 2017 22:36:03 -0700 Subject: [PATCH 04/11] Fixed HotkeyRetryOverlay just going to a black screen --- osu.Game/Screens/Play/Player.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index 60903d66c4..4275530187 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -46,6 +46,8 @@ namespace osu.Game.Screens.Play private const double pause_cooldown = 1000; private double lastPauseActionTime; + private bool restarting = false; + private bool canPause => ValidForResume && !HasFailed && Time.Current >= lastPauseActionTime + pause_cooldown; private IAdjustableClock sourceClock; @@ -245,6 +247,7 @@ namespace osu.Game.Screens.Play public void Restart() { + restarting = true; OnRestart?.Invoke(); Exit(); } @@ -320,7 +323,7 @@ namespace osu.Game.Screens.Play if (HasFailed || !ValidForResume) return false; - if (pauseOverlay != null && !HitRenderer.HasReplayLoaded) + if (pauseOverlay != null && !HitRenderer.HasReplayLoaded && !restarting) { //pause screen override logic. if (pauseOverlay?.State == Visibility.Hidden && !canPause) return true; From c0f4cbcba6383177d2c763e03c47cef45ab9b874 Mon Sep 17 00:00:00 2001 From: ocboogie Date: Mon, 17 Apr 2017 23:36:11 -0700 Subject: [PATCH 05/11] Added back PlayerLoader overlays --- osu.Game/Screens/Play/PlayerLoader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index 0841ec6afc..9ee4c700d2 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -24,7 +24,7 @@ namespace osu.Game.Screens.Play private readonly OsuLogo logo; private BeatmapMetadataDisplay info; - private bool showOverlays = false; + private bool showOverlays = true; internal override bool ShowOverlays => showOverlays; protected override BackgroundScreen CreateBackground() => new BackgroundScreenBeatmap(Beatmap); From 2bd89e922fd1bd980f182b467b01c31330640a20 Mon Sep 17 00:00:00 2001 From: ocboogie Date: Mon, 17 Apr 2017 23:48:21 -0700 Subject: [PATCH 06/11] Removed unneeded newPlayer --- osu.Game/Screens/Play/PlayerLoader.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index 9ee4c700d2..2f74cd854f 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -65,15 +65,14 @@ namespace osu.Game.Screens.Play { base.OnResuming(last); if (last != player) return; - var newPlayer = new Player + player = new Player { RestartCount = player.RestartCount + 1, OnRestart = restart }; - player = newPlayer; - LoadComponentAsync(newPlayer, delegate + LoadComponentAsync(player, delegate { - if (!Push(newPlayer)) + if (!Push(player)) Exit(); ValidForResume = false; }); From 1f7373db8f39dad52a43d651ba4c0da54e015aa6 Mon Sep 17 00:00:00 2001 From: ocboogie Date: Mon, 17 Apr 2017 23:52:38 -0700 Subject: [PATCH 07/11] Removed unneeded restarting variable --- osu.Game/Screens/Play/Player.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index 4275530187..a6e5f56aa3 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -46,8 +46,6 @@ namespace osu.Game.Screens.Play private const double pause_cooldown = 1000; private double lastPauseActionTime; - private bool restarting = false; - private bool canPause => ValidForResume && !HasFailed && Time.Current >= lastPauseActionTime + pause_cooldown; private IAdjustableClock sourceClock; @@ -247,7 +245,7 @@ namespace osu.Game.Screens.Play public void Restart() { - restarting = true; + ValidForResume = false; OnRestart?.Invoke(); Exit(); } @@ -323,7 +321,7 @@ namespace osu.Game.Screens.Play if (HasFailed || !ValidForResume) return false; - if (pauseOverlay != null && !HitRenderer.HasReplayLoaded && !restarting) + if (pauseOverlay != null && !HitRenderer.HasReplayLoaded) { //pause screen override logic. if (pauseOverlay?.State == Visibility.Hidden && !canPause) return true; From 2ccb8b154f73ddd46407fb6a853a075f9489dafc Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 18 Apr 2017 16:47:30 +0900 Subject: [PATCH 08/11] Change conditional ordering to allow player to always run its fadeOut sequence. --- osu.Game/Screens/Play/Player.cs | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index 7cee080f61..d0f2e2be5a 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -315,24 +315,23 @@ namespace osu.Game.Screens.Play protected override void OnSuspending(Screen next) { fadeOut(); - base.OnSuspending(next); } protected override bool OnExiting(Screen next) { - if (HasFailed || !ValidForResume) - return false; - - if (pauseOverlay != null && !HitRenderer.HasReplayLoaded) + if (!HasFailed && ValidForResume) { - //pause screen override logic. - if (pauseOverlay?.State == Visibility.Hidden && !canPause) return true; - - if (!IsPaused) // For if the user presses escape quickly when entering the map + if (pauseOverlay != null && !HitRenderer.HasReplayLoaded) { - Pause(); - return true; + //pause screen override logic. + if (pauseOverlay?.State == Visibility.Hidden && !canPause) return true; + + if (!IsPaused) // For if the user presses escape quickly when entering the map + { + Pause(); + return true; + } } } From edd71c0560607df2a8536399a6e80960e9a6e85c Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 18 Apr 2017 16:56:01 +0900 Subject: [PATCH 09/11] Tidy up and comment PlayerLoader logic. --- osu.Game/Screens/Play/Player.cs | 4 ++-- osu.Game/Screens/Play/PlayerLoader.cs | 29 +++++++++++++-------------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index d0f2e2be5a..f831387626 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -35,7 +35,7 @@ namespace osu.Game.Screens.Play public BeatmapInfo BeatmapInfo; - public Action OnRestart; + public Action RestartRequested; public bool IsPaused => !interpolatedSourceClock.IsRunning; @@ -249,7 +249,7 @@ namespace osu.Game.Screens.Play public void Restart() { ValidForResume = false; - OnRestart?.Invoke(); + RestartRequested?.Invoke(); Exit(); } diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index 2f74cd854f..642826753c 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -31,11 +31,16 @@ namespace osu.Game.Screens.Play public PlayerLoader(Player player) { + this.player = player; + + //By default, we want to load the player and never be returned to. + //Note that this may change if the player we load requested a re-run. ValidForResume = false; - player.OnRestart = restart; - - this.player = player; + player.RestartRequested = () => { + showOverlays = false; + ValidForResume = true; + }; Children = new Drawable[] { @@ -45,7 +50,6 @@ namespace osu.Game.Screens.Play Interactive = false, }, }; - } [BackgroundDependencyLoader] @@ -64,13 +68,14 @@ namespace osu.Game.Screens.Play protected override void OnResuming(Screen last) { base.OnResuming(last); - if (last != player) return; - player = new Player + + //we will only be resumed if the player has requested a re-run (see ValidForResume setting above) + LoadComponentAsync(player = new Player { RestartCount = player.RestartCount + 1, - OnRestart = restart - }; - LoadComponentAsync(player, delegate + RestartRequested = player.RestartRequested, + Beatmap = player.Beatmap, + }, p => { if (!Push(player)) Exit(); @@ -78,12 +83,6 @@ namespace osu.Game.Screens.Play }); } - private void restart() - { - showOverlays = false; - ValidForResume = true; - } - protected override void OnEntering(Screen last) { base.OnEntering(last); From ddff26d1675564eb16b16aadbc5f773fad8b5e84 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 18 Apr 2017 17:00:58 +0900 Subject: [PATCH 10/11] Show metadata when loading between retries. Also speeds up the display a bit. --- osu.Game/Screens/Play/PlayerLoader.cs | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index 642826753c..55236bace2 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -69,6 +69,8 @@ namespace osu.Game.Screens.Play { base.OnResuming(last); + contentIn(); + //we will only be resumed if the player has requested a re-run (see ValidForResume setting above) LoadComponentAsync(player = new Player { @@ -77,12 +79,26 @@ namespace osu.Game.Screens.Play Beatmap = player.Beatmap, }, p => { + contentOut(); + if (!Push(player)) Exit(); ValidForResume = false; }); } + private void contentIn() + { + Content.ScaleTo(1, 750, EasingTypes.OutQuint); + Content.FadeInFromZero(500); + } + + private void contentOut() + { + Content.ScaleTo(0.7f, 300, EasingTypes.InQuint); + Content.FadeOut(250); + } + protected override void OnEntering(Screen last) { base.OnEntering(last); @@ -90,20 +106,19 @@ namespace osu.Game.Screens.Play Background.FadeTo(0.4f, 250); Content.ScaleTo(0.7f); - Content.ScaleTo(1, 750, EasingTypes.OutQuint); - Content.FadeInFromZero(500); - Delay(1000, true); + contentIn(); + + Delay(500, true); logo.MoveToOffset(new Vector2(0, -180), 500, EasingTypes.InOutExpo); Delay(250, true); info.FadeIn(500); - Delay(2000, true); + Delay(1400, true); - Content.ScaleTo(0.7f, 300, EasingTypes.InQuint); - Content.FadeOut(250); + contentOut(); Delay(250); From 5ba85818dbe7820d778cf39b98eed35679ca477f Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 18 Apr 2017 17:07:02 +0900 Subject: [PATCH 11/11] Combine push logic and adjust transitions a bit more. --- osu.Game/Screens/Play/PlayerLoader.cs | 33 ++++++++++++++++----------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index 55236bace2..615b138ead 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -33,10 +33,6 @@ namespace osu.Game.Screens.Play { this.player = player; - //By default, we want to load the player and never be returned to. - //Note that this may change if the player we load requested a re-run. - ValidForResume = false; - player.RestartRequested = () => { showOverlays = false; ValidForResume = true; @@ -77,20 +73,17 @@ namespace osu.Game.Screens.Play RestartCount = player.RestartCount + 1, RestartRequested = player.RestartRequested, Beatmap = player.Beatmap, - }, p => - { - contentOut(); - - if (!Push(player)) - Exit(); - ValidForResume = false; }); + + Delay(400); + + Schedule(pushWhenLoaded); } private void contentIn() { - Content.ScaleTo(1, 750, EasingTypes.OutQuint); - Content.FadeInFromZero(500); + Content.ScaleTo(1, 650, EasingTypes.OutQuint); + Content.FadeInFromZero(400); } private void contentOut() @@ -118,6 +111,14 @@ namespace osu.Game.Screens.Play Delay(1400, true); + Schedule(pushWhenLoaded); + } + + private void pushWhenLoaded() + { + if (!player.IsLoaded) + Schedule(pushWhenLoaded); + contentOut(); Delay(250); @@ -128,6 +129,12 @@ namespace osu.Game.Screens.Play if (!Push(player)) Exit(); + else + { + //By default, we want to load the player and never be returned to. + //Note that this may change if the player we load requested a re-run. + ValidForResume = false; + } }); }