From 18f74b2840fd2e3ecc8bb8322262e5fa5c3a6a98 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 10 Jun 2022 20:04:51 +0900 Subject: [PATCH] Move settings and bindables to a sane location --- osu.Game/Screens/Utility/CircleGameplay.cs | 68 +++++++------------ .../Screens/Utility/LatencyCertifierScreen.cs | 60 ++++++++++++++-- .../LatencySampleComponent.cs | 12 ++++ 3 files changed, 90 insertions(+), 50 deletions(-) diff --git a/osu.Game/Screens/Utility/CircleGameplay.cs b/osu.Game/Screens/Utility/CircleGameplay.cs index 9fb8eb2761..4bfc10548f 100644 --- a/osu.Game/Screens/Utility/CircleGameplay.cs +++ b/osu.Game/Screens/Utility/CircleGameplay.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using osu.Framework.Allocation; -using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; @@ -13,7 +12,6 @@ using osu.Framework.Input.Events; using osu.Framework.Input.States; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; -using osu.Game.Overlays.Settings; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Scoring; using osu.Game.Screens.Utility.SampleComponents; @@ -21,7 +19,7 @@ using osuTK; namespace osu.Game.Screens.Utility { - public class CircleGameplay : CompositeDrawable + public class CircleGameplay : LatencySampleComponent { private int nextLocation; @@ -31,9 +29,7 @@ namespace osu.Game.Screens.Utility private double? lastGeneratedBeatTime; - private static readonly BindableDouble beat_length = new BindableDouble(500) { MinValue = 200, MaxValue = 1000 }; - private static readonly BindableDouble approach_rate_milliseconds = new BindableDouble(100) { MinValue = 50, MaxValue = 500 }; - private static readonly BindableFloat spacing = new BindableFloat(0.2f) { MinValue = 0.05f, MaxValue = 0.4f }; + private Container circles = null!; protected override void LoadComplete() { @@ -41,33 +37,6 @@ namespace osu.Game.Screens.Utility InternalChildren = new Drawable[] { - new FillFlowContainer - { - AutoSizeAxes = Axes.Y, - Width = 400, - Spacing = new Vector2(2), - Direction = FillDirection.Vertical, - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - Children = new Drawable[] - { - new SettingsSlider - { - LabelText = "time spacing", - Current = beat_length - }, - new SettingsSlider - { - LabelText = "visual spacing", - Current = spacing - }, - new SettingsSlider - { - LabelText = "approach time", - Current = approach_rate_milliseconds - }, - } - }, unstableRate = new OsuSpriteText { Anchor = Anchor.Centre, @@ -75,22 +44,31 @@ namespace osu.Game.Screens.Utility Font = OsuFont.Default.With(size: 24), Y = -100, }, + circles = new Container + { + RelativeSizeAxes = Axes.Both, + }, }; + + SampleBPM.BindValueChanged(_ => + { + circles.Clear(); + lastGeneratedBeatTime = null; + }); } - protected override void Update() + protected override void UpdateAtLimitedRate(InputState inputState) { - base.Update(); + double beatLength = 60000 / SampleBPM.Value; + + int nextBeat = (int)(Clock.CurrentTime / beatLength) + 1; // We want to generate a few hit objects ahead of the current time (to allow them to animate). - - int nextBeat = (int)(Clock.CurrentTime / beat_length.Value) + 1; - - double generateUpTo = (nextBeat + 2) * beat_length.Value; + double generateUpTo = (nextBeat + 2) * beatLength; while (lastGeneratedBeatTime == null || lastGeneratedBeatTime < generateUpTo) { - double time = ++nextBeat * beat_length.Value; + double time = ++nextBeat * beatLength; if (time <= lastGeneratedBeatTime) continue; @@ -106,8 +84,8 @@ namespace osu.Game.Screens.Utility Vector2 location; - float spacingLow = 0.5f - spacing.Value; - float spacingHigh = 0.5f + spacing.Value; + float spacingLow = 0.5f - SampleVisualSpacing.Value; + float spacingHigh = 0.5f + SampleVisualSpacing.Value; switch (nextLocation % 4) { @@ -128,7 +106,7 @@ namespace osu.Game.Screens.Utility break; } - AddInternal(new SampleHitCircle(time) + circles.Add(new SampleHitCircle(time) { RelativePositionAxes = Axes.Both, Position = location, @@ -139,7 +117,7 @@ namespace osu.Game.Screens.Utility private void hit(HitEvent h) { hitEvents.Add(h); - unstableRate.Text = $"{hitEvents.CalculateUnstableRate():N1}"; + unstableRate.Text = $"UR: {hitEvents.CalculateUnstableRate()}"; } public class SampleHitCircle : LatencySampleComponent @@ -231,7 +209,7 @@ namespace osu.Game.Screens.Utility { if (HitEvent == null) { - approach.Scale = new Vector2(1 + (float)MathHelper.Clamp((HitTime - Clock.CurrentTime) / approach_rate_milliseconds.Value, 0, 100)); + approach.Scale = new Vector2(1 + (float)MathHelper.Clamp((HitTime - Clock.CurrentTime) / SampleApproachRate.Value, 0, 100)); Alpha = (float)MathHelper.Clamp((Clock.CurrentTime - HitTime + 600) / 400, 0, 1); if (Clock.CurrentTime > HitTime + 200) diff --git a/osu.Game/Screens/Utility/LatencyCertifierScreen.cs b/osu.Game/Screens/Utility/LatencyCertifierScreen.cs index 2570db0e24..79736ea17d 100644 --- a/osu.Game/Screens/Utility/LatencyCertifierScreen.cs +++ b/osu.Game/Screens/Utility/LatencyCertifierScreen.cs @@ -25,11 +25,13 @@ using osu.Game.Graphics; using osu.Game.Graphics.Containers; using osu.Game.Graphics.Sprites; using osu.Game.Overlays; +using osu.Game.Overlays.Settings; using osuTK; using osuTK.Input; namespace osu.Game.Screens.Utility { + [Cached] public class LatencyCertifierScreen : OsuScreen { private FrameSync previousFrameSyncMode; @@ -49,6 +51,10 @@ namespace osu.Game.Screens.Utility private readonly Container resultsArea; + public readonly BindableDouble SampleBPM = new BindableDouble(120) { MinValue = 60, MaxValue = 300 }; + public readonly BindableDouble SampleApproachRate = new BindableDouble(100) { MinValue = 50, MaxValue = 500 }; + public readonly BindableFloat SampleVisualSpacing = new BindableFloat(0.2f) { MinValue = 0.05f, MaxValue = 0.3f }; + /// /// The rate at which the game host should attempt to run. /// @@ -84,6 +90,8 @@ namespace osu.Game.Screens.Utility private double lastPoll; private int pollingMax; + private readonly FillFlowContainer settings; + [Resolved] private GameHost host { get; set; } = null!; @@ -122,19 +130,30 @@ namespace osu.Game.Screens.Utility Anchor = Anchor.TopCentre, Origin = Anchor.TopRight, }, - explanatoryText = new OsuTextFlowContainer(cp => cp.Font = OsuFont.Default.With(size: 20)) + settings = new FillFlowContainer { + Name = "Settings", + AutoSizeAxes = Axes.Y, + RelativeSizeAxes = Axes.X, + Padding = new MarginPadding(10), + Spacing = new Vector2(2), + Direction = FillDirection.Vertical, Anchor = Anchor.BottomCentre, Origin = Anchor.BottomCentre, - TextAnchor = Anchor.TopCentre, - RelativeSizeAxes = Axes.X, - AutoSizeAxes = Axes.Y, - Text = @"Welcome to the latency certifier! + Child = explanatoryText = new OsuTextFlowContainer(cp => cp.Font = OsuFont.Default.With(size: 20)) + { + AutoSizeAxes = Axes.Y, + RelativeSizeAxes = Axes.X, + Anchor = Anchor.TopCentre, + Origin = Anchor.TopCentre, + TextAnchor = Anchor.TopCentre, + Text = @"Welcome to the latency certifier! Use the arrow keys, Z/X/F/J to control the display. Use the Tab key to change focus. Change display modes with Space. Do whatever you need to try and perceive the difference in latency, then choose your best side. ", + }, }, resultsArea = new Container { @@ -423,6 +442,37 @@ Do whatever you need to try and perceive the difference in latency, then choose mainArea.Children.First(a => a != area).IsActiveArea.Value = false; }); } + + settings.AddRange(new Drawable[] + { + new SettingsSlider + { + Anchor = Anchor.TopCentre, + Origin = Anchor.TopCentre, + RelativeSizeAxes = Axes.None, + Width = 400, + LabelText = "bpm", + Current = SampleBPM + }, + new SettingsSlider + { + Anchor = Anchor.TopCentre, + Origin = Anchor.TopCentre, + RelativeSizeAxes = Axes.None, + Width = 400, + LabelText = "visual spacing", + Current = SampleVisualSpacing + }, + new SettingsSlider + { + Anchor = Anchor.TopCentre, + Origin = Anchor.TopCentre, + RelativeSizeAxes = Axes.None, + Width = 400, + LabelText = "approach rate", + Current = SampleApproachRate + }, + }); } private void recordResult(bool correct) diff --git a/osu.Game/Screens/Utility/SampleComponents/LatencySampleComponent.cs b/osu.Game/Screens/Utility/SampleComponents/LatencySampleComponent.cs index 03f6b46852..c3233d5aa5 100644 --- a/osu.Game/Screens/Utility/SampleComponents/LatencySampleComponent.cs +++ b/osu.Game/Screens/Utility/SampleComponents/LatencySampleComponent.cs @@ -14,6 +14,10 @@ namespace osu.Game.Screens.Utility.SampleComponents { public abstract class LatencySampleComponent : CompositeDrawable { + protected readonly BindableDouble SampleBPM = new BindableDouble(); + protected readonly BindableDouble SampleApproachRate = new BindableDouble(); + protected readonly BindableFloat SampleVisualSpacing = new BindableFloat(); + protected readonly BindableBool IsActive = new BindableBool(); private InputManager inputManager = null!; @@ -24,6 +28,14 @@ namespace osu.Game.Screens.Utility.SampleComponents [Resolved] protected OverlayColourProvider OverlayColourProvider { get; private set; } = null!; + [BackgroundDependencyLoader] + private void load(LatencyCertifierScreen latencyCertifierScreen) + { + SampleBPM.BindTo(latencyCertifierScreen.SampleBPM); + SampleApproachRate.BindTo(latencyCertifierScreen.SampleApproachRate); + SampleVisualSpacing.BindTo(latencyCertifierScreen.SampleVisualSpacing); + } + protected override void LoadComplete() { base.LoadComplete();