1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-13 11:23:00 +08:00

Implement mania beat snapping support

This commit is contained in:
Dean Herbert 2020-05-20 18:40:55 +09:00
parent ffb8d48fc3
commit 23bf0d000e
3 changed files with 18 additions and 12 deletions

View File

@ -63,7 +63,14 @@ namespace osu.Game.Rulesets.Mania.Edit
drawableRuleset.ScrollingInfo.TimeRange.Value, drawableRuleset.ScrollingInfo.TimeRange.Value,
hoc.DrawHeight); hoc.DrawHeight);
return new SnapResult(screenSpacePosition, targetTime); targetTime = BeatSnapProvider.SnapTime(targetTime);
screenSpacePosition.Y = hoc.ToScreenSpace(
new Vector2(0, drawableRuleset.ScrollingInfo.Algorithm.PositionAt(targetTime, EditorClock.CurrentTime, drawableRuleset.ScrollingInfo.TimeRange.Value,
hoc.DrawHeight))
).Y;
return new SnapResult(screenSpacePosition, BeatSnapProvider.SnapTime(targetTime));
} }
protected override DrawableRuleset<ManiaHitObject> CreateDrawableRuleset(Ruleset ruleset, IBeatmap beatmap, IReadOnlyList<Mod> mods = null) protected override DrawableRuleset<ManiaHitObject> CreateDrawableRuleset(Ruleset ruleset, IBeatmap beatmap, IReadOnlyList<Mod> mods = null)

View File

@ -47,7 +47,7 @@ namespace osu.Game.Rulesets.Edit
private IAdjustableClock adjustableClock { get; set; } private IAdjustableClock adjustableClock { get; set; }
[Resolved] [Resolved]
private IBeatSnapProvider beatSnapProvider { get; set; } protected IBeatSnapProvider BeatSnapProvider { get; private set; }
protected ComposeBlueprintContainer BlueprintContainer { get; private set; } protected ComposeBlueprintContainer BlueprintContainer { get; private set; }
@ -278,27 +278,27 @@ namespace osu.Game.Rulesets.Edit
public override float GetBeatSnapDistanceAt(double referenceTime) public override float GetBeatSnapDistanceAt(double referenceTime)
{ {
DifficultyControlPoint difficultyPoint = EditorBeatmap.ControlPointInfo.DifficultyPointAt(referenceTime); DifficultyControlPoint difficultyPoint = EditorBeatmap.ControlPointInfo.DifficultyPointAt(referenceTime);
return (float)(100 * EditorBeatmap.BeatmapInfo.BaseDifficulty.SliderMultiplier * difficultyPoint.SpeedMultiplier / beatSnapProvider.BeatDivisor); return (float)(100 * EditorBeatmap.BeatmapInfo.BaseDifficulty.SliderMultiplier * difficultyPoint.SpeedMultiplier / BeatSnapProvider.BeatDivisor);
} }
public override float DurationToDistance(double referenceTime, double duration) public override float DurationToDistance(double referenceTime, double duration)
{ {
double beatLength = beatSnapProvider.GetBeatLengthAtTime(referenceTime); double beatLength = BeatSnapProvider.GetBeatLengthAtTime(referenceTime);
return (float)(duration / beatLength * GetBeatSnapDistanceAt(referenceTime)); return (float)(duration / beatLength * GetBeatSnapDistanceAt(referenceTime));
} }
public override double DistanceToDuration(double referenceTime, float distance) public override double DistanceToDuration(double referenceTime, float distance)
{ {
double beatLength = beatSnapProvider.GetBeatLengthAtTime(referenceTime); double beatLength = BeatSnapProvider.GetBeatLengthAtTime(referenceTime);
return distance / GetBeatSnapDistanceAt(referenceTime) * beatLength; return distance / GetBeatSnapDistanceAt(referenceTime) * beatLength;
} }
public override double GetSnappedDurationFromDistance(double referenceTime, float distance) public override double GetSnappedDurationFromDistance(double referenceTime, float distance)
=> beatSnapProvider.SnapTime(referenceTime + DistanceToDuration(referenceTime, distance), referenceTime) - referenceTime; => BeatSnapProvider.SnapTime(referenceTime + DistanceToDuration(referenceTime, distance), referenceTime) - referenceTime;
public override float GetSnappedDistanceFromDistance(double referenceTime, float distance) public override float GetSnappedDistanceFromDistance(double referenceTime, float distance)
{ {
var snappedEndTime = beatSnapProvider.SnapTime(referenceTime + DistanceToDuration(referenceTime, distance), referenceTime); var snappedEndTime = BeatSnapProvider.SnapTime(referenceTime + DistanceToDuration(referenceTime, distance), referenceTime);
return DurationToDistance(referenceTime, snappedEndTime - referenceTime); return DurationToDistance(referenceTime, snappedEndTime - referenceTime);
} }

View File

@ -11,7 +11,6 @@ using osu.Game.Rulesets.Edit;
using osu.Game.Rulesets.Edit.Tools; using osu.Game.Rulesets.Edit.Tools;
using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Objects.Drawables;
using osuTK;
namespace osu.Game.Screens.Edit.Compose.Components namespace osu.Game.Screens.Edit.Compose.Components
{ {
@ -65,9 +64,9 @@ namespace osu.Game.Screens.Edit.Compose.Components
createPlacement(); createPlacement();
} }
private void updatePlacementPosition(Vector2 screenSpacePosition) private void updatePlacementPosition()
{ {
var snapResult = composer.SnapScreenSpacePositionToValidTime(screenSpacePosition); var snapResult = composer.SnapScreenSpacePositionToValidTime(inputManager.CurrentState.Mouse.Position);
currentPlacement.UpdatePosition(snapResult.ScreenSpacePosition); currentPlacement.UpdatePosition(snapResult.ScreenSpacePosition);
} }
@ -84,7 +83,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
removePlacement(); removePlacement();
if (currentPlacement != null) if (currentPlacement != null)
updatePlacementPosition(inputManager.CurrentState.Mouse.Position); updatePlacementPosition();
} }
protected sealed override SelectionBlueprint CreateBlueprintFor(HitObject hitObject) protected sealed override SelectionBlueprint CreateBlueprintFor(HitObject hitObject)
@ -116,7 +115,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
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 // Fixes a 1-frame position discrepancy due to the first mouse move event happening in the next frame
updatePlacementPosition(inputManager.CurrentState.Mouse.Position); updatePlacementPosition();
} }
} }