From 4ab4f65c83e04942f4865acabe7ce0c266d6152b Mon Sep 17 00:00:00 2001 From: Andrey Zavadskiy Date: Sun, 9 Apr 2017 16:26:31 +0300 Subject: [PATCH 1/8] Retry on Tilde key --- osu.Game/Screens/Play/Player.cs | 53 +++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index 36ab1ab946..0af3dcecba 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -22,6 +22,10 @@ using System; using System.Linq; using osu.Framework.Threading; using osu.Game.Modes.Scoring; +using OpenTK.Input; +using osu.Framework.Audio.Sample; +using osu.Framework.Graphics.Sprites; +using OpenTK.Graphics; namespace osu.Game.Screens.Play { @@ -59,10 +63,16 @@ namespace osu.Game.Screens.Play private HudOverlay hudOverlay; private PauseOverlay pauseOverlay; private FailOverlay failOverlay; + private Box retryOverlay; + + private SampleChannel SampleClick; [BackgroundDependencyLoader] private void load(AudioManager audio, BeatmapDatabase beatmaps, OsuConfigManager config) { + AlwaysPresent = true; + SampleClick = audio.Sample.Get(@"Menu/menuback"); + var beatmap = Beatmap.Beatmap; if (beatmap.BeatmapInfo?.Mode > PlayMode.Taiko) @@ -157,6 +167,13 @@ namespace osu.Game.Screens.Play { OnRetry = Restart, OnQuit = Exit, + }, + retryOverlay = new Box + { + Alpha = 0, + AlwaysPresent = true, + RelativeSizeAxes = Axes.Both, + Colour = Color4.Black, } }; } @@ -331,5 +348,41 @@ namespace osu.Game.Screens.Play private Bindable mouseWheelDisabled; protected override bool OnWheel(InputState state) => mouseWheelDisabled.Value && !IsPaused; + + private bool isHolded; + protected override bool OnKeyDown(InputState state, KeyDownEventArgs args) + { + if (args.Repeat) return false; + + if (args.Key == Key.Tilde) + { + isHolded = true; + + retryOverlay.FadeIn(500); + + Delay(500).Schedule(() =>{ + if (isHolded) + { + SampleClick.Play(); + Restart(); + } + }); + return true; + } + + return base.OnKeyDown(state, args); + } + + protected override bool OnKeyUp(InputState state, KeyUpEventArgs args) + { + if (args.Key == Key.Tilde) + { + isHolded = false; + retryOverlay.FadeOut(200); + return true; + } + + return base.OnKeyUp(state, args); + } } } \ No newline at end of file From 425e96c45cacbdbb07f6d60f4997f9a25014321c Mon Sep 17 00:00:00 2001 From: Andrey Zavadskiy Date: Sun, 9 Apr 2017 17:44:19 +0300 Subject: [PATCH 2/8] Moved logic to it's own class --- osu.Game/Screens/Play/Player.cs | 55 +++-------------------- osu.Game/Screens/Play/RetryOverlay.cs | 65 +++++++++++++++++++++++++++ osu.Game/osu.Game.csproj | 1 + 3 files changed, 71 insertions(+), 50 deletions(-) create mode 100644 osu.Game/Screens/Play/RetryOverlay.cs diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index 0af3dcecba..3b67f8d6e6 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -22,9 +22,6 @@ using System; using System.Linq; using osu.Framework.Threading; using osu.Game.Modes.Scoring; -using OpenTK.Input; -using osu.Framework.Audio.Sample; -using osu.Framework.Graphics.Sprites; using OpenTK.Graphics; namespace osu.Game.Screens.Play @@ -63,16 +60,11 @@ namespace osu.Game.Screens.Play private HudOverlay hudOverlay; private PauseOverlay pauseOverlay; private FailOverlay failOverlay; - private Box retryOverlay; - - private SampleChannel SampleClick; + private RetryOverlay retryOverlay; [BackgroundDependencyLoader] private void load(AudioManager audio, BeatmapDatabase beatmaps, OsuConfigManager config) { - AlwaysPresent = true; - SampleClick = audio.Sample.Get(@"Menu/menuback"); - var beatmap = Beatmap.Beatmap; if (beatmap.BeatmapInfo?.Mode > PlayMode.Taiko) @@ -168,12 +160,11 @@ namespace osu.Game.Screens.Play OnRetry = Restart, OnQuit = Exit, }, - retryOverlay = new Box + retryOverlay = new RetryOverlay { - Alpha = 0, - AlwaysPresent = true, - RelativeSizeAxes = Axes.Both, - Colour = Color4.Black, + Action = Restart, + OnKeyPressed = () => Content.FadeColour(Color4.Black, 500), + OnKeyReleased = () => Content.FadeColour(Color4.White, 200), } }; } @@ -348,41 +339,5 @@ namespace osu.Game.Screens.Play private Bindable mouseWheelDisabled; protected override bool OnWheel(InputState state) => mouseWheelDisabled.Value && !IsPaused; - - private bool isHolded; - protected override bool OnKeyDown(InputState state, KeyDownEventArgs args) - { - if (args.Repeat) return false; - - if (args.Key == Key.Tilde) - { - isHolded = true; - - retryOverlay.FadeIn(500); - - Delay(500).Schedule(() =>{ - if (isHolded) - { - SampleClick.Play(); - Restart(); - } - }); - return true; - } - - return base.OnKeyDown(state, args); - } - - protected override bool OnKeyUp(InputState state, KeyUpEventArgs args) - { - if (args.Key == Key.Tilde) - { - isHolded = false; - retryOverlay.FadeOut(200); - return true; - } - - return base.OnKeyUp(state, args); - } } } \ No newline at end of file diff --git a/osu.Game/Screens/Play/RetryOverlay.cs b/osu.Game/Screens/Play/RetryOverlay.cs new file mode 100644 index 0000000000..e44f7d8914 --- /dev/null +++ b/osu.Game/Screens/Play/RetryOverlay.cs @@ -0,0 +1,65 @@ +// Copyright (c) 2007-2017 ppy Pty Ltd . +// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE + +using osu.Framework.Input; +using OpenTK.Input; +using osu.Framework.Allocation; +using osu.Framework.Audio.Sample; +using osu.Framework.Audio; +using System; +using osu.Framework.Graphics.Containers; + +namespace osu.Game.Screens.Play +{ + public class RetryOverlay : Container + { + public Action Action; + public Action OnKeyPressed; + public Action OnKeyReleased; + + private SampleChannel retrySample; + private bool keyIsHeld; + + [BackgroundDependencyLoader] + private void load(AudioManager audio) + { + retrySample = audio.Sample.Get(@"Menu/menuback"); + AlwaysPresent = true; + } + + protected override bool OnKeyDown(InputState state, KeyDownEventArgs args) + { + if (args.Repeat) return false; + + if (args.Key == Key.Tilde) + { + keyIsHeld = true; + OnKeyPressed(); + + Delay(500).Schedule(() => + { + if (keyIsHeld) + { + retrySample.Play(); + Action(); + } + }); + return true; + } + + return base.OnKeyDown(state, args); + } + + protected override bool OnKeyUp(InputState state, KeyUpEventArgs args) + { + if (args.Key == Key.Tilde) + { + keyIsHeld = false; + OnKeyReleased(); + return true; + } + + return base.OnKeyUp(state, args); + } + } +} diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index 6dd5ec3088..1777bf6dc2 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -180,6 +180,7 @@ + From a7264aa84cd86188379fd72e403172175e5094dc Mon Sep 17 00:00:00 2001 From: Andrey Zavadskiy Date: Sun, 9 Apr 2017 17:53:16 +0300 Subject: [PATCH 3/8] Warning fix --- osu.Game/Screens/Play/Player.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index 3b67f8d6e6..af3da23231 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -60,7 +60,6 @@ namespace osu.Game.Screens.Play private HudOverlay hudOverlay; private PauseOverlay pauseOverlay; private FailOverlay failOverlay; - private RetryOverlay retryOverlay; [BackgroundDependencyLoader] private void load(AudioManager audio, BeatmapDatabase beatmaps, OsuConfigManager config) @@ -160,7 +159,7 @@ namespace osu.Game.Screens.Play OnRetry = Restart, OnQuit = Exit, }, - retryOverlay = new RetryOverlay + new RetryOverlay { Action = Restart, OnKeyPressed = () => Content.FadeColour(Color4.Black, 500), From e73f543c4f02a140418da3b1e5bb517aafca2190 Mon Sep 17 00:00:00 2001 From: Andrey Zavadskiy Date: Mon, 10 Apr 2017 06:06:10 +0300 Subject: [PATCH 4/8] Applied suggestions --- ...{RetryOverlay.cs => HotkeyRetryOverlay.cs} | 45 ++++++++++++------- osu.Game/Screens/Play/Player.cs | 4 +- osu.Game/osu.Game.csproj | 2 +- 3 files changed, 32 insertions(+), 19 deletions(-) rename osu.Game/Screens/Play/{RetryOverlay.cs => HotkeyRetryOverlay.cs} (53%) diff --git a/osu.Game/Screens/Play/RetryOverlay.cs b/osu.Game/Screens/Play/HotkeyRetryOverlay.cs similarity index 53% rename from osu.Game/Screens/Play/RetryOverlay.cs rename to osu.Game/Screens/Play/HotkeyRetryOverlay.cs index e44f7d8914..4e383510fc 100644 --- a/osu.Game/Screens/Play/RetryOverlay.cs +++ b/osu.Game/Screens/Play/HotkeyRetryOverlay.cs @@ -8,23 +8,41 @@ using osu.Framework.Audio.Sample; using osu.Framework.Audio; using System; using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Sprites; +using OpenTK.Graphics; +using osu.Framework.Threading; namespace osu.Game.Screens.Play { - public class RetryOverlay : Container + public class HotkeyRetryOverlay : Container { public Action Action; - public Action OnKeyPressed; - public Action OnKeyReleased; private SampleChannel retrySample; - private bool keyIsHeld; + private ScheduledDelegate task; + private Box overlay; + + private const int activate_delay = 500; + private const int fadeout_delay = 200; [BackgroundDependencyLoader] private void load(AudioManager audio) { retrySample = audio.Sample.Get(@"Menu/menuback"); + RelativeSizeAxes = Axes.Both; AlwaysPresent = true; + + Children = new Drawable[] + { + overlay = new Box + { + Alpha = 0, + AlwaysPresent = true, + Colour = Color4.Black, + RelativeSizeAxes = Axes.Both, + } + }; } protected override bool OnKeyDown(InputState state, KeyDownEventArgs args) @@ -33,17 +51,14 @@ namespace osu.Game.Screens.Play if (args.Key == Key.Tilde) { - keyIsHeld = true; - OnKeyPressed(); + overlay.FadeIn(activate_delay); - Delay(500).Schedule(() => + task = Scheduler.AddDelayed(() => { - if (keyIsHeld) - { - retrySample.Play(); - Action(); - } - }); + retrySample.Play(); + Action(); + }, activate_delay); + return true; } @@ -54,8 +69,8 @@ namespace osu.Game.Screens.Play { if (args.Key == Key.Tilde) { - keyIsHeld = false; - OnKeyReleased(); + task?.Cancel(); + overlay.FadeOut(fadeout_delay); return true; } diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index af3da23231..939895654b 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -159,11 +159,9 @@ namespace osu.Game.Screens.Play OnRetry = Restart, OnQuit = Exit, }, - new RetryOverlay + new HotkeyRetryOverlay { Action = Restart, - OnKeyPressed = () => Content.FadeColour(Color4.Black, 500), - OnKeyReleased = () => Content.FadeColour(Color4.White, 200), } }; } diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index 1777bf6dc2..d90fdda41a 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -180,7 +180,7 @@ - + From 1879a05c7beb31f1a3b69bb0234c47fa0235624e Mon Sep 17 00:00:00 2001 From: Andrey Zavadskiy Date: Mon, 10 Apr 2017 06:10:12 +0300 Subject: [PATCH 5/8] Removed using --- 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 939895654b..a7108eda1b 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -22,7 +22,6 @@ using System; using System.Linq; using osu.Framework.Threading; using osu.Game.Modes.Scoring; -using OpenTK.Graphics; namespace osu.Game.Screens.Play { From 15c1013f5b68279f65e00b9657ac6df36b2e07a1 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 10 Apr 2017 17:25:46 +0900 Subject: [PATCH 6/8] Don't schedule event, it's unreliable and doesn't match the fade. --- osu.Game/Screens/Play/HotkeyRetryOverlay.cs | 25 ++++++++++++--------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/osu.Game/Screens/Play/HotkeyRetryOverlay.cs b/osu.Game/Screens/Play/HotkeyRetryOverlay.cs index 4e383510fc..3fcd773c19 100644 --- a/osu.Game/Screens/Play/HotkeyRetryOverlay.cs +++ b/osu.Game/Screens/Play/HotkeyRetryOverlay.cs @@ -11,7 +11,6 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Graphics; using osu.Framework.Graphics.Sprites; using OpenTK.Graphics; -using osu.Framework.Threading; namespace osu.Game.Screens.Play { @@ -20,12 +19,13 @@ namespace osu.Game.Screens.Play public Action Action; private SampleChannel retrySample; - private ScheduledDelegate task; private Box overlay; private const int activate_delay = 500; private const int fadeout_delay = 200; + private bool fired; + [BackgroundDependencyLoader] private void load(AudioManager audio) { @@ -52,13 +52,6 @@ namespace osu.Game.Screens.Play if (args.Key == Key.Tilde) { overlay.FadeIn(activate_delay); - - task = Scheduler.AddDelayed(() => - { - retrySample.Play(); - Action(); - }, activate_delay); - return true; } @@ -67,14 +60,24 @@ namespace osu.Game.Screens.Play protected override bool OnKeyUp(InputState state, KeyUpEventArgs args) { - if (args.Key == Key.Tilde) + if (args.Key == Key.Tilde && !fired) { - task?.Cancel(); overlay.FadeOut(fadeout_delay); return true; } return base.OnKeyUp(state, args); } + + protected override void Update() + { + base.Update(); + if (!fired && overlay.Alpha == 1) + { + fired = true; + retrySample.Play(); + Action?.Invoke(); + } + } } } From 3a01cfccee5db6e0fabf9e2eea7cb5e169131836 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 10 Apr 2017 17:25:56 +0900 Subject: [PATCH 7/8] Adjust fade length and easing. --- osu.Game/Screens/Play/HotkeyRetryOverlay.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game/Screens/Play/HotkeyRetryOverlay.cs b/osu.Game/Screens/Play/HotkeyRetryOverlay.cs index 3fcd773c19..6b30644ab0 100644 --- a/osu.Game/Screens/Play/HotkeyRetryOverlay.cs +++ b/osu.Game/Screens/Play/HotkeyRetryOverlay.cs @@ -21,7 +21,7 @@ namespace osu.Game.Screens.Play private SampleChannel retrySample; private Box overlay; - private const int activate_delay = 500; + private const int activate_delay = 400; private const int fadeout_delay = 200; private bool fired; @@ -51,7 +51,7 @@ namespace osu.Game.Screens.Play if (args.Key == Key.Tilde) { - overlay.FadeIn(activate_delay); + overlay.FadeIn(activate_delay, EasingTypes.Out); return true; } @@ -62,7 +62,7 @@ namespace osu.Game.Screens.Play { if (args.Key == Key.Tilde && !fired) { - overlay.FadeOut(fadeout_delay); + overlay.FadeOut(fadeout_delay, EasingTypes.Out); return true; } From 43a46575404168ee8fd1e1b7ae99a6b9eb8b6ef7 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 10 Apr 2017 17:26:05 +0900 Subject: [PATCH 8/8] Remove unnecessary AlwaysPresent. --- osu.Game/Screens/Play/HotkeyRetryOverlay.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/osu.Game/Screens/Play/HotkeyRetryOverlay.cs b/osu.Game/Screens/Play/HotkeyRetryOverlay.cs index 6b30644ab0..16062bebe5 100644 --- a/osu.Game/Screens/Play/HotkeyRetryOverlay.cs +++ b/osu.Game/Screens/Play/HotkeyRetryOverlay.cs @@ -38,7 +38,6 @@ namespace osu.Game.Screens.Play overlay = new Box { Alpha = 0, - AlwaysPresent = true, Colour = Color4.Black, RelativeSizeAxes = Axes.Both, }