From 97059a9f50afafe091ffed155afd287e4970854d Mon Sep 17 00:00:00 2001 From: ekrctb Date: Mon, 19 Jul 2021 19:44:40 +0900 Subject: [PATCH] Create `Catcher` in `CatchPlayfield` --- .../TestSceneCatcherArea.cs | 5 ++- .../TestSceneHyperDashColouring.cs | 7 ++-- osu.Game.Rulesets.Catch/UI/CatchPlayfield.cs | 30 ++++++++++------ osu.Game.Rulesets.Catch/UI/CatcherArea.cs | 36 +++++++++++-------- 4 files changed, 51 insertions(+), 27 deletions(-) diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherArea.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherArea.cs index 877e115e2f..18a6e0a66f 100644 --- a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherArea.cs +++ b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherArea.cs @@ -123,8 +123,11 @@ namespace osu.Game.Rulesets.Catch.Tests private readonly DroppedObjectContainer droppedObjectContainer; public TestCatcherArea(BeatmapDifficulty beatmapDifficulty) - : base(beatmapDifficulty) { + MovableCatcher = new Catcher(this, beatmapDifficulty) + { + X = CatchPlayfield.CENTER_X + }; AddInternal(droppedObjectContainer = new DroppedObjectContainer()); } diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneHyperDashColouring.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneHyperDashColouring.cs index e7b0259ea2..61057f4c4d 100644 --- a/osu.Game.Rulesets.Catch.Tests/TestSceneHyperDashColouring.cs +++ b/osu.Game.Rulesets.Catch.Tests/TestSceneHyperDashColouring.cs @@ -213,8 +213,11 @@ namespace osu.Game.Rulesets.Catch.Tests public TestCatcherArea() { - Scale = new Vector2(4f); - + MovableCatcher = new Catcher(this, new BeatmapDifficulty()) + { + X = CatchPlayfield.CENTER_X, + Scale = new Vector2(4) + }; AddInternal(droppedObjectContainer = new DroppedObjectContainer()); } } diff --git a/osu.Game.Rulesets.Catch/UI/CatchPlayfield.cs b/osu.Game.Rulesets.Catch/UI/CatchPlayfield.cs index 05cd29dff5..727d3aca0f 100644 --- a/osu.Game.Rulesets.Catch/UI/CatchPlayfield.cs +++ b/osu.Game.Rulesets.Catch/UI/CatchPlayfield.cs @@ -3,6 +3,7 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; using osu.Game.Beatmaps; using osu.Game.Rulesets.Catch.Objects; using osu.Game.Rulesets.Catch.Objects.Drawables; @@ -26,31 +27,40 @@ namespace osu.Game.Rulesets.Catch.UI /// public const float CENTER_X = WIDTH / 2; - [Cached] - private readonly DroppedObjectContainer droppedObjectContainer; - - internal readonly CatcherArea CatcherArea; - public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => // only check the X position; handle all vertical space. base.ReceivePositionalInputAt(new Vector2(screenSpacePos.X, ScreenSpaceDrawQuad.Centre.Y)); + internal readonly Catcher Catcher; + + internal readonly CatcherArea CatcherArea; + + [Cached] + private readonly DroppedObjectContainer droppedObjectContainer; + public CatchPlayfield(BeatmapDifficulty difficulty) { - CatcherArea = new CatcherArea(difficulty) + var trailContainer = new Container(); + + Catcher = new Catcher(trailContainer, difficulty) { - Anchor = Anchor.BottomLeft, - Origin = Anchor.TopLeft, + X = CENTER_X }; InternalChildren = new[] { droppedObjectContainer = new DroppedObjectContainer(), - CatcherArea.MovableCatcher.CreateProxiedContent(), + Catcher.CreateProxiedContent(), HitObjectContainer.CreateProxy(), // This ordering (`CatcherArea` before `HitObjectContainer`) is important to // make sure the up-to-date catcher position is used for the catcher catching logic of hit objects. - CatcherArea, + CatcherArea = new CatcherArea + { + Anchor = Anchor.BottomLeft, + Origin = Anchor.TopLeft, + MovableCatcher = Catcher + }, + trailContainer, HitObjectContainer, }; } diff --git a/osu.Game.Rulesets.Catch/UI/CatcherArea.cs b/osu.Game.Rulesets.Catch/UI/CatcherArea.cs index fea314df8d..a9d0275678 100644 --- a/osu.Game.Rulesets.Catch/UI/CatcherArea.cs +++ b/osu.Game.Rulesets.Catch/UI/CatcherArea.cs @@ -5,7 +5,6 @@ using System; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Input.Bindings; -using osu.Game.Beatmaps; using osu.Game.Rulesets.Catch.Judgements; using osu.Game.Rulesets.Catch.Objects.Drawables; using osu.Game.Rulesets.Catch.Replays; @@ -20,9 +19,22 @@ namespace osu.Game.Rulesets.Catch.UI { public const float CATCHER_SIZE = 106.75f; - public readonly Catcher MovableCatcher; + public Catcher MovableCatcher + { + get => catcher; + set + { + if (catcher != null) + Remove(catcher); + + Add(catcher = value); + } + } + private readonly CatchComboDisplay comboDisplay; + private Catcher catcher; + /// /// -1 when only left button is pressed. /// 1 when only right button is pressed. @@ -30,21 +42,17 @@ namespace osu.Game.Rulesets.Catch.UI /// private int currentDirection; - public CatcherArea(BeatmapDifficulty difficulty = null) + public CatcherArea() { Size = new Vector2(CatchPlayfield.WIDTH, CATCHER_SIZE); - Children = new Drawable[] + Child = comboDisplay = new CatchComboDisplay { - comboDisplay = new CatchComboDisplay - { - RelativeSizeAxes = Axes.None, - AutoSizeAxes = Axes.Both, - Anchor = Anchor.TopLeft, - Origin = Anchor.Centre, - Margin = new MarginPadding { Bottom = 350f }, - X = CatchPlayfield.CENTER_X - }, - MovableCatcher = new Catcher(this, difficulty) { X = CatchPlayfield.CENTER_X }, + RelativeSizeAxes = Axes.None, + AutoSizeAxes = Axes.Both, + Anchor = Anchor.TopLeft, + Origin = Anchor.Centre, + Margin = new MarginPadding { Bottom = 350f }, + X = CatchPlayfield.CENTER_X }; }