mirror of
https://github.com/ppy/osu.git
synced 2025-01-21 11:22:55 +08:00
Introduce initial placement blueprint logic
This commit is contained in:
parent
7d4e60f05e
commit
90acba8c36
@ -15,15 +15,13 @@ namespace osu.Game.Rulesets.Taiko.Tests
|
|||||||
{
|
{
|
||||||
public class TestSceneTaikoHitObjectComposer : EditorClockTestScene
|
public class TestSceneTaikoHitObjectComposer : EditorClockTestScene
|
||||||
{
|
{
|
||||||
private TestComposer composer;
|
|
||||||
|
|
||||||
[SetUp]
|
[SetUp]
|
||||||
public void Setup() => Schedule(() =>
|
public void Setup() => Schedule(() =>
|
||||||
{
|
{
|
||||||
BeatDivisor.Value = 8;
|
BeatDivisor.Value = 8;
|
||||||
Clock.Seek(0);
|
Clock.Seek(0);
|
||||||
|
|
||||||
Child = composer = new TestComposer { RelativeSizeAxes = Axes.Both };
|
Child = new TestComposer { RelativeSizeAxes = Axes.Both };
|
||||||
});
|
});
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@ -37,8 +35,6 @@ namespace osu.Game.Rulesets.Taiko.Tests
|
|||||||
[Cached(typeof(IBeatSnapProvider))]
|
[Cached(typeof(IBeatSnapProvider))]
|
||||||
public readonly EditorBeatmap EditorBeatmap;
|
public readonly EditorBeatmap EditorBeatmap;
|
||||||
|
|
||||||
public readonly TaikoHitObjectComposer Composer;
|
|
||||||
|
|
||||||
public TestComposer()
|
public TestComposer()
|
||||||
{
|
{
|
||||||
InternalChildren = new Drawable[]
|
InternalChildren = new Drawable[]
|
||||||
@ -47,7 +43,7 @@ namespace osu.Game.Rulesets.Taiko.Tests
|
|||||||
{
|
{
|
||||||
BeatmapInfo = { Ruleset = new TaikoRuleset().RulesetInfo }
|
BeatmapInfo = { Ruleset = new TaikoRuleset().RulesetInfo }
|
||||||
},
|
},
|
||||||
Composer = new TaikoHitObjectComposer(new TaikoRuleset())
|
new TaikoHitObjectComposer(new TaikoRuleset())
|
||||||
};
|
};
|
||||||
|
|
||||||
for (int i = 0; i < 10; i++)
|
for (int i = 0; i < 10; i++)
|
||||||
|
@ -2,14 +2,22 @@
|
|||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Framework.Graphics.Shapes;
|
||||||
|
using osu.Framework.Input.Events;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets.Edit;
|
using osu.Game.Rulesets.Edit;
|
||||||
using osu.Game.Rulesets.Edit.Tools;
|
using osu.Game.Rulesets.Edit.Tools;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
|
using osu.Game.Rulesets.Objects.Drawables;
|
||||||
using osu.Game.Rulesets.Taiko.Objects;
|
using osu.Game.Rulesets.Taiko.Objects;
|
||||||
using osu.Game.Rulesets.Taiko.UI;
|
using osu.Game.Rulesets.Taiko.UI;
|
||||||
using osu.Game.Rulesets.UI;
|
using osu.Game.Rulesets.UI;
|
||||||
using osu.Game.Screens.Edit.Compose.Components;
|
using osu.Game.Screens.Edit.Compose.Components;
|
||||||
|
using osuTK;
|
||||||
|
using osuTK.Graphics;
|
||||||
|
using osuTK.Input;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Taiko
|
namespace osu.Game.Rulesets.Taiko
|
||||||
{
|
{
|
||||||
@ -22,13 +30,120 @@ namespace osu.Game.Rulesets.Taiko
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override IReadOnlyList<HitObjectCompositionTool> CompositionTools => new List<HitObjectCompositionTool>();
|
protected override IReadOnlyList<HitObjectCompositionTool> CompositionTools => new[]
|
||||||
|
{
|
||||||
|
new HitCompositionTool()
|
||||||
|
};
|
||||||
|
|
||||||
protected override ComposeBlueprintContainer CreateBlueprintContainer() => new ComposeBlueprintContainer(drawableRuleset.Playfield.AllHitObjects);
|
protected override ComposeBlueprintContainer CreateBlueprintContainer() => new TaikoBlueprintContainer(drawableRuleset.Playfield.AllHitObjects);
|
||||||
|
|
||||||
protected override DrawableRuleset<TaikoHitObject> CreateDrawableRuleset(Ruleset ruleset, IBeatmap beatmap, IReadOnlyList<Mod> mods = null)
|
protected override DrawableRuleset<TaikoHitObject> CreateDrawableRuleset(Ruleset ruleset, IBeatmap beatmap, IReadOnlyList<Mod> mods = null)
|
||||||
{
|
{
|
||||||
return drawableRuleset = new DrawableTaikoRuleset(ruleset, beatmap, mods);
|
return drawableRuleset = new DrawableTaikoRuleset(ruleset, beatmap, mods);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class TaikoBlueprintContainer : ComposeBlueprintContainer
|
||||||
|
{
|
||||||
|
public TaikoBlueprintContainer(IEnumerable<DrawableHitObject> hitObjects)
|
||||||
|
: base(hitObjects)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override OverlaySelectionBlueprint CreateBlueprintFor(DrawableHitObject hitObject) =>
|
||||||
|
new TaikoSelectionBlueprint(hitObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TaikoSelectionBlueprint : OverlaySelectionBlueprint
|
||||||
|
{
|
||||||
|
public TaikoSelectionBlueprint(DrawableHitObject hitObject)
|
||||||
|
: base(hitObject)
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.None;
|
||||||
|
|
||||||
|
AddInternal(new HitPiece { RelativeSizeAxes = Axes.Both });
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Update()
|
||||||
|
{
|
||||||
|
base.Update();
|
||||||
|
|
||||||
|
// Move the rectangle to cover the hitobjects
|
||||||
|
var topLeft = new Vector2(float.MaxValue, float.MaxValue);
|
||||||
|
var bottomRight = new Vector2(float.MinValue, float.MinValue);
|
||||||
|
|
||||||
|
topLeft = Vector2.ComponentMin(topLeft, Parent.ToLocalSpace(DrawableObject.ScreenSpaceDrawQuad.TopLeft));
|
||||||
|
bottomRight = Vector2.ComponentMax(bottomRight, Parent.ToLocalSpace(DrawableObject.ScreenSpaceDrawQuad.BottomRight));
|
||||||
|
|
||||||
|
Size = bottomRight - topLeft;
|
||||||
|
Position = topLeft;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class HitCompositionTool : HitObjectCompositionTool
|
||||||
|
{
|
||||||
|
public HitCompositionTool()
|
||||||
|
: base(nameof(Hit))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override PlacementBlueprint CreatePlacementBlueprint() => new HitPlacementBlueprint();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class HitPlacementBlueprint : PlacementBlueprint
|
||||||
|
|
||||||
|
{
|
||||||
|
private readonly HitPiece piece;
|
||||||
|
|
||||||
|
public HitPlacementBlueprint()
|
||||||
|
: base(new Hit())
|
||||||
|
{
|
||||||
|
InternalChild = piece = new HitPiece
|
||||||
|
{
|
||||||
|
Size = new Vector2(TaikoHitObject.DEFAULT_SIZE * TaikoPlayfield.DEFAULT_HEIGHT)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool OnMouseDown(MouseDownEvent e)
|
||||||
|
{
|
||||||
|
if (e.Button == MouseButton.Left)
|
||||||
|
{
|
||||||
|
EndPlacement(true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return base.OnMouseDown(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void UpdatePosition(SnapResult snapResult)
|
||||||
|
{
|
||||||
|
piece.Position = ToLocalSpace(snapResult.ScreenSpacePosition);
|
||||||
|
base.UpdatePosition(snapResult);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class HitPiece : CompositeDrawable
|
||||||
|
{
|
||||||
|
public HitPiece()
|
||||||
|
{
|
||||||
|
Origin = Anchor.Centre;
|
||||||
|
|
||||||
|
InternalChild = new CircularContainer
|
||||||
|
{
|
||||||
|
Masking = true,
|
||||||
|
BorderThickness = 10,
|
||||||
|
BorderColour = Color4.Yellow,
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new Box
|
||||||
|
{
|
||||||
|
AlwaysPresent = true,
|
||||||
|
Alpha = 0,
|
||||||
|
RelativeSizeAxes = Axes.Both
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user