From 6957a9dd36a572ca7f9948164e18abc3c3412288 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 6 Nov 2020 20:20:11 +0100 Subject: [PATCH 1/9] Flip arrow to correct direction instead of rotating 180 degrees --- .../UI/Components/MaskedPlayerArrow.cs | 35 ++++++++++++++----- .../UI/Components/Player.cs | 1 + 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs b/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs index 8050fee..70d7659 100644 --- a/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs +++ b/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs @@ -5,12 +5,14 @@ using osu.Framework.Graphics.Shapes; using osu.Framework.Allocation; using osu.Framework.Bindables; +using System; namespace osu.Game.Rulesets.Hishigata.UI.Components { public class MaskedPlayerArrow : CompositeDrawable { private readonly Box chevron; + private readonly Container rotationContainer; public MaskedPlayerArrow() { @@ -28,22 +30,37 @@ public MaskedPlayerArrow() Anchor = Anchor.Centre, Origin = Anchor.Centre, Rotation = -45, - Child = chevron = new Box + Child = rotationContainer = new Container { - RelativeSizeAxes = Axes.Both, - Size = new Vector2(2f), Anchor = Anchor.Centre, - Origin = Anchor.BottomCentre, - Alpha = 0, - AlwaysPresent = true + Origin = Anchor.Centre, + Child = chevron = new Box + { + Size = new Vector2(70.72f, 35.36f), + Anchor = Anchor.Centre, + Origin = Anchor.BottomCentre, + Alpha = 0, + AlwaysPresent = true + } } }; } - [BackgroundDependencyLoader] - private void load(BindableFloat angleBindable) + public void ChangeRotation(float newRotation) { - angleBindable.BindValueChanged(a => chevron.Rotation = a.NewValue, true); + float difference = (newRotation - rotationContainer.Rotation) % 360; + if (difference > 180) difference -= 360; + else if (difference < -180) difference += 360; + + if (Math.Abs(difference) == 180) + { + chevron.MoveToY(35.36f, 50).Then().MoveToY(0); + rotationContainer.Delay(50).RotateTo(newRotation); + } + else + { + rotationContainer.RotateTo(newRotation, 50); + } } } } diff --git a/osu.Game.Rulesets.Hishigata/UI/Components/Player.cs b/osu.Game.Rulesets.Hishigata/UI/Components/Player.cs index baf16ca..39813b3 100644 --- a/osu.Game.Rulesets.Hishigata/UI/Components/Player.cs +++ b/osu.Game.Rulesets.Hishigata/UI/Components/Player.cs @@ -133,6 +133,7 @@ private void rotateToClosestEquivalent(float angle, double duration = 0, Easing double totalDuration = Math.Abs(difference) / 90 * duration; this.TransformBindableTo(angleBindable, angleBindable.Value + difference, totalDuration, easing); + maskedArrow.ChangeRotation(angleBindable.Value + difference); } private void setArrowSkin(ArrowStyle style) From c69b5f872b2cda8ab4165d6bc2de371f7558ad9c Mon Sep 17 00:00:00 2001 From: Flutterish Date: Fri, 6 Nov 2020 21:24:02 +0100 Subject: [PATCH 2/9] implemented 180 path flips --- .../UI/Components/MaskedPlayerArrow.cs | 6 ++-- .../UI/Components/PathPlayerArrow.cs | 29 +++++++++++++++---- .../UI/Components/Player.cs | 16 +++++----- 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs b/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs index 70d7659..61a0a78 100644 --- a/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs +++ b/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs @@ -46,7 +46,7 @@ public MaskedPlayerArrow() }; } - public void ChangeRotation(float newRotation) + public void ChangeRotation(float newRotation, Easing easing = Easing.None) { float difference = (newRotation - rotationContainer.Rotation) % 360; if (difference > 180) difference -= 360; @@ -54,12 +54,12 @@ public void ChangeRotation(float newRotation) if (Math.Abs(difference) == 180) { - chevron.MoveToY(35.36f, 50).Then().MoveToY(0); + chevron.MoveToY(35.36f, 50, easing).Then().MoveToY(0); rotationContainer.Delay(50).RotateTo(newRotation); } else { - rotationContainer.RotateTo(newRotation, 50); + rotationContainer.RotateTo(newRotation, 50, easing); } } } diff --git a/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs b/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs index 88fc453..badf39c 100644 --- a/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs +++ b/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs @@ -18,6 +18,11 @@ public PathPlayerArrow() AutoSizeAxes = Axes.None; Size = new Vector2(( PathRadius + size ) * 2); + + angle.BindValueChanged(x => redraw()); + arc.BindValueChanged(x => redraw()); + + redraw(); } private const float size = 30; @@ -28,15 +33,27 @@ public PathPlayerArrow() new LineSegment( new Vector2(0,-size), new Vector2(size,0) ) }; - [BackgroundDependencyLoader] - private void load(BindableFloat angleBindable) + private const float deg_to_rad = MathF.PI / 180; + private BindableFloat arc = new BindableFloat( 180 ); + private BindableFloat angle = new BindableFloat( 0 ); + + public void ChangeRotation(float angle, Easing easing = Easing.None) { - angleBindable.BindValueChanged(a => redraw(a.NewValue), true); + if (Math.Abs(angle + this.angle.Value) % 360 == 180) + { + this.TransformBindableTo(arc, 360, 25, easing) + .Then() + .TransformBindableTo(arc, 180, 25, easing) + .TransformBindableTo(this.angle, angle); + } + else + { + this.TransformBindableTo(this.angle, angle, 50, easing); + } } - private void redraw(float angle) + private void redraw() { - angle = angle / 180 * MathF.PI; // to radians ClearVertices(); const int count = 30; @@ -44,7 +61,7 @@ private void redraw(float angle) for (int i = 0; i < count; i++) { float progress = i / (float)(count - 1); - var vertexAngle = angle - (MathF.PI / 2) + (progress * MathF.PI); + var vertexAngle = ( angle.Value - (arc.Value / 2) + (progress * arc.Value) ) * deg_to_rad; LineSegment ray = new LineSegment(Vector2.Zero, new Vector2(MathF.Sin(vertexAngle) * radius, -MathF.Cos(vertexAngle) * radius)); foreach (var segment in segments) diff --git a/osu.Game.Rulesets.Hishigata/UI/Components/Player.cs b/osu.Game.Rulesets.Hishigata/UI/Components/Player.cs index 39813b3..242197c 100644 --- a/osu.Game.Rulesets.Hishigata/UI/Components/Player.cs +++ b/osu.Game.Rulesets.Hishigata/UI/Components/Player.cs @@ -22,8 +22,7 @@ public class PlayerVisual : BeatSyncedContainer, IKeyBindingHandler 180) difference -= 360; else if (difference < -180) difference += 360; - double totalDuration = Math.Abs(difference) / 90 * duration; - - this.TransformBindableTo(angleBindable, angleBindable.Value + difference, totalDuration, easing); - maskedArrow.ChangeRotation(angleBindable.Value + difference); + targetAngle += difference; + maskedArrow.ChangeRotation(targetAngle + difference, easing); + pathArrow.ChangeRotation(targetAngle + difference, easing); } private void setArrowSkin(ArrowStyle style) From 8762d7617c3b6849c4810c128c6410950ba958cc Mon Sep 17 00:00:00 2001 From: Flutterish Date: Fri, 6 Nov 2020 21:39:59 +0100 Subject: [PATCH 3/9] fix being stupid --- osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs | 2 +- osu.Game.Rulesets.Hishigata/UI/Components/Player.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs b/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs index badf39c..9ac64a0 100644 --- a/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs +++ b/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs @@ -39,7 +39,7 @@ public PathPlayerArrow() public void ChangeRotation(float angle, Easing easing = Easing.None) { - if (Math.Abs(angle + this.angle.Value) % 360 == 180) + if ( Math.Abs(angle - this.angle.Value) % 360 == 180 ) { this.TransformBindableTo(arc, 360, 25, easing) .Then() diff --git a/osu.Game.Rulesets.Hishigata/UI/Components/Player.cs b/osu.Game.Rulesets.Hishigata/UI/Components/Player.cs index 242197c..5759929 100644 --- a/osu.Game.Rulesets.Hishigata/UI/Components/Player.cs +++ b/osu.Game.Rulesets.Hishigata/UI/Components/Player.cs @@ -130,8 +130,8 @@ private void rotateToClosestEquivalent(float angle, Easing easing = Easing.None) else if (difference < -180) difference += 360; targetAngle += difference; - maskedArrow.ChangeRotation(targetAngle + difference, easing); - pathArrow.ChangeRotation(targetAngle + difference, easing); + maskedArrow.ChangeRotation(targetAngle, easing); + pathArrow.ChangeRotation(targetAngle, easing); } private void setArrowSkin(ArrowStyle style) From 999a3ab2e3fede3618d99ffd9c53d779151ea1d9 Mon Sep 17 00:00:00 2001 From: Flutterish Date: Fri, 6 Nov 2020 21:52:45 +0100 Subject: [PATCH 4/9] Update PathPlayerArrow.cs --- osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs b/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs index 9ac64a0..c1d20e7 100644 --- a/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs +++ b/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs @@ -39,6 +39,8 @@ public PathPlayerArrow() public void ChangeRotation(float angle, Easing easing = Easing.None) { + FinishTransforms(); + if ( Math.Abs(angle - this.angle.Value) % 360 == 180 ) { this.TransformBindableTo(arc, 360, 25, easing) From b00260fbd7074f3100c038461b93a2306f137038 Mon Sep 17 00:00:00 2001 From: Flutterish Date: Fri, 6 Nov 2020 22:04:44 +0100 Subject: [PATCH 5/9] up the vertice count since the arc can now be 2x bigger --- osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs b/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs index c1d20e7..69a4744 100644 --- a/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs +++ b/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs @@ -5,6 +5,7 @@ using osu.Framework.Graphics; using osuTK; using osu.Game.Rulesets.Hishigata.LinearMath; +using System.Diagnostics; namespace osu.Game.Rulesets.Hishigata.UI.Components { @@ -58,7 +59,7 @@ private void redraw() { ClearVertices(); - const int count = 30; + const int count = 60; const float radius = 100; for (int i = 0; i < count; i++) { From b99fa10c07a98e963eb0f1c80a465d6e0cc49115 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 6 Nov 2020 22:14:24 +0100 Subject: [PATCH 6/9] Finish previous transforms before starting new one --- osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs b/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs index 70d7659..6ba9ee0 100644 --- a/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs +++ b/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs @@ -48,6 +48,7 @@ public MaskedPlayerArrow() public void ChangeRotation(float newRotation) { + FinishTransforms(true); float difference = (newRotation - rotationContainer.Rotation) % 360; if (difference > 180) difference -= 360; else if (difference < -180) difference += 360; From 45547100d20e79d8485242b2c0df0d995f82e7d1 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 6 Nov 2020 22:23:31 +0100 Subject: [PATCH 7/9] Fix tumor in path arrow --- .../LinearMath/LineSegment.cs | 34 +++++++++---------- .../UI/Components/PathPlayerArrow.cs | 10 +++--- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/osu.Game.Rulesets.Hishigata/LinearMath/LineSegment.cs b/osu.Game.Rulesets.Hishigata/LinearMath/LineSegment.cs index ee6fcce..707a81d 100644 --- a/osu.Game.Rulesets.Hishigata/LinearMath/LineSegment.cs +++ b/osu.Game.Rulesets.Hishigata/LinearMath/LineSegment.cs @@ -13,44 +13,44 @@ public struct LineSegment public readonly Vector2 PointA; public readonly Vector2 PointB; - public LineSegment (Vector2 a, Vector2 b) + public LineSegment(Vector2 a, Vector2 b) { PointA = a; PointB = b; } - public bool TryIntersect (LineSegment other, out Vector2 point) + public bool TryIntersect(LineSegment other, out Vector2 point) { - if ( Dx == 0 || other.Dx == 0 ) + if (Dx == 0 || other.Dx == 0) { var m1 = Dx / Dy; var m2 = other.Dx / other.Dy; - var b1 = PointA.X - m1 * PointA.Y; - var b2 = other.PointA.X - m2 * other.PointA.Y; + var b1 = PointA.X - (m1 * PointA.Y); + var b2 = other.PointA.X - (m2 * other.PointA.Y); - var y = ( b2 - b1 ) / ( m1 - m2 ); - point = new Vector2(m1 * y + b1, y); + var y = (b2 - b1) / (m1 - m2); + point = new Vector2((m1 * y) + b1, y); } else { var m1 = Dy / Dx; var m2 = other.Dy / other.Dx; - var b1 = PointA.Y - m1 * PointA.X; - var b2 = other.PointA.Y - m2 * other.PointA.X; + var b1 = PointA.Y - (m1 * PointA.X); + var b2 = other.PointA.Y - (m2 * other.PointA.X); - var x = ( b2 - b1 ) / ( m1 - m2 ); - point = new Vector2(x, m1 * x + b1); + var x = (b2 - b1) / (m1 - m2); + point = new Vector2(x, (m1 * x) + b1); } - return isInBounds( point ) && other.isInBounds( point ); + return isInBounds(point) && other.isInBounds(point); } - private bool isInBounds (Vector2 point) - => point.X > Math.Min(PointA.X, PointB.X) - 1 - && point.X < Math.Max(PointA.X, PointB.X) + 1 - && point.Y > Math.Min(PointA.Y, PointB.Y) - 1 - && point.Y < Math.Max(PointA.Y, PointB.Y) + 1; + private bool isInBounds(Vector2 point) + => point.X > Math.Min(PointA.X, PointB.X) + && point.X < Math.Max(PointA.X, PointB.X) + && point.Y > Math.Min(PointA.Y, PointB.Y) + && point.Y < Math.Max(PointA.Y, PointB.Y); } } diff --git a/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs b/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs index 69a4744..239cfb6 100644 --- a/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs +++ b/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs @@ -18,7 +18,7 @@ public PathPlayerArrow() PathRadius = 5; AutoSizeAxes = Axes.None; - Size = new Vector2(( PathRadius + size ) * 2); + Size = new Vector2((PathRadius + size) * 2); angle.BindValueChanged(x => redraw()); arc.BindValueChanged(x => redraw()); @@ -35,14 +35,14 @@ public PathPlayerArrow() }; private const float deg_to_rad = MathF.PI / 180; - private BindableFloat arc = new BindableFloat( 180 ); - private BindableFloat angle = new BindableFloat( 0 ); + private BindableFloat arc = new BindableFloat(180); + private BindableFloat angle = new BindableFloat(0); public void ChangeRotation(float angle, Easing easing = Easing.None) { FinishTransforms(); - if ( Math.Abs(angle - this.angle.Value) % 360 == 180 ) + if (Math.Abs(angle - this.angle.Value) % 360 == 180) { this.TransformBindableTo(arc, 360, 25, easing) .Then() @@ -64,7 +64,7 @@ private void redraw() for (int i = 0; i < count; i++) { float progress = i / (float)(count - 1); - var vertexAngle = ( angle.Value - (arc.Value / 2) + (progress * arc.Value) ) * deg_to_rad; + var vertexAngle = (angle.Value - (arc.Value / 2) + (progress * arc.Value)) * deg_to_rad; LineSegment ray = new LineSegment(Vector2.Zero, new Vector2(MathF.Sin(vertexAngle) * radius, -MathF.Cos(vertexAngle) * radius)); foreach (var segment in segments) From e1736355e844efbc87b11d4f539db61a70bf5f89 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Fri, 6 Nov 2020 22:34:53 +0100 Subject: [PATCH 8/9] Use RelativeSizeAxes instead of absolute measurements --- .../UI/Components/MaskedPlayerArrow.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs b/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs index 502c34b..083a5b7 100644 --- a/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs +++ b/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs @@ -32,11 +32,15 @@ public MaskedPlayerArrow() Rotation = -45, Child = rotationContainer = new Container { + RelativeSizeAxes = Axes.Both, Anchor = Anchor.Centre, Origin = Anchor.Centre, Child = chevron = new Box { - Size = new Vector2(70.72f, 35.36f), + RelativeSizeAxes = Axes.Both, + RelativePositionAxes = Axes.Both, + // Using the hypotenuse length + Size = new Vector2(1.41f, 0.71f), Anchor = Anchor.Centre, Origin = Anchor.BottomCentre, Alpha = 0, @@ -49,13 +53,9 @@ public MaskedPlayerArrow() public void ChangeRotation(float newRotation, Easing easing = Easing.None) { FinishTransforms(true); - float difference = (newRotation - rotationContainer.Rotation) % 360; - if (difference > 180) difference -= 360; - else if (difference < -180) difference += 360; - - if (Math.Abs(difference) == 180) + if (Math.Abs(newRotation - rotationContainer.Rotation) == 180) { - chevron.MoveToY(35.36f, 50, easing).Then().MoveToY(0); + chevron.MoveToY(0.71f, 50, easing).Then().MoveToY(0); rotationContainer.Delay(50).RotateTo(newRotation); } else From 12d1279f82bb1c3673b260a15fccdaecae929da4 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 7 Nov 2020 11:06:29 +0100 Subject: [PATCH 9/9] Format documents --- osu.Game.Rulesets.Hishigata/LinearMath/LineSegment.cs | 2 -- .../UI/Components/MaskedPlayerArrow.cs | 10 ++++------ .../UI/Components/PathPlayerArrow.cs | 6 ++---- osu.Game.Rulesets.Hishigata/UI/Components/Player.cs | 3 +-- 4 files changed, 7 insertions(+), 14 deletions(-) diff --git a/osu.Game.Rulesets.Hishigata/LinearMath/LineSegment.cs b/osu.Game.Rulesets.Hishigata/LinearMath/LineSegment.cs index 707a81d..a7e27a4 100644 --- a/osu.Game.Rulesets.Hishigata/LinearMath/LineSegment.cs +++ b/osu.Game.Rulesets.Hishigata/LinearMath/LineSegment.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using System.Text; using osuTK; namespace osu.Game.Rulesets.Hishigata.LinearMath diff --git a/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs b/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs index 083a5b7..3836ef3 100644 --- a/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs +++ b/osu.Game.Rulesets.Hishigata/UI/Components/MaskedPlayerArrow.cs @@ -1,11 +1,9 @@ -using osu.Framework.Graphics.Containers; -using osuTK; -using osuTK.Graphics; +using System; using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; -using osu.Framework.Allocation; -using osu.Framework.Bindables; -using System; +using osuTK; +using osuTK.Graphics; namespace osu.Game.Rulesets.Hishigata.UI.Components { diff --git a/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs b/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs index 239cfb6..26a05bc 100644 --- a/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs +++ b/osu.Game.Rulesets.Hishigata/UI/Components/PathPlayerArrow.cs @@ -1,11 +1,9 @@ using System; -using osu.Framework.Allocation; using osu.Framework.Bindables; -using osu.Framework.Graphics.Lines; using osu.Framework.Graphics; -using osuTK; +using osu.Framework.Graphics.Lines; using osu.Game.Rulesets.Hishigata.LinearMath; -using System.Diagnostics; +using osuTK; namespace osu.Game.Rulesets.Hishigata.UI.Components { diff --git a/osu.Game.Rulesets.Hishigata/UI/Components/Player.cs b/osu.Game.Rulesets.Hishigata/UI/Components/Player.cs index 5759929..c2c5d8d 100644 --- a/osu.Game.Rulesets.Hishigata/UI/Components/Player.cs +++ b/osu.Game.Rulesets.Hishigata/UI/Components/Player.cs @@ -1,4 +1,3 @@ -using System; using osu.Framework.Allocation; using osu.Framework.Audio.Track; using osu.Framework.Bindables; @@ -9,8 +8,8 @@ using osu.Framework.Utils; using osu.Game.Beatmaps.ControlPoints; using osu.Game.Graphics.Containers; -using osu.Game.Rulesets.Hishigata.Objects.Drawables; using osu.Game.Rulesets.Hishigata.Configuration; +using osu.Game.Rulesets.Hishigata.Objects.Drawables; using osuTK; using osuTK.Graphics;