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

Move settings and bindables to a sane location

This commit is contained in:
Dean Herbert 2022-06-10 20:04:51 +09:00
parent 837958b254
commit 18f74b2840
3 changed files with 90 additions and 50 deletions

View File

@ -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<double>
{
LabelText = "time spacing",
Current = beat_length
},
new SettingsSlider<float>
{
LabelText = "visual spacing",
Current = spacing
},
new SettingsSlider<double>
{
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)

View File

@ -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 };
/// <summary>
/// The rate at which the game host should attempt to run.
/// </summary>
@ -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,13 +130,23 @@ 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,
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.
@ -136,6 +154,7 @@ 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
{
RelativeSizeAxes = Axes.Both,
@ -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<double>
{
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre,
RelativeSizeAxes = Axes.None,
Width = 400,
LabelText = "bpm",
Current = SampleBPM
},
new SettingsSlider<float>
{
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre,
RelativeSizeAxes = Axes.None,
Width = 400,
LabelText = "visual spacing",
Current = SampleVisualSpacing
},
new SettingsSlider<double>
{
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre,
RelativeSizeAxes = Axes.None,
Width = 400,
LabelText = "approach rate",
Current = SampleApproachRate
},
});
}
private void recordResult(bool correct)

View File

@ -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();