From 3026675f35466bbfbe89a61d090605e4530a2336 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Mon, 11 Sep 2017 13:44:39 +0900 Subject: [PATCH] Add explosions. --- .../Visual/TestCaseManiaPlayfield.cs | 20 ++++++- osu.Game.Rulesets.Mania/Objects/HoldNote.cs | 11 ++++ .../Objects/ManiaHitObject.cs | 2 +- osu.Game.Rulesets.Mania/UI/Column.cs | 21 ++++++- osu.Game.Rulesets.Mania/UI/HitExplosion.cs | 55 +++++++++++++++++++ osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs | 6 +- .../osu.Game.Rulesets.Mania.csproj | 1 + 7 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 osu.Game.Rulesets.Mania/UI/HitExplosion.cs diff --git a/osu.Desktop.Tests/Visual/TestCaseManiaPlayfield.cs b/osu.Desktop.Tests/Visual/TestCaseManiaPlayfield.cs index fb14bdb3bf..8fa627ab6d 100644 --- a/osu.Desktop.Tests/Visual/TestCaseManiaPlayfield.cs +++ b/osu.Desktop.Tests/Visual/TestCaseManiaPlayfield.cs @@ -13,6 +13,9 @@ using osu.Game.Rulesets.Mania.Timing; using osu.Game.Rulesets.Mania.UI; using osu.Game.Rulesets.Timing; using osu.Game.Rulesets; +using osu.Game.Rulesets.Mania.Judgements; +using osu.Game.Rulesets.Objects.Drawables; +using OpenTK.Graphics; namespace osu.Desktop.Tests.Visual { @@ -43,6 +46,19 @@ namespace osu.Desktop.Tests.Visual AddStep("Notes with input (reversed)", () => createPlayfieldWithNotes(false, true)); AddStep("Notes with gravity", () => createPlayfieldWithNotes(true)); AddStep("Notes with gravity (reversed)", () => createPlayfieldWithNotes(true, true)); + + AddStep("Hit explosion", () => + { + var playfield = createPlayfield(4, SpecialColumnPosition.Normal); + + var note = new DrawableNote(new Note(), ManiaAction.Key1) + { + Judgement = new ManiaJudgement { Result = HitResult.Hit }, + AccentColour = Color4.Green + }; + + playfield.OnJudgement(note); + }); } [BackgroundDependencyLoader] @@ -56,7 +72,7 @@ namespace osu.Desktop.Tests.Visual TimingPoint = { BeatLength = 1000 } }, gravity ? ScrollingAlgorithm.Gravity : ScrollingAlgorithm.Basic); - private void createPlayfield(int cols, SpecialColumnPosition specialPos, bool inverted = false) + private ManiaPlayfield createPlayfield(int cols, SpecialColumnPosition specialPos, bool inverted = false) { Clear(); @@ -72,6 +88,8 @@ namespace osu.Desktop.Tests.Visual }); playfield.Inverted.Value = inverted; + + return playfield; } private void createPlayfieldWithNotes(bool gravity, bool inverted = false) diff --git a/osu.Game.Rulesets.Mania/Objects/HoldNote.cs b/osu.Game.Rulesets.Mania/Objects/HoldNote.cs index c3a29b39a8..ef2e02a791 100644 --- a/osu.Game.Rulesets.Mania/Objects/HoldNote.cs +++ b/osu.Game.Rulesets.Mania/Objects/HoldNote.cs @@ -37,6 +37,17 @@ namespace osu.Game.Rulesets.Mania.Objects } } + public override int Column + { + get { return base.Column; } + set + { + base.Column = value; + Head.Column = value; + Tail.Column = value; + } + } + /// /// The head note of the hold. /// diff --git a/osu.Game.Rulesets.Mania/Objects/ManiaHitObject.cs b/osu.Game.Rulesets.Mania/Objects/ManiaHitObject.cs index 93aaa94f45..7beb21f9e3 100644 --- a/osu.Game.Rulesets.Mania/Objects/ManiaHitObject.cs +++ b/osu.Game.Rulesets.Mania/Objects/ManiaHitObject.cs @@ -8,6 +8,6 @@ namespace osu.Game.Rulesets.Mania.Objects { public abstract class ManiaHitObject : HitObject, IHasColumn { - public int Column { get; set; } + public virtual int Column { get; set; } } } diff --git a/osu.Game.Rulesets.Mania/UI/Column.cs b/osu.Game.Rulesets.Mania/UI/Column.cs index d5bc7cc659..213144c84d 100644 --- a/osu.Game.Rulesets.Mania/UI/Column.cs +++ b/osu.Game.Rulesets.Mania/UI/Column.cs @@ -36,6 +36,9 @@ namespace osu.Game.Rulesets.Mania.UI private readonly Container hitTargetBar; private readonly Container keyIcon; + internal readonly Container TopLevelContainer; + private readonly Container explosionContainer; + protected override Container Content => content; private readonly Container content; @@ -98,6 +101,11 @@ namespace osu.Game.Rulesets.Mania.UI { Pressed = onPressed, Released = onReleased + }, + explosionContainer = new Container + { + Name = "Hit explosions", + RelativeSizeAxes = Axes.Both } } }, @@ -136,8 +144,11 @@ namespace osu.Game.Rulesets.Mania.UI } } } - } + }, + TopLevelContainer = new Container { RelativeSizeAxes = Axes.Both } }; + + TopLevelContainer.Add(explosionContainer.CreateProxy()); } public override Axes RelativeSizeAxes => Axes.Y; @@ -194,6 +205,14 @@ namespace osu.Game.Rulesets.Mania.UI HitObjects.Add(hitObject); } + public override void OnJudgement(DrawableHitObject judgedObject) + { + if (judgedObject.Judgement.Result != HitResult.Hit) + return; + + explosionContainer.Add(new HitExplosion(judgedObject)); + } + private bool onPressed(ManiaAction action) { if (action == Action) diff --git a/osu.Game.Rulesets.Mania/UI/HitExplosion.cs b/osu.Game.Rulesets.Mania/UI/HitExplosion.cs new file mode 100644 index 0000000000..ae2a09c67e --- /dev/null +++ b/osu.Game.Rulesets.Mania/UI/HitExplosion.cs @@ -0,0 +1,55 @@ +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Shapes; +using osu.Game.Rulesets.Mania.Judgements; +using osu.Game.Rulesets.Mania.Objects; +using osu.Game.Rulesets.Objects.Drawables; + +namespace osu.Game.Rulesets.Mania.UI +{ + internal class HitExplosion : CompositeDrawable + { + private readonly Box inner; + + public HitExplosion(DrawableHitObject judgedObject) + { + Anchor = Anchor.TopCentre; + Origin = Anchor.Centre; + + RelativeSizeAxes = Axes.Both; + FillMode = FillMode.Fit; + + BlendingMode = BlendingMode.Additive; + + InternalChild = new CircularContainer + { + RelativeSizeAxes = Axes.Both, + Masking = true, + BorderThickness = 1, + BorderColour = judgedObject.AccentColour, + EdgeEffect = new EdgeEffectParameters + { + Type = EdgeEffectType.Glow, + Colour = judgedObject.AccentColour, + Radius = 10, + Hollow = true + }, + Child = inner = new Box + { + RelativeSizeAxes = Axes.Both, + Colour = judgedObject.AccentColour, + Alpha = 1, + AlwaysPresent = true, + } + }; + } + + protected override void LoadComplete() + { + base.LoadComplete(); + + this.ScaleTo(2f, 600, Easing.OutQuint).FadeOut(500); + inner.FadeOut(250); + } + } +} diff --git a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs index ee50cb3f6b..aceea7bea3 100644 --- a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs +++ b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs @@ -14,6 +14,7 @@ using osu.Framework.Allocation; using System.Linq; using System.Collections.Generic; using osu.Framework.Configuration; +using osu.Framework.Extensions.IEnumerableExtensions; using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Mania.Objects.Drawables; using osu.Framework.Graphics.Shapes; @@ -50,8 +51,6 @@ namespace osu.Game.Rulesets.Mania.UI protected override Container Content => content; private readonly Container content; - private readonly Container topLevelContainer; - private List normalColumnColours = new List(); private Color4 specialColumnColour; @@ -67,6 +66,7 @@ namespace osu.Game.Rulesets.Mania.UI Inverted.Value = true; + Container topLevelContainer; InternalChildren = new Drawable[] { new Container @@ -135,6 +135,8 @@ namespace osu.Game.Rulesets.Mania.UI c.IsSpecial = isSpecialColumn(i); c.Action = c.IsSpecial ? ManiaAction.Special : currentAction++; + topLevelContainer.Add(c.TopLevelContainer.CreateProxy()); + columns.Add(c); AddNested(c); } diff --git a/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj b/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj index 890c9116cf..1e44fb7025 100644 --- a/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj +++ b/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj @@ -83,6 +83,7 @@ +