mirror of
https://github.com/osukey/osukey.git
synced 2025-05-14 01:57:22 +09:00
Add *very* basic ranking screen.
This commit is contained in:
parent
30e62eb53c
commit
74e3a87f78
@ -11,7 +11,9 @@ namespace osu.Game.Modes
|
|||||||
{
|
{
|
||||||
public class Score
|
public class Score
|
||||||
{
|
{
|
||||||
public double TotalScore { get; }
|
public double TotalScore { get; set; }
|
||||||
public double Accuracy { get; }
|
public double Accuracy { get; set; }
|
||||||
|
public double Combo { get; set; }
|
||||||
|
public double MaxCombo { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,13 @@ namespace osu.Game.Modes
|
|||||||
{
|
{
|
||||||
public abstract class ScoreProcessor
|
public abstract class ScoreProcessor
|
||||||
{
|
{
|
||||||
public virtual Score GetScore() => new Score();
|
public virtual Score GetScore() => new Score()
|
||||||
|
{
|
||||||
|
TotalScore = TotalScore,
|
||||||
|
Combo = Combo,
|
||||||
|
MaxCombo = HighestCombo,
|
||||||
|
Accuracy = Accuracy
|
||||||
|
};
|
||||||
|
|
||||||
public readonly BindableDouble TotalScore = new BindableDouble { MinValue = 0 };
|
public readonly BindableDouble TotalScore = new BindableDouble { MinValue = 0 };
|
||||||
|
|
||||||
|
@ -16,10 +16,19 @@ namespace osu.Game.Modes.UI
|
|||||||
{
|
{
|
||||||
public event Action<JudgementInfo> OnJudgement;
|
public event Action<JudgementInfo> OnJudgement;
|
||||||
|
|
||||||
protected void TriggerOnJudgement(JudgementInfo j) => OnJudgement?.Invoke(j);
|
public event Action OnAllJudged;
|
||||||
|
|
||||||
|
protected void TriggerOnJudgement(JudgementInfo j)
|
||||||
|
{
|
||||||
|
OnJudgement?.Invoke(j);
|
||||||
|
if (AllObjectsJudged)
|
||||||
|
OnAllJudged?.Invoke();
|
||||||
|
}
|
||||||
|
|
||||||
protected Playfield Playfield;
|
protected Playfield Playfield;
|
||||||
|
|
||||||
|
public bool AllObjectsJudged => Playfield.HitObjects.Children.First()?.Judgement.Result != null; //reverse depth sort means First() instead of Last().
|
||||||
|
|
||||||
public IEnumerable<DrawableHitObject> DrawableObjects => Playfield.HitObjects.Children;
|
public IEnumerable<DrawableHitObject> DrawableObjects => Playfield.HitObjects.Children;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ using OpenTK.Input;
|
|||||||
using MouseState = osu.Framework.Input.MouseState;
|
using MouseState = osu.Framework.Input.MouseState;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
using osu.Framework.GameModes;
|
using osu.Framework.GameModes;
|
||||||
|
using osu.Game.Modes.UI;
|
||||||
using osu.Game.Screens.Ranking;
|
using osu.Game.Screens.Ranking;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Play
|
namespace osu.Game.Screens.Play
|
||||||
@ -40,6 +41,7 @@ namespace osu.Game.Screens.Play
|
|||||||
private Ruleset ruleset;
|
private Ruleset ruleset;
|
||||||
|
|
||||||
private ScoreProcessor scoreProcessor;
|
private ScoreProcessor scoreProcessor;
|
||||||
|
private HitRenderer hitRenderer;
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(AudioManager audio, BeatmapDatabase beatmaps, OsuGameBase game)
|
private void load(AudioManager audio, BeatmapDatabase beatmaps, OsuGameBase game)
|
||||||
@ -89,9 +91,10 @@ namespace osu.Game.Screens.Play
|
|||||||
var scoreOverlay = ruleset.CreateScoreOverlay();
|
var scoreOverlay = ruleset.CreateScoreOverlay();
|
||||||
scoreOverlay.BindProcessor(scoreProcessor = ruleset.CreateScoreProcessor());
|
scoreOverlay.BindProcessor(scoreProcessor = ruleset.CreateScoreProcessor());
|
||||||
|
|
||||||
var hitRenderer = ruleset.CreateHitRendererWith(beatmap.HitObjects);
|
hitRenderer = ruleset.CreateHitRendererWith(beatmap.HitObjects);
|
||||||
|
|
||||||
hitRenderer.OnJudgement += scoreProcessor.AddJudgement;
|
hitRenderer.OnJudgement += scoreProcessor.AddJudgement;
|
||||||
|
hitRenderer.OnAllJudged += hitRenderer_OnAllJudged;
|
||||||
|
|
||||||
if (Autoplay)
|
if (Autoplay)
|
||||||
hitRenderer.Schedule(() => hitRenderer.DrawableObjects.ForEach(h => h.State = ArmedState.Hit));
|
hitRenderer.Schedule(() => hitRenderer.DrawableObjects.ForEach(h => h.State = ArmedState.Hit));
|
||||||
@ -110,6 +113,18 @@ namespace osu.Game.Screens.Play
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void hitRenderer_OnAllJudged()
|
||||||
|
{
|
||||||
|
Delay(1000);
|
||||||
|
Schedule(delegate
|
||||||
|
{
|
||||||
|
Push(new Results
|
||||||
|
{
|
||||||
|
Score = scoreProcessor.GetScore()
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
protected override void OnEntering(GameMode last)
|
protected override void OnEntering(GameMode last)
|
||||||
{
|
{
|
||||||
base.OnEntering(last);
|
base.OnEntering(last);
|
||||||
@ -121,12 +136,6 @@ namespace osu.Game.Screens.Play
|
|||||||
{
|
{
|
||||||
base.Update();
|
base.Update();
|
||||||
Clock.ProcessFrame();
|
Clock.ProcessFrame();
|
||||||
|
|
||||||
if (Beatmap.Track.HasCompleted)
|
|
||||||
Push(new Results
|
|
||||||
{
|
|
||||||
Score = scoreProcessor.GetScore()
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class PlayerInputManager : UserInputManager
|
class PlayerInputManager : UserInputManager
|
||||||
|
@ -2,20 +2,29 @@
|
|||||||
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
using osu.Framework.GameModes;
|
using osu.Framework.GameModes;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Framework.Graphics.Sprites;
|
||||||
|
using osu.Framework.Graphics.Transformations;
|
||||||
using osu.Game.Modes;
|
using osu.Game.Modes;
|
||||||
using osu.Game.Screens.Backgrounds;
|
using osu.Game.Screens.Backgrounds;
|
||||||
|
using OpenTK;
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Ranking
|
namespace osu.Game.Screens.Ranking
|
||||||
{
|
{
|
||||||
class Results : GameModeWhiteBox
|
class Results : OsuGameMode
|
||||||
{
|
{
|
||||||
protected override BackgroundMode CreateBackground() => new BackgroundModeCustom(@"Backgrounds/bg4");
|
protected override BackgroundMode CreateBackground() => new BackgroundModeBeatmap(Beatmap);
|
||||||
|
|
||||||
|
private static readonly Vector2 BACKGROUND_BLUR = new Vector2(20);
|
||||||
|
|
||||||
|
ScoreDisplay scoreDisplay;
|
||||||
|
|
||||||
protected override void OnEntering(GameMode last)
|
protected override void OnEntering(GameMode last)
|
||||||
{
|
{
|
||||||
base.OnEntering(last);
|
base.OnEntering(last);
|
||||||
Background.Schedule(() => Background.FadeColour(Color4.DarkGray, 500));
|
Background.Schedule(() => (Background as BackgroundModeBeatmap)?.BlurTo(BACKGROUND_BLUR, 1000));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool OnExiting(GameMode next)
|
protected override bool OnExiting(GameMode next)
|
||||||
@ -24,6 +33,62 @@ namespace osu.Game.Screens.Ranking
|
|||||||
return base.OnExiting(next);
|
return base.OnExiting(next);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Score Score { get; set; }
|
public Score Score
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
scoreDisplay?.FadeOut(500);
|
||||||
|
scoreDisplay?.Expire();
|
||||||
|
|
||||||
|
scoreDisplay = new ScoreDisplay(value)
|
||||||
|
{
|
||||||
|
Anchor = Anchor.Centre,
|
||||||
|
Origin = Anchor.Centre,
|
||||||
|
};
|
||||||
|
|
||||||
|
Add(scoreDisplay);
|
||||||
|
|
||||||
|
scoreDisplay.FadeIn(500);
|
||||||
|
scoreDisplay.ScaleTo(0.1f);
|
||||||
|
scoreDisplay.ScaleTo(1, 1000, EasingTypes.OutElastic);
|
||||||
|
scoreDisplay.RotateTo(360 * 5, 1000, EasingTypes.OutElastic);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ScoreDisplay : Container
|
||||||
|
{
|
||||||
|
public ScoreDisplay(Score s)
|
||||||
|
{
|
||||||
|
AutoSizeAxes = Axes.Both;
|
||||||
|
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new FlowContainer
|
||||||
|
{
|
||||||
|
AutoSizeAxes = Axes.Both,
|
||||||
|
Direction = FlowDirection.VerticalOnly,
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new SpriteText
|
||||||
|
{
|
||||||
|
TextSize = 40,
|
||||||
|
Text = $@"Accuracy: {s.Accuracy:#0.00%}",
|
||||||
|
},
|
||||||
|
new SpriteText
|
||||||
|
{
|
||||||
|
TextSize = 40,
|
||||||
|
Text = $@"Score: {s.TotalScore}",
|
||||||
|
},
|
||||||
|
new SpriteText
|
||||||
|
{
|
||||||
|
TextSize = 40,
|
||||||
|
Text = $@"MaxCombo: {s.MaxCombo}",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user