mirror of
https://github.com/ppy/osu.git
synced 2025-01-27 02:32:59 +08:00
Anchor drag box on time (catch, mania)
Not done for taiko because I cannot figure out how it should work with the overlapping scroll algorithm.
This commit is contained in:
parent
cb21126623
commit
6ab29a62d0
@ -5,6 +5,7 @@
|
||||
|
||||
using osu.Game.Rulesets.Catch.Edit.Blueprints;
|
||||
using osu.Game.Rulesets.Catch.Objects;
|
||||
using osu.Game.Rulesets.Catch.UI;
|
||||
using osu.Game.Rulesets.Edit;
|
||||
using osu.Game.Rulesets.Objects;
|
||||
using osu.Game.Screens.Edit.Compose.Components;
|
||||
@ -36,5 +37,7 @@ namespace osu.Game.Rulesets.Catch.Edit
|
||||
|
||||
return base.CreateHitObjectBlueprintFor(hitObject);
|
||||
}
|
||||
|
||||
protected sealed override DragBox CreateDragBox() => new ScrollingDragBox((CatchPlayfield)Composer.Playfield);
|
||||
}
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
using osu.Game.Rulesets.Edit;
|
||||
using osu.Game.Rulesets.Mania.Edit.Blueprints;
|
||||
using osu.Game.Rulesets.Mania.Objects;
|
||||
using osu.Game.Rulesets.Mania.UI;
|
||||
using osu.Game.Rulesets.Objects;
|
||||
using osu.Game.Screens.Edit.Compose.Components;
|
||||
|
||||
@ -33,5 +34,7 @@ namespace osu.Game.Rulesets.Mania.Edit
|
||||
}
|
||||
|
||||
protected override SelectionHandler<HitObject> CreateSelectionHandler() => new ManiaSelectionHandler();
|
||||
|
||||
protected sealed override DragBox CreateDragBox() => new ScrollingDragBox((ManiaPlayfield)Composer.Playfield);
|
||||
}
|
||||
}
|
||||
|
63
osu.Game/Screens/Edit/Compose/Components/ScrollingDragBox.cs
Normal file
63
osu.Game/Screens/Edit/Compose/Components/ScrollingDragBox.cs
Normal file
@ -0,0 +1,63 @@
|
||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||
// See the LICENCE file in the repository root for full licence text.
|
||||
|
||||
using System;
|
||||
using osu.Framework.Input.Events;
|
||||
using osu.Game.Rulesets.UI.Scrolling;
|
||||
|
||||
namespace osu.Game.Screens.Edit.Compose.Components
|
||||
{
|
||||
/// <summary>
|
||||
/// A <see cref="DragBox"/> that scrolls along with the scrolling playfield.
|
||||
/// </summary>
|
||||
public class ScrollingDragBox : DragBox
|
||||
{
|
||||
public double MinTime { get; private set; }
|
||||
|
||||
public double MaxTime { get; private set; }
|
||||
|
||||
private double? startTime;
|
||||
|
||||
private readonly ScrollingPlayfield playfield;
|
||||
|
||||
public ScrollingDragBox(ScrollingPlayfield playfield)
|
||||
{
|
||||
this.playfield = playfield;
|
||||
}
|
||||
|
||||
public override void HandleDrag(MouseButtonEvent e)
|
||||
{
|
||||
base.HandleDrag(e);
|
||||
|
||||
startTime ??= playfield.TimeAtScreenSpacePosition(e.ScreenSpaceMouseDownPosition);
|
||||
double endTime = playfield.TimeAtScreenSpacePosition(e.ScreenSpaceMousePosition);
|
||||
|
||||
MinTime = Math.Min(startTime.Value, endTime);
|
||||
MaxTime = Math.Max(startTime.Value, endTime);
|
||||
|
||||
var startPos = ToLocalSpace(playfield.ScreenSpacePositionAtTime(startTime.Value));
|
||||
var endPos = ToLocalSpace(playfield.ScreenSpacePositionAtTime(endTime));
|
||||
|
||||
switch (playfield.ScrollingInfo.Direction.Value)
|
||||
{
|
||||
case ScrollingDirection.Up:
|
||||
case ScrollingDirection.Down:
|
||||
Box.Y = Math.Min(startPos.Y, endPos.Y);
|
||||
Box.Height = Math.Max(startPos.Y, endPos.Y) - Box.Y;
|
||||
break;
|
||||
|
||||
case ScrollingDirection.Left:
|
||||
case ScrollingDirection.Right:
|
||||
Box.X = Math.Min(startPos.X, endPos.X);
|
||||
Box.Width = Math.Max(startPos.X, endPos.X) - Box.X;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public override void Hide()
|
||||
{
|
||||
base.Hide();
|
||||
startTime = null;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user