1
0
mirror of https://github.com/ppy/osu.git synced 2024-09-21 21:27:24 +08:00

Merge pull request #15607 from bdach/gameplay-test-loader-transition

Improve transition between editor and gameplay test screens
This commit is contained in:
Dean Herbert 2021-11-13 23:45:15 +09:00 committed by GitHub
commit 9cc419a45f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 114 additions and 19 deletions

View File

@ -10,9 +10,12 @@ using osu.Framework.Testing;
using osu.Game.Beatmaps; using osu.Game.Beatmaps;
using osu.Game.Rulesets; using osu.Game.Rulesets;
using osu.Game.Rulesets.Osu; using osu.Game.Rulesets.Osu;
using osu.Game.Screens.Backgrounds;
using osu.Game.Screens.Edit; using osu.Game.Screens.Edit;
using osu.Game.Screens.Edit.Components.Timelines.Summary; using osu.Game.Screens.Edit.Components.Timelines.Summary;
using osu.Game.Screens.Edit.GameplayTest;
using osu.Game.Tests.Beatmaps.IO; using osu.Game.Tests.Beatmaps.IO;
using osuTK.Graphics;
using osuTK.Input; using osuTK.Input;
namespace osu.Game.Tests.Visual.Editing namespace osu.Game.Tests.Visual.Editing
@ -58,6 +61,42 @@ namespace osu.Game.Tests.Visual.Editing
AddUntilStep("player pushed", () => (editorPlayer = Stack.CurrentScreen as EditorPlayer) != null); AddUntilStep("player pushed", () => (editorPlayer = Stack.CurrentScreen as EditorPlayer) != null);
AddStep("exit player", () => editorPlayer.Exit()); AddStep("exit player", () => editorPlayer.Exit());
AddUntilStep("current screen is editor", () => Stack.CurrentScreen is Editor); AddUntilStep("current screen is editor", () => Stack.CurrentScreen is Editor);
AddUntilStep("background has correct params", () =>
{
var background = this.ChildrenOfType<BackgroundScreenBeatmap>().Single();
return background.Colour == Color4.DarkGray && background.BlurAmount.Value == 0;
});
}
[Test]
public void TestGameplayTestWhenTrackRunning()
{
AddStep("start track", () => EditorClock.Start());
AddAssert("sample playback enabled", () => !Editor.SamplePlaybackDisabled.Value);
AddStep("click test gameplay button", () =>
{
var button = Editor.ChildrenOfType<TestGameplayButton>().Single();
InputManager.MoveMouseTo(button);
InputManager.Click(MouseButton.Left);
});
EditorPlayer editorPlayer = null;
AddUntilStep("player pushed", () => (editorPlayer = Stack.CurrentScreen as EditorPlayer) != null);
AddAssert("editor track stopped", () => !EditorClock.IsRunning);
AddAssert("sample playback disabled", () => Editor.SamplePlaybackDisabled.Value);
AddStep("exit player", () => editorPlayer.Exit());
AddUntilStep("current screen is editor", () => Stack.CurrentScreen is Editor);
AddUntilStep("background has correct params", () =>
{
var background = this.ChildrenOfType<BackgroundScreenBeatmap>().Single();
return background.Colour == Color4.DarkGray && background.BlurAmount.Value == 0;
});
AddStep("start track", () => EditorClock.Start());
AddAssert("sample playback re-enabled", () => !Editor.SamplePlaybackDisabled.Value);
} }
[Test] [Test]

View File

