1
0
mirror of https://github.com/ppy/osu.git synced 2025-02-21 18:02:56 +08:00

Move placement movement event to BlueprintContainer

This commit is contained in:
smoogipoo 2019-10-03 16:14:42 +09:00
parent cbdf42cd7b
commit 652acac87f
7 changed files with 48 additions and 40 deletions

View File

@ -3,7 +3,6 @@
using System; using System;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Input.Events;
using osu.Game.Rulesets.Mania.Edit.Blueprints.Components; using osu.Game.Rulesets.Mania.Edit.Blueprints.Components;
using osu.Game.Rulesets.Mania.Objects; using osu.Game.Rulesets.Mania.Objects;
using osuTK; using osuTK;
@ -49,13 +48,13 @@ namespace osu.Game.Rulesets.Mania.Edit.Blueprints
private double originalStartTime; private double originalStartTime;
protected override bool OnMouseMove(MouseMoveEvent e) public override void UpdatePosition(Vector2 screenSpacePosition)
{ {
base.OnMouseMove(e); base.UpdatePosition(screenSpacePosition);
if (PlacementBegun) if (PlacementBegun)
{ {
var endTime = TimeAt(e.ScreenSpaceMousePosition); var endTime = TimeAt(screenSpacePosition);
HitObject.StartTime = endTime < originalStartTime ? endTime : originalStartTime; HitObject.StartTime = endTime < originalStartTime ? endTime : originalStartTime;
HitObject.Duration = Math.Abs(endTime - originalStartTime); HitObject.Duration = Math.Abs(endTime - originalStartTime);
@ -65,10 +64,8 @@ namespace osu.Game.Rulesets.Mania.Edit.Blueprints
headPiece.Width = tailPiece.Width = SnappedWidth; headPiece.Width = tailPiece.Width = SnappedWidth;
headPiece.X = tailPiece.X = SnappedMousePosition.X; headPiece.X = tailPiece.X = SnappedMousePosition.X;
originalStartTime = HitObject.StartTime = TimeAt(e.ScreenSpaceMousePosition); originalStartTime = HitObject.StartTime = TimeAt(screenSpacePosition);
} }
return true;
} }
} }
} }

View File

@ -62,19 +62,18 @@ namespace osu.Game.Rulesets.Mania.Edit.Blueprints
return base.OnMouseUp(e); return base.OnMouseUp(e);
} }
protected override bool OnMouseMove(MouseMoveEvent e) public override void UpdatePosition(Vector2 screenSpacePosition)
{ {
if (!PlacementBegun) if (!PlacementBegun)
Column = ColumnAt(e.ScreenSpaceMousePosition); Column = ColumnAt(screenSpacePosition);
if (Column == null) return false; if (Column == null) return;
SnappedWidth = Column.DrawWidth; SnappedWidth = Column.DrawWidth;
// Snap to the column // Snap to the column
var parentPos = Parent.ToLocalSpace(Column.ToScreenSpace(new Vector2(Column.DrawWidth / 2, 0))); var parentPos = Parent.ToLocalSpace(Column.ToScreenSpace(new Vector2(Column.DrawWidth / 2, 0)));
SnappedMousePosition = new Vector2(parentPos.X, e.MousePosition.Y); SnappedMousePosition = new Vector2(parentPos.X, Parent.ToLocalSpace(screenSpacePosition).Y);
return true;
} }
protected double TimeAt(Vector2 screenSpacePosition) protected double TimeAt(Vector2 screenSpacePosition)

View File

@ -19,14 +19,6 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.HitCircles
InternalChild = new HitCirclePiece(HitObject); InternalChild = new HitCirclePiece(HitObject);
} }
protected override void LoadComplete()
{
base.LoadComplete();
// Fixes a 1-frame position discrepancy due to the first mouse move event happening in the next frame
HitObject.Position = Parent?.ToLocalSpace(GetContainingInputManager().CurrentState.Mouse.Position) ?? Vector2.Zero;
}
protected override bool OnClick(ClickEvent e) protected override bool OnClick(ClickEvent e)
{ {
HitObject.StartTime = EditorClock.CurrentTime; HitObject.StartTime = EditorClock.CurrentTime;
@ -34,10 +26,9 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.HitCircles
return true; return true;
} }
protected override bool OnMouseMove(MouseMoveEvent e) public override void UpdatePosition(Vector2 screenSpacePosition)
{ {
HitObject.Position = e.MousePosition; HitObject.Position = ToLocalSpace(screenSpacePosition);
return true;
} }
} }
} }

View File

