1
0
mirror of https://github.com/ppy/osu.git synced 2026-05-25 21:21:42 +08:00

Simplify implementation

This commit is contained in:
Dean Herbert
2025-09-05 16:01:22 +09:00
Unverified
parent 54d4b16a01
commit 45ef97c92c
2 changed files with 52 additions and 57 deletions
+26 -29
View File
@@ -19,26 +19,23 @@ namespace osu.Game.Screens.Play.HUD
{
public partial class DefaultRankDisplay : CompositeDrawable, ISerialisableDrawable
{
public bool UsesFixedAnchor { get; set; }
[Resolved]
private ScoreProcessor scoreProcessor { get; set; } = null!;
[SettingSource(typeof(DefaultRankDisplayStrings), nameof(DefaultRankDisplayStrings.PlaySamplesOnRankChange))]
public BindableBool PlaySamples { get; set; } = new BindableBool(true);
public bool UsesFixedAnchor { get; set; }
private UpdateableRank rankDisplay = null!;
private SkinnableSound rankDownSample = null!;
private SkinnableSound rankUpSample = null!;
private Bindable<double?> lastSamplePlaybackTime = null!;
private Bindable<double?> lastSamplePlayback = null!;
private double lastRankUpdate;
private readonly Bindable<double?> lastRankChangeTime = new Bindable<double?>();
private IBindable<ScoreRank> rank = null!;
private ScoreRank lastRank;
private ScoreRank displayedRank;
private const int minimum_update_rate = 3000;
@@ -63,44 +60,44 @@ namespace osu.Game.Screens.Play.HUD
if (skinEditor != null)
PlaySamples.Value = false;
lastSamplePlaybackTime = statics.GetBindable<double?>(Static.LastRankChangeSamplePlaybackTime);
lastSamplePlayback = statics.GetBindable<double?>(Static.LastRankChangeSamplePlaybackTime);
}
protected override void LoadComplete()
protected override void Update()
{
base.LoadComplete();
base.Update();
rank = scoreProcessor.Rank.GetBoundCopy();
rank.BindValueChanged(r =>
var currentRank = scoreProcessor.Rank.Value;
if (currentRank != displayedRank)
{
bool enoughTimeElapsed = !lastRankChangeTime.Value.HasValue || Time.Current - lastSamplePlaybackTime.Value >= minimum_update_rate;
bool enoughTimeElapsed = Time.Current - lastRankUpdate >= minimum_update_rate;
Scheduler.CancelDelayedTasks();
if (enoughTimeElapsed || r.NewValue == ScoreRank.F)
onRankChange(r);
else
Scheduler.AddDelayed(onRankChange, r, (double)lastRankChangeTime.Value! - Time.Current + minimum_update_rate);
}, true);
if (enoughTimeElapsed || currentRank == ScoreRank.F)
updateRank(currentRank);
}
}
private void onRankChange(ValueChangedEvent<ScoreRank> r)
private void updateRank(ScoreRank rank)
{
bool enoughSampleTimeElapsed = !lastSamplePlaybackTime.Value.HasValue || Time.Current - lastSamplePlaybackTime.Value >= OsuGameBase.SAMPLE_DEBOUNCE_TIME;
rankDisplay.Rank = rank;
// Don't play rank-down sfx on quit/retry and entering
if (r.NewValue != lastRank && r.NewValue > ScoreRank.F && PlaySamples.Value && enoughSampleTimeElapsed && lastRankChangeTime.Value.HasValue)
// Check sample time separately to ensure two copies of the rank display don't both play samples on a change.
bool enoughSampleTimeElapsed = !lastSamplePlayback.Value.HasValue || Time.Current - lastSamplePlayback.Value >= OsuGameBase.SAMPLE_DEBOUNCE_TIME;
// Also don't play rank-down sfx on quit/retry/initial update.
if (rank != displayedRank && rank > ScoreRank.F && PlaySamples.Value && enoughSampleTimeElapsed && lastRankUpdate > 0)
{
if (r.NewValue > lastRank)
if (rank > displayedRank)
rankUpSample.Play();
else
rankDownSample.Play();
lastSamplePlaybackTime.Value = Time.Current;
lastSamplePlayback.Value = Time.Current;
}
rankDisplay.Rank = r.NewValue;
lastRank = r.NewValue;
lastRankChangeTime.Value = Time.Current;
displayedRank = rank;
lastRankUpdate = Time.Current;
}
}
}
+26 -28
View File
@@ -34,13 +34,10 @@ namespace osu.Game.Skinning
private SkinnableSound rankDownSample = null!;
private SkinnableSound rankUpSample = null!;
private Bindable<double?> lastSamplePlaybackTime = null!;
private Bindable<double?> lastSamplePlayback = null!;
private double lastRankUpdate;
private readonly Bindable<double?> lastRankChangeTime = new Bindable<double?>();
private IBindable<ScoreRank> rank = null!;
private ScoreRank lastRank;
private ScoreRank displayedRank;
private const int minimum_update_rate = 3000;
@@ -67,29 +64,27 @@ namespace osu.Game.Skinning
if (skinEditor != null)
PlaySamples.Value = false;
lastSamplePlaybackTime = statics.GetBindable<double?>(Static.LastRankChangeSamplePlaybackTime);
lastSamplePlayback = statics.GetBindable<double?>(Static.LastRankChangeSamplePlaybackTime);
}
protected override void LoadComplete()
protected override void Update()
{
rank = scoreProcessor.Rank.GetBoundCopy();
rank.BindValueChanged(r =>
base.Update();
var currentRank = scoreProcessor.Rank.Value;
if (currentRank != displayedRank)
{
bool enoughTimeElapsed = !lastRankChangeTime.Value.HasValue || Time.Current - lastRankChangeTime.Value >= minimum_update_rate;
bool enoughTimeElapsed = Time.Current - lastRankUpdate >= minimum_update_rate;
Scheduler.CancelDelayedTasks();
if (enoughTimeElapsed || r.NewValue == ScoreRank.F)
onRankChange(r);
else
Scheduler.AddDelayed(onRankChange, r, (double)lastRankChangeTime.Value! - Time.Current + minimum_update_rate);
}, true);
FinishTransforms(true);
if (enoughTimeElapsed || currentRank == ScoreRank.F)
updateRank(currentRank);
}
}
private void onRankChange(ValueChangedEvent<ScoreRank> r)
private void updateRank(ScoreRank rank)
{
var texture = source.GetTexture($"ranking-{r.NewValue}-small");
var texture = source.GetTexture($"ranking-{rank}-small");
rankDisplay.Texture = texture;
@@ -103,27 +98,30 @@ namespace osu.Game.Skinning
Origin = Anchor.Centre,
BypassAutoSizeAxes = Axes.Both,
};
AddInternal(transientRank);
transientRank.FadeOutFromOne(500, Easing.Out)
.ScaleTo(new Vector2(1.625f), 500, Easing.Out)
.Expire();
}
bool enoughSampleTimeElapsed = !lastSamplePlaybackTime.Value.HasValue || Time.Current - lastSamplePlaybackTime.Value >= OsuGameBase.SAMPLE_DEBOUNCE_TIME;
// Check sample time separately to ensure two copies of the rank display don't both play samples on a change.
bool enoughSampleTimeElapsed = !lastSamplePlayback.Value.HasValue || Time.Current - lastSamplePlayback.Value >= OsuGameBase.SAMPLE_DEBOUNCE_TIME;
// Don't play rank-down sfx on quit/retry and entering
if (r.NewValue != lastRank && r.NewValue > ScoreRank.F && PlaySamples.Value && enoughSampleTimeElapsed && lastRankChangeTime.Value.HasValue)
// Also don't play rank-down sfx on quit/retry/initial update.
if (rank != displayedRank && rank > ScoreRank.F && PlaySamples.Value && enoughSampleTimeElapsed && lastRankUpdate > 0)
{
if (r.NewValue > lastRank)
if (rank > displayedRank)
rankUpSample.Play();
else
rankDownSample.Play();
lastSamplePlaybackTime.Value = Time.Current;
lastSamplePlayback.Value = Time.Current;
}
lastRank = r.NewValue;
lastRankChangeTime.Value = Time.Current;
displayedRank = rank;
lastRankUpdate = Time.Current;
}
}
}