mirror of
https://github.com/ppy/osu.git
synced 2025-01-14 04:02:59 +08:00
Add timeline beat display
This commit is contained in:
parent
e24c4ab901
commit
084fa2f04a
@ -0,0 +1,32 @@
|
|||||||
|
// 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 NUnit.Framework;
|
||||||
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Game.Screens.Edit.Compose.Components;
|
||||||
|
using osu.Game.Screens.Edit.Compose.Components.Timeline;
|
||||||
|
using osuTK;
|
||||||
|
|
||||||
|
namespace osu.Game.Tests.Visual.Editor
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class TestSceneTimelineBeatLineDisplay : TimelineTestScene
|
||||||
|
{
|
||||||
|
public override Drawable CreateTestComponent() => new TimelineBeatLineDisplay();
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load()
|
||||||
|
{
|
||||||
|
BeatDivisor.Value = 4;
|
||||||
|
|
||||||
|
Add(new BeatDivisorControl(BeatDivisor)
|
||||||
|
{
|
||||||
|
Anchor = Anchor.TopRight,
|
||||||
|
Origin = Anchor.TopRight,
|
||||||
|
Margin = new MarginPadding(30),
|
||||||
|
Size = new Vector2(90)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -12,7 +12,7 @@ namespace osu.Game.Screens.Edit.Components.Timelines.Summary.Visualisations
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class PointVisualisation : Box
|
public class PointVisualisation : Box
|
||||||
{
|
{
|
||||||
protected PointVisualisation(double startTime)
|
public PointVisualisation(double startTime)
|
||||||
{
|
{
|
||||||
Origin = Anchor.TopCentre;
|
Origin = Anchor.TopCentre;
|
||||||
|
|
||||||
|
@ -0,0 +1,90 @@
|
|||||||
|
// 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.Linq;
|
||||||
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Bindables;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
using osu.Game.Screens.Edit.Components.Timelines.Summary.Parts;
|
||||||
|
using osu.Game.Screens.Edit.Components.Timelines.Summary.Visualisations;
|
||||||
|
|
||||||
|
namespace osu.Game.Screens.Edit.Compose.Components.Timeline
|
||||||
|
{
|
||||||
|
public class TimelineBeatLineDisplay : TimelinePart
|
||||||
|
{
|
||||||
|
[Resolved]
|
||||||
|
private EditorBeatmap beatmap { get; set; }
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private Bindable<WorkingBeatmap> working { get; set; }
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private BindableBeatDivisor beatDivisor { get; set; }
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private OsuColour colours { get; set; }
|
||||||
|
|
||||||
|
public TimelineBeatLineDisplay()
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both;
|
||||||
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load()
|
||||||
|
{
|
||||||
|
beatDivisor.BindValueChanged(_ => createLines(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createLines()
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
|
||||||
|
for (var i = 0; i < beatmap.ControlPointInfo.TimingPoints.Count; i++)
|
||||||
|
{
|
||||||
|
var point = beatmap.ControlPointInfo.TimingPoints[i];
|
||||||
|
var until = beatmap.ControlPointInfo.TimingPoints.Count < i + 1 ? beatmap.ControlPointInfo.TimingPoints[i + 1].Time : working.Value.Track.Length;
|
||||||
|
|
||||||
|
int beat = 0;
|
||||||
|
|
||||||
|
for (double t = point.Time; t < until; t += point.BeatLength / beatDivisor.Value)
|
||||||
|
{
|
||||||
|
var indexInBeat = beat % beatDivisor.Value;
|
||||||
|
|
||||||
|
if (indexInBeat == 0)
|
||||||
|
{
|
||||||
|
Add(new PointVisualisation(t)
|
||||||
|
{
|
||||||
|
Colour = BindableBeatDivisor.GetColourFor(1, colours),
|
||||||
|
Anchor = Anchor.BottomLeft,
|
||||||
|
Origin = Anchor.BottomLeft,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var divisor = BindableBeatDivisor.GetDivisorForBeatIndex(beat, beatDivisor.Value);
|
||||||
|
var colour = BindableBeatDivisor.GetColourFor(divisor, colours);
|
||||||
|
var height = 0.1f - (float)divisor / BindableBeatDivisor.VALID_DIVISORS.Last() * 0.08f;
|
||||||
|
|
||||||
|
Add(new PointVisualisation(t)
|
||||||
|
{
|
||||||
|
Colour = colour,
|
||||||
|
Height = height,
|
||||||
|
});
|
||||||
|
|
||||||
|
Add(new PointVisualisation(t)
|
||||||
|
{
|
||||||
|
Colour = colour,
|
||||||
|
Anchor = Anchor.BottomLeft,
|
||||||
|
Origin = Anchor.BottomLeft,
|
||||||
|
Height = height,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
beat++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -102,7 +102,11 @@ namespace osu.Game.Screens.Edit
|
|||||||
LoadComponentAsync(new TimelineArea
|
LoadComponentAsync(new TimelineArea
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Child = CreateTimelineContent()
|
Children = new[]
|
||||||
|
{
|
||||||
|
new TimelineBeatLineDisplay(),
|
||||||
|
CreateTimelineContent(),
|
||||||
|
}
|
||||||
}, timelineContainer.Add);
|
}, timelineContainer.Add);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user