@ -31,6 +31,7 @@ using osu.Game.Screens.Edit.Components.Menus;
using osu.Game.Screens.Edit.Components.Timelines.Summary; using osu.Game.Screens.Edit.Components.Timelines.Summary;
using osu.Game.Screens.Edit.Compose; using osu.Game.Screens.Edit.Compose;
using osu.Game.Screens.Edit.Design; using osu.Game.Screens.Edit.Design;
using osu.Game.Screens.Edit.GameplayTest;
using osu.Game.Screens.Edit.Setup; using osu.Game.Screens.Edit.Setup;
using osu.Game.Screens.Edit.Timing; using osu.Game.Screens.Edit.Timing;
using osu.Game.Screens.Edit.Verify; using osu.Game.Screens.Edit.Verify;
@ -486,7 +487,18 @@ namespace osu.Game.Screens.Edit
public override void OnEntering(IScreen last) public override void OnEntering(IScreen last)
{ {
base.OnEntering(last); base.OnEntering(last);
dimBackground();
resetTrack(true);
}
public override void OnResuming(IScreen last)
{
base.OnResuming(last);
dimBackground();
}
private void dimBackground()
{
ApplyToBackground(b => ApplyToBackground(b =>
{ {
// todo: temporary. we want to be applying dim using the UserDimContainer eventually. // todo: temporary. we want to be applying dim using the UserDimContainer eventually.
@ -495,8 +507,6 @@ namespace osu.Game.Screens.Edit
b.IgnoreUserSettings.Value = true; b.IgnoreUserSettings.Value = true;
b.BlurAmount.Value = 0; b.BlurAmount.Value = 0;
}); });
resetTrack(true);
} }
public override bool OnExiting(IScreen next) public override bool OnExiting(IScreen next)
@ -535,9 +545,9 @@ namespace osu.Game.Screens.Edit
public override void OnSuspending(IScreen next) public override void OnSuspending(IScreen next)
{ {
refetchBeatmap();
base.OnSuspending(next); base.OnSuspending(next);
clock.Stop();
refetchBeatmap();
} }
private void refetchBeatmap() private void refetchBeatmap()
@ -797,7 +807,7 @@ namespace osu.Game.Screens.Edit
pushEditorPlayer(); pushEditorPlayer();
} }
void pushEditorPlayer() => this.Push(new PlayerLoader(() => new EditorPlayer())); void pushEditorPlayer() => this.Push(new EditorPlayerLoader());
} }
public double SnapTime(double time, double? referenceTime) => editorBeatmap.SnapTime(time, referenceTime); public double SnapTime(double time, double? referenceTime) => editorBeatmap.SnapTime(time, referenceTime);

View File