@ -47,28 +47,18 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders
setState(PlacementState.Initial); setState(PlacementState.Initial);
} }
protected override void LoadComplete() public override void UpdatePosition(Vector2 screenSpacePosition)
{
base.LoadComplete();
// Fixes a 1-frame position discrepancy due to the first mouse move event happening in the next frame
HitObject.Position = Parent?.ToLocalSpace(GetContainingInputManager().CurrentState.Mouse.Position) ?? Vector2.Zero;
}
protected override bool OnMouseMove(MouseMoveEvent e)
{ {
switch (state) switch (state)
{ {
case PlacementState.Initial: case PlacementState.Initial:
HitObject.Position = e.MousePosition; HitObject.Position = ToLocalSpace(screenSpacePosition);
return true; break;
case PlacementState.Body: case PlacementState.Body:
cursor = e.MousePosition - HitObject.Position; cursor = ToLocalSpace(screenSpacePosition) - HitObject.Position;
return true; break;
} }
return false;
} }
protected override bool OnClick(ClickEvent e) protected override bool OnClick(ClickEvent e)

View File

@ -7,6 +7,7 @@ using osu.Game.Rulesets.Edit;
using osu.Game.Rulesets.Osu.Edit.Blueprints.Spinners.Components; using osu.Game.Rulesets.Osu.Edit.Blueprints.Spinners.Components;
using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Osu.Objects;
using osu.Game.Rulesets.Osu.UI; using osu.Game.Rulesets.Osu.UI;
using osuTK;
namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Spinners namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Spinners
{ {
@ -43,5 +44,9 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Spinners
return true; return true;
} }
public override void UpdatePosition(Vector2 screenSpacePosition)
{
}
} }
} }

View File

@ -108,6 +108,12 @@ namespace osu.Game.Rulesets.Edit
placementHandler.EndPlacement(HitObject); placementHandler.EndPlacement(HitObject);
} }
/// <summary>
/// Updates the position of this <see cref="PlacementBlueprint"/> to a new screen-space position.
/// </summary>
/// <param name="screenSpacePosition">The screen-space position.</param>
public abstract void UpdatePosition(Vector2 screenSpacePosition);
/// <summary> /// <summary>
/// Invokes <see cref="Objects.HitObject.ApplyDefaults(ControlPointInfo,BeatmapDifficulty)"/>, /// Invokes <see cref="Objects.HitObject.ApplyDefaults(ControlPointInfo,BeatmapDifficulty)"/>,
/// refreshing <see cref="Objects.HitObject.NestedHitObjects"/> and parameters for the <see cref="HitObject"/>. /// refreshing <see cref="Objects.HitObject.NestedHitObjects"/> and parameters for the <see cref="HitObject"/>.
@ -125,7 +131,7 @@ namespace osu.Game.Rulesets.Edit
case ScrollEvent _: case ScrollEvent _:
return false; return false;
case MouseEvent _: case MouseButtonEvent _:
return true; return true;
default: default:

View File

@ -7,6 +7,7 @@ using osu.Framework.Allocation;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Primitives;
using osu.Framework.Input;
using osu.Framework.Input.Events; using osu.Framework.Input.Events;
using osu.Framework.Input.States; using osu.Framework.Input.States;
using osu.Game.Rulesets.Edit; using osu.Game.Rulesets.Edit;
@ -22,8 +23,8 @@ namespace osu.Game.Screens.Edit.Compose.Components
private Container<PlacementBlueprint> placementBlueprintContainer; private Container<PlacementBlueprint> placementBlueprintContainer;
private PlacementBlueprint currentPlacement; private PlacementBlueprint currentPlacement;
private SelectionHandler selectionHandler; private SelectionHandler selectionHandler;
private InputManager inputManager;
private IEnumerable<SelectionBlueprint> selections => selectionBlueprints.Children.Where(c => c.IsAlive); private IEnumerable<SelectionBlueprint> selections => selectionBlueprints.Children.Where(c => c.IsAlive);
@ -66,6 +67,8 @@ namespace osu.Game.Screens.Edit.Compose.Components
beatmap.HitObjectAdded += addBlueprintFor; beatmap.HitObjectAdded += addBlueprintFor;
beatmap.HitObjectRemoved += removeBlueprintFor; beatmap.HitObjectRemoved += removeBlueprintFor;
inputManager = GetContainingInputManager();
} }
private HitObjectCompositionTool currentTool; private HitObjectCompositionTool currentTool;
@ -136,6 +139,17 @@ namespace osu.Game.Screens.Edit.Compose.Components
return true; return true;
} }
protected override bool OnMouseMove(MouseMoveEvent e)
{
if (currentPlacement != null)
{
currentPlacement.UpdatePosition(e.ScreenSpaceMousePosition);
return true;
}
return base.OnMouseMove(e);
}
protected override void Update() protected override void Update()
{ {
base.Update(); base.Update();
@ -158,8 +172,14 @@ namespace osu.Game.Screens.Edit.Compose.Components
currentPlacement = null; currentPlacement = null;
var blueprint = CurrentTool?.CreatePlacementBlueprint(); var blueprint = CurrentTool?.CreatePlacementBlueprint();
if (blueprint != null) if (blueprint != null)
{
placementBlueprintContainer.Child = currentPlacement = blueprint; placementBlueprintContainer.Child = currentPlacement = blueprint;
// Fixes a 1-frame position discrepancy due to the first mouse move event happening in the next frame
blueprint.UpdatePosition(inputManager.CurrentState.Mouse.Position);
}
} }
/// <summary> /// <summary>