From 4ad3e3d64eb821d45da43cb9b4067dfdc6227f41 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Thu, 4 May 2017 18:02:43 +0900 Subject: [PATCH] Basic implementation of hold notes (not finalized yet). --- .../Tests/TestCaseManiaHitObjects.cs | 40 +++++++++-- .../Objects/Drawables/DrawableHoldNote.cs | 72 +++++++++++++++++++ .../Drawables/DrawableManiaHitObject.cs | 68 ++++++++++++------ .../Objects/Drawables/DrawableNote.cs | 13 +++- .../Objects/Drawables/Pieces/BodyPiece.cs | 47 ++++++++++++ .../Objects/Drawables/Pieces/NotePiece.cs | 9 --- .../osu.Game.Rulesets.Mania.csproj | 2 + 7 files changed, 214 insertions(+), 37 deletions(-) create mode 100644 osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs create mode 100644 osu.Game.Rulesets.Mania/Objects/Drawables/Pieces/BodyPiece.cs diff --git a/osu.Desktop.VisualTests/Tests/TestCaseManiaHitObjects.cs b/osu.Desktop.VisualTests/Tests/TestCaseManiaHitObjects.cs index 093b6f1e01..a842406f99 100644 --- a/osu.Desktop.VisualTests/Tests/TestCaseManiaHitObjects.cs +++ b/osu.Desktop.VisualTests/Tests/TestCaseManiaHitObjects.cs @@ -12,6 +12,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using OpenTK.Graphics; +using OpenTK; namespace osu.Desktop.VisualTests.Tests { @@ -21,19 +22,48 @@ namespace osu.Desktop.VisualTests.Tests { base.Reset(); - Add(new Container + Add(new FillFlowContainer { Anchor = Anchor.Centre, Origin = Anchor.Centre, RelativeSizeAxes = Axes.Y, - Width = 50, - Children = new[] + Direction = FillDirection.Horizontal, + Spacing = new Vector2(10, 0), + // Imagine that the containers containing the drawable notes are the "columns" + Children = new Drawable[] { - new DrawableNote(new Note()) + new Container { Anchor = Anchor.Centre, Origin = Anchor.Centre, - AccentColour = Color4.Red + RelativeSizeAxes = Axes.Y, + Width = 50, + Children = new[] + { + new DrawableNote(new Note()) + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + AccentColour = Color4.Red + } + } + }, + new Container + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + RelativeSizeAxes = Axes.Y, + Width = 50, + Children = new[] + { + new DrawableHoldNote(new HoldNote()) + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + AccentColour = Color4.Red, + Length = 0.4f + } + } } } }); diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs new file mode 100644 index 0000000000..7db65a6522 --- /dev/null +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs @@ -0,0 +1,72 @@ +// Copyright (c) 2007-2017 ppy Pty Ltd . +// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE + +using System; +using osu.Game.Rulesets.Objects.Drawables; +using osu.Framework.Graphics; +using osu.Framework.Allocation; +using osu.Game.Rulesets.Mania.Objects.Drawables.Pieces; +using OpenTK.Graphics; + +namespace osu.Game.Rulesets.Mania.Objects.Drawables +{ + public class DrawableHoldNote : DrawableManiaHitObject + { + /// + /// Length of this hold note, relative to its parent. + /// + public float Length; + + private NotePiece headPiece; + private BodyPiece bodyPiece; + private NotePiece tailPiece; + + public DrawableHoldNote(HoldNote hitObject) + : base(hitObject) + { + Children = new Drawable[] + { + headPiece = new NotePiece + { + Anchor = Anchor.BottomCentre, + Origin = Anchor.BottomCentre + }, + bodyPiece = new BodyPiece + { + Anchor = Anchor.BottomCentre, + Origin = Anchor.BottomCentre, + }, + tailPiece = new NotePiece + { + Anchor = Anchor.BottomCentre, + Origin = Anchor.BottomCentre + } + }; + } + + public override Color4 AccentColour + { + get { return AccentColour; } + set + { + if (base.AccentColour == value) + return; + base.AccentColour = value; + + headPiece.AccentColour = value; + bodyPiece.AccentColour = value; + tailPiece.AccentColour = value; + } + } + + + protected override void Update() + { + bodyPiece.Height = Parent.DrawSize.Y * Length; + } + + protected override void UpdateState(ArmedState state) + { + } + } +} diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs index ebf99de72b..9f4c5f6ee2 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs @@ -4,6 +4,7 @@ using OpenTK.Graphics; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Sprites; using osu.Game.Rulesets.Mania.Judgements; using osu.Game.Rulesets.Objects.Drawables; @@ -12,20 +13,12 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables public abstract class DrawableManiaHitObject : DrawableHitObject where TObject : ManiaHitObject { - public override Color4 AccentColour - { - get { return base.AccentColour; } - set - { - base.AccentColour = value; - UpdateAccent(); - } - } - public new TObject HitObject; + private readonly Container glowContainer; + protected override Container Content => noteFlow; - private FlowContainer noteFlow; + private readonly FlowContainer noteFlow; public DrawableManiaHitObject(TObject hitObject) : base(hitObject) @@ -35,18 +28,53 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables RelativeSizeAxes = Axes.X; AutoSizeAxes = Axes.Y; - AddInternal(noteFlow = new FillFlowContainer + InternalChildren = new Drawable[] { - Name = "Main container", - Anchor = Anchor.BottomCentre, - Origin = Anchor.BottomCentre, - RelativeSizeAxes = Axes.X, - AutoSizeAxes = Axes.Y - }); + glowContainer = new Container + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + RelativeSizeAxes = Axes.Both, + Masking = true, + Children = new[] + { + new Box + { + RelativeSizeAxes = Axes.Both, + AlwaysPresent = true, + Alpha = 0 + } + } + }, + noteFlow = new FillFlowContainer + { + Name = "Main container", + Anchor = Anchor.BottomCentre, + Origin = Anchor.BottomCentre, + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y + } + }; + } + + public override Color4 AccentColour + { + get { return base.AccentColour; } + set + { + if (base.AccentColour == value) + return; + base.AccentColour = value; + + glowContainer.EdgeEffect = new EdgeEffect + { + Type = EdgeEffectType.Glow, + Radius = 5, + Colour = value + }; + } } protected override ManiaJudgement CreateJudgement() => new ManiaJudgement(); - - protected virtual void UpdateAccent() { } } } diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs index 2b2b6e5b1a..09443b6893 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs @@ -21,10 +21,17 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables Add(headPiece = new NotePiece()); } - [BackgroundDependencyLoader] - private void load() + public override Color4 AccentColour { - headPiece.AccentColour = AccentColour; + get { return AccentColour; } + set + { + if (base.AccentColour == value) + return; + base.AccentColour = value; + + headPiece.AccentColour = value; + } } protected override void UpdateState(ArmedState state) diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/Pieces/BodyPiece.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/Pieces/BodyPiece.cs new file mode 100644 index 0000000000..b2451c9995 --- /dev/null +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/Pieces/BodyPiece.cs @@ -0,0 +1,47 @@ +using System; +using OpenTK.Graphics; +using osu.Framework.Graphics; +// Copyright (c) 2007-2017 ppy Pty Ltd . +// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE + + +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Sprites; +using osu.Game.Graphics; + +namespace osu.Game.Rulesets.Mania.Objects.Drawables.Pieces +{ + internal class BodyPiece : Container, IHasAccentColour + { + private Box box; + + public BodyPiece() + { + RelativeSizeAxes = Axes.X; + Masking = true; + + Children = new[] + { + box = new Box + { + RelativeSizeAxes = Axes.Both, + Alpha = 0.3f + } + }; + } + + private Color4 accentColour; + public Color4 AccentColour + { + get { return accentColour; } + set + { + if (accentColour == value) + return; + accentColour = value; + + box.Colour = accentColour; + } + } + } +} diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/Pieces/NotePiece.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/Pieces/NotePiece.cs index 90456f4f62..0acb250f88 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/Pieces/NotePiece.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/Pieces/NotePiece.cs @@ -22,8 +22,6 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables.Pieces RelativeSizeAxes = Axes.X; Height = head_height; - Masking = true; - Children = new[] { new Box @@ -52,13 +50,6 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables.Pieces accentColour = value; colouredBox.Colour = AccentColour.Lighten(0.9f); - - EdgeEffect = new EdgeEffect - { - Type = EdgeEffectType.Glow, - Radius = 5, - Colour = AccentColour - }; } } } diff --git a/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj b/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj index 32925dcc45..be29b28a38 100644 --- a/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj +++ b/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj @@ -51,8 +51,10 @@ + +