@ -6,7 +6,7 @@ using osu.Framework.Screens;
using osu.Game.Overlays; using osu.Game.Overlays;
using osu.Game.Screens.Play; using osu.Game.Screens.Play;
namespace osu.Game.Screens.Edit namespace osu.Game.Screens.Edit.GameplayTest
{ {
public class EditorPlayer : Player public class EditorPlayer : Player
{ {

View File

@ -0,0 +1,44 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Screens;
using osu.Game.Screens.Menu;
using osu.Game.Screens.Play;
namespace osu.Game.Screens.Edit.GameplayTest
{
public class EditorPlayerLoader : PlayerLoader
{
[Resolved]
private OsuLogo osuLogo { get; set; }
public EditorPlayerLoader()
: base(() => new EditorPlayer())
{
}
public override void OnEntering(IScreen last)
{
base.OnEntering(last);
MetadataInfo.FinishTransforms(true);
}
protected override void LogoArriving(OsuLogo logo, bool resuming)
{
// call base with resuming forcefully set to true to reduce logo movements.
base.LogoArriving(logo, true);
logo.FinishTransforms(true, nameof(Scale));
}
protected override void ContentOut()
{
base.ContentOut();
osuLogo.FadeOut(CONTENT_OUT_DURATION, Easing.OutQuint);
}
protected override double PlayerPushDelay => 0;
}
}

View File

@ -5,7 +5,7 @@ using System;
using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Sprites;
using osu.Game.Overlays.Dialog; using osu.Game.Overlays.Dialog;
namespace osu.Game.Screens.Edit namespace osu.Game.Screens.Edit.GameplayTest
{ {
public class SaveBeforeGameplayTestDialog : PopupDialog public class SaveBeforeGameplayTestDialog : PopupDialog
{ {

View File

@ -36,7 +36,9 @@ namespace osu.Game.Screens.Play
{ {
protected const float BACKGROUND_BLUR = 15; protected const float BACKGROUND_BLUR = 15;
private const double content_out_duration = 300; protected const double CONTENT_OUT_DURATION = 300;
protected virtual double PlayerPushDelay => 1800;
public override bool HideOverlaysOnEnter => hideOverlays; public override bool HideOverlaysOnEnter => hideOverlays;
@ -213,7 +215,7 @@ namespace osu.Game.Screens.Play
// after an initial delay, start the debounced load check. // after an initial delay, start the debounced load check.
// this will continue to execute even after resuming back on restart. // this will continue to execute even after resuming back on restart.
Scheduler.Add(new ScheduledDelegate(pushWhenLoaded, Clock.CurrentTime + 1800, 0)); Scheduler.Add(new ScheduledDelegate(pushWhenLoaded, Clock.CurrentTime + PlayerPushDelay, 0));
showMuteWarningIfNeeded(); showMuteWarningIfNeeded();
showBatteryWarningIfNeeded(); showBatteryWarningIfNeeded();
@ -248,13 +250,13 @@ namespace osu.Game.Screens.Play
public override bool OnExiting(IScreen next) public override bool OnExiting(IScreen next)
{ {
cancelLoad(); cancelLoad();
contentOut(); ContentOut();
// If the load sequence was interrupted, the epilepsy warning may already be displayed (or in the process of being displayed). // If the load sequence was interrupted, the epilepsy warning may already be displayed (or in the process of being displayed).
epilepsyWarning?.Hide(); epilepsyWarning?.Hide();
// Ensure the screen doesn't expire until all the outwards fade operations have completed. // Ensure the screen doesn't expire until all the outwards fade operations have completed.
this.Delay(content_out_duration).FadeOut(); this.Delay(CONTENT_OUT_DURATION).FadeOut();
ApplyToBackground(b => b.IgnoreUserSettings.Value = true); ApplyToBackground(b => b.IgnoreUserSettings.Value = true);
@ -361,15 +363,15 @@ namespace osu.Game.Screens.Play
ApplyToBackground(b => b?.FadeColour(Color4.White, 800, Easing.OutQuint)); ApplyToBackground(b => b?.FadeColour(Color4.White, 800, Easing.OutQuint));
} }
private void contentOut() protected virtual void ContentOut()
{ {
// Ensure the logo is no longer tracking before we scale the content // Ensure the logo is no longer tracking before we scale the content
content.StopTracking(); content.StopTracking();
content.ScaleTo(0.7f, content_out_duration * 2, Easing.OutQuint); content.ScaleTo(0.7f, CONTENT_OUT_DURATION * 2, Easing.OutQuint);
content.FadeOut(content_out_duration, Easing.OutQuint); content.FadeOut(CONTENT_OUT_DURATION, Easing.OutQuint);
lowPassFilter.CutoffTo(AudioFilter.MAX_LOWPASS_CUTOFF, content_out_duration); lowPassFilter.CutoffTo(AudioFilter.MAX_LOWPASS_CUTOFF, CONTENT_OUT_DURATION);
highPassFilter.CutoffTo(0, content_out_duration); highPassFilter.CutoffTo(0, CONTENT_OUT_DURATION);
} }
private void pushWhenLoaded() private void pushWhenLoaded()
@ -394,9 +396,9 @@ namespace osu.Game.Screens.Play
// ensure that once we have reached this "point of no return", readyForPush will be false for all future checks (until a new player instance is prepared). // ensure that once we have reached this "point of no return", readyForPush will be false for all future checks (until a new player instance is prepared).
var consumedPlayer = consumePlayer(); var consumedPlayer = consumePlayer();
contentOut(); ContentOut();
TransformSequence<PlayerLoader> pushSequence = this.Delay(content_out_duration); TransformSequence<PlayerLoader> pushSequence = this.Delay(CONTENT_OUT_DURATION);
// only show if the warning was created (i.e. the beatmap needs it) // only show if the warning was created (i.e. the beatmap needs it)
// and this is not a restart of the map (the warning expires after first load). // and this is not a restart of the map (the warning expires after first load).
@ -418,7 +420,7 @@ namespace osu.Game.Screens.Play
else else
{ {
// This goes hand-in-hand with the restoration of low pass filter in contentOut(). // This goes hand-in-hand with the restoration of low pass filter in contentOut().
this.TransformBindableTo(volumeAdjustment, 0, content_out_duration, Easing.OutCubic); this.TransformBindableTo(volumeAdjustment, 0, CONTENT_OUT_DURATION, Easing.OutCubic);
} }
pushSequence.Schedule(() => pushSequence.Schedule(() =>