diff --git a/osu.Game.Modes.Osu/OsuScoreProcessor.cs b/osu.Game.Modes.Osu/OsuScoreProcessor.cs
index 572506050b..7da8f763fb 100644
--- a/osu.Game.Modes.Osu/OsuScoreProcessor.cs
+++ b/osu.Game.Modes.Osu/OsuScoreProcessor.cs
@@ -21,9 +21,11 @@ namespace osu.Game.Modes.Osu
{
case HitResult.Hit:
Combo.Value++;
+ Health.Value += 0.1f;
break;
case HitResult.Miss:
Combo.Value = 0;
+ Health.Value -= 0.2f;
break;
}
}
diff --git a/osu.Game/Modes/Score.cs b/osu.Game/Modes/Score.cs
index ee90a9a0f9..b5dcf63028 100644
--- a/osu.Game/Modes/Score.cs
+++ b/osu.Game/Modes/Score.cs
@@ -15,5 +15,6 @@ namespace osu.Game.Modes
public double Accuracy { get; set; }
public double Combo { get; set; }
public double MaxCombo { get; set; }
+ public double Health { get; set; }
}
}
diff --git a/osu.Game/Modes/ScoreProcesssor.cs b/osu.Game/Modes/ScoreProcesssor.cs
index a34915eaef..b90e24a0ff 100644
--- a/osu.Game/Modes/ScoreProcesssor.cs
+++ b/osu.Game/Modes/ScoreProcesssor.cs
@@ -18,13 +18,16 @@ namespace osu.Game.Modes
TotalScore = TotalScore,
Combo = Combo,
MaxCombo = HighestCombo,
- Accuracy = Accuracy
+ Accuracy = Accuracy,
+ Health = Health,
};
public readonly BindableDouble TotalScore = new BindableDouble { MinValue = 0 };
public readonly BindableDouble Accuracy = new BindableDouble { MinValue = 0, MaxValue = 1 };
+ public readonly BindableDouble Health = new BindableDouble { MinValue = 0, MaxValue = 1 };
+
public readonly BindableInt Combo = new BindableInt();
public readonly BindableInt HighestCombo = new BindableInt();
diff --git a/osu.Game/Modes/UI/HealthDisplay.cs b/osu.Game/Modes/UI/HealthDisplay.cs
new file mode 100644
index 0000000000..0645d54b50
--- /dev/null
+++ b/osu.Game/Modes/UI/HealthDisplay.cs
@@ -0,0 +1,43 @@
+using OpenTK;
+using OpenTK.Graphics;
+using osu.Framework.Configuration;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Sprites;
+using osu.Framework.Graphics.Transformations;
+using System;
+
+namespace osu.Game.Modes.UI
+{
+ public class HealthDisplay : Container
+ {
+ private Box background;
+ private Box fill;
+
+ public HealthDisplay()
+ {
+ Children = new Drawable[]
+ {
+ background = new Box
+ {
+ RelativeSizeAxes = Axes.Both,
+ Colour = Color4.Gray,
+ },
+ fill = new Box
+ {
+ RelativeSizeAxes = Axes.Both,
+ Colour = Color4.White,
+ Scale = new Vector2(0, 1),
+ },
+ };
+ }
+
+ public double Current;
+
+ public void Set(double value)
+ {
+ Current = value;
+ fill.ScaleTo(new Vector2((float)Current, 1), 200, EasingTypes.OutQuint);
+ }
+ }
+}
diff --git a/osu.Game/Modes/UI/ScoreOverlay.cs b/osu.Game/Modes/UI/ScoreOverlay.cs
index c7441483f8..fbdd75b97d 100644
--- a/osu.Game/Modes/UI/ScoreOverlay.cs
+++ b/osu.Game/Modes/UI/ScoreOverlay.cs
@@ -6,6 +6,8 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Graphics.UserInterface;
using osu.Game.Modes.Objects;
+using OpenTK;
+using osu.Framework.Graphics.Primitives;
namespace osu.Game.Modes.UI
{
@@ -15,12 +17,19 @@ namespace osu.Game.Modes.UI
public ComboCounter ComboCounter;
public ScoreCounter ScoreCounter;
public PercentageCounter AccuracyCounter;
+ public HealthDisplay HealthDisplay;
public Score Score { get; set; }
protected abstract KeyCounterCollection CreateKeyCounter();
protected abstract ComboCounter CreateComboCounter();
protected abstract PercentageCounter CreateAccuracyCounter();
protected abstract ScoreCounter CreateScoreCounter();
+ protected virtual HealthDisplay CreateHealthDisplay() => new HealthDisplay
+ {
+ Size = new Vector2(0.5f, 20),
+ RelativeSizeAxes = Axes.X,
+ Padding = new MarginPadding(5)
+ };
public virtual void OnHit(HitObject h)
{
@@ -44,6 +53,7 @@ namespace osu.Game.Modes.UI
ComboCounter = CreateComboCounter(),
ScoreCounter = CreateScoreCounter(),
AccuracyCounter = CreateAccuracyCounter(),
+ HealthDisplay = CreateHealthDisplay(),
};
}
@@ -53,6 +63,7 @@ namespace osu.Game.Modes.UI
processor.TotalScore.ValueChanged += delegate { ScoreCounter?.Set((ulong)processor.TotalScore.Value); };
processor.Accuracy.ValueChanged += delegate { AccuracyCounter?.Set((float)processor.Accuracy.Value); };
processor.Combo.ValueChanged += delegate { ComboCounter?.Set((ulong)processor.Combo.Value); };
+ processor.Health.ValueChanged += delegate { HealthDisplay?.Set(processor.Health.Value); };
}
}
}
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index a4da659718..8843bcf219 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -70,6 +70,7 @@
+
@@ -260,4 +261,4 @@
-->
-
+
\ No newline at end of file