mirror of
https://github.com/ppy/osu.git
synced 2024-12-15 00:43:21 +08:00
Reduce implementation overhead in actually positioning hitobjects and making them scroll.
This commit is contained in:
parent
068dfcb19a
commit
a3efca9c35
@ -31,7 +31,6 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
public TestCaseScrollingHitObjects()
|
public TestCaseScrollingHitObjects()
|
||||||
{
|
{
|
||||||
OsuSpriteText timeRangeText;
|
OsuSpriteText timeRangeText;
|
||||||
ScrollingPlayfield<HitObject, Judgement>.ScrollingHitObjectContainer scrollingHitObjectContainer;
|
|
||||||
|
|
||||||
timeRangeBindable = new BindableDouble(2000)
|
timeRangeBindable = new BindableDouble(2000)
|
||||||
{
|
{
|
||||||
@ -71,12 +70,6 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Alpha = 0.25f
|
Alpha = 0.25f
|
||||||
},
|
},
|
||||||
scrollingHitObjectContainer = new ScrollingPlayfield<HitObject, Judgement>.ScrollingHitObjectContainer(Axes.Y)
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
VisibleTimeRange = timeRangeBindable,
|
|
||||||
Masking = true,
|
|
||||||
},
|
|
||||||
new OsuSpriteText
|
new OsuSpriteText
|
||||||
{
|
{
|
||||||
Text = "t minus 0",
|
Text = "t minus 0",
|
||||||
@ -111,17 +104,12 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
});
|
});
|
||||||
|
|
||||||
timeRangeBindable.TriggerChange();
|
timeRangeBindable.TriggerChange();
|
||||||
|
|
||||||
scrollingHitObjectContainer.AddSpeedAdjustment(new TestSpeedAdjustmentContainer(new MultiplierControlPoint()));
|
|
||||||
|
|
||||||
AddStep("Add hit object", () => scrollingHitObjectContainer.Add(new TestDrawableHitObject(new HitObject { StartTime = Time.Current + 2000 })));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Update()
|
protected override void Update()
|
||||||
{
|
{
|
||||||
base.Update();
|
base.Update();
|
||||||
|
|
||||||
topTime.Text = Time.Current.ToString("#,#");
|
|
||||||
bottomTime.Text = (Time.Current + timeRangeBindable.Value).ToString("#,#");
|
bottomTime.Text = (Time.Current + timeRangeBindable.Value).ToString("#,#");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -154,13 +142,11 @@ namespace osu.Desktop.Tests.Visual
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class TestDrawableHitObject : DrawableHitObject<HitObject, Judgement>, IScrollingHitObject
|
private class TestDrawableHitObject : DrawableScrollingHitObject<HitObject, Judgement>
|
||||||
{
|
{
|
||||||
private readonly Box background;
|
private readonly Box background;
|
||||||
private const float height = 14;
|
private const float height = 14;
|
||||||
|
|
||||||
public BindableDouble LifetimeOffset { get; } = new BindableDouble();
|
|
||||||
|
|
||||||
public TestDrawableHitObject(HitObject hitObject)
|
public TestDrawableHitObject(HitObject hitObject)
|
||||||
: base(hitObject)
|
: base(hitObject)
|
||||||
{
|
{
|
||||||
|
@ -27,9 +27,6 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
|||||||
|
|
||||||
if (key != null)
|
if (key != null)
|
||||||
Key.BindTo(key);
|
Key.BindTo(key);
|
||||||
|
|
||||||
RelativePositionAxes = Axes.Y;
|
|
||||||
Y = (float)HitObject.StartTime;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Color4 AccentColour
|
public override Color4 AccentColour
|
||||||
|
@ -192,8 +192,6 @@ namespace osu.Game.Rulesets.Mania.UI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Add(SpeedAdjustmentContainer speedAdjustment) => HitObjects.AddSpeedAdjustment(speedAdjustment);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Adds a DrawableHitObject to this Playfield.
|
/// Adds a DrawableHitObject to this Playfield.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using osu.Framework.Configuration;
|
using osu.Framework.Configuration;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
using osu.Game.Rulesets.Judgements;
|
using osu.Game.Rulesets.Judgements;
|
||||||
using osu.Game.Rulesets.Objects.Types;
|
using osu.Game.Rulesets.Objects.Types;
|
||||||
|
|
||||||
@ -17,6 +18,19 @@ namespace osu.Game.Rulesets.Objects.Drawables
|
|||||||
{
|
{
|
||||||
public BindableDouble LifetimeOffset { get; } = new BindableDouble();
|
public BindableDouble LifetimeOffset { get; } = new BindableDouble();
|
||||||
|
|
||||||
|
Axes IScrollingHitObject.ScrollingAxes
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
RelativePositionAxes = value;
|
||||||
|
|
||||||
|
if ((value & Axes.X) > 0)
|
||||||
|
X = (float)HitObject.StartTime;
|
||||||
|
if ((value & Axes.Y) > 0)
|
||||||
|
Y = (float)HitObject.StartTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected DrawableScrollingHitObject(TObject hitObject)
|
protected DrawableScrollingHitObject(TObject hitObject)
|
||||||
: base(hitObject)
|
: base(hitObject)
|
||||||
{
|
{
|
||||||
|
@ -9,7 +9,7 @@ namespace osu.Game.Rulesets.Objects.Drawables
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// An interface that exposes properties required for scrolling hit objects to be properly displayed.
|
/// An interface that exposes properties required for scrolling hit objects to be properly displayed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IScrollingHitObject : IDrawable
|
internal interface IScrollingHitObject : IDrawable
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Time offset before the hit object start time at which this <see cref="IScrollingHitObject"/> becomes visible and the time offset
|
/// Time offset before the hit object start time at which this <see cref="IScrollingHitObject"/> becomes visible and the time offset
|
||||||
@ -21,5 +21,11 @@ namespace osu.Game.Rulesets.Objects.Drawables
|
|||||||
/// </para>
|
/// </para>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
BindableDouble LifetimeOffset { get; }
|
BindableDouble LifetimeOffset { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Axes which this <see cref="IScrollingHitObject"/> will scroll through.
|
||||||
|
/// This is set by the container which this scrolls through.
|
||||||
|
/// </summary>
|
||||||
|
Axes ScrollingAxes { set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -53,6 +53,8 @@ namespace osu.Game.Rulesets.Timing
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
internal MultiplierControlPoint ControlPoint;
|
internal MultiplierControlPoint ControlPoint;
|
||||||
|
|
||||||
|
private Cached<double> durationBacking;
|
||||||
|
|
||||||
protected override int Compare(Drawable x, Drawable y)
|
protected override int Compare(Drawable x, Drawable y)
|
||||||
{
|
{
|
||||||
var xHitObject = x as DrawableHitObject;
|
var xHitObject = x as DrawableHitObject;
|
||||||
@ -93,8 +95,6 @@ namespace osu.Game.Rulesets.Timing
|
|||||||
base.InvalidateFromChild(invalidation);
|
base.InvalidateFromChild(invalidation);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Cached<double> durationBacking;
|
|
||||||
|
|
||||||
private double computeDuration()
|
private double computeDuration()
|
||||||
{
|
{
|
||||||
if (!Children.Any())
|
if (!Children.Any())
|
||||||
|
@ -37,7 +37,6 @@ namespace osu.Game.Rulesets.Timing
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Axes which the content of this container will scroll through.
|
/// Axes which the content of this container will scroll through.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
|
||||||
public Axes ScrollingAxes { get; internal set; }
|
public Axes ScrollingAxes { get; internal set; }
|
||||||
|
|
||||||
public readonly MultiplierControlPoint ControlPoint;
|
public readonly MultiplierControlPoint ControlPoint;
|
||||||
@ -83,7 +82,12 @@ namespace osu.Game.Rulesets.Timing
|
|||||||
public override void Add(DrawableHitObject drawable)
|
public override void Add(DrawableHitObject drawable)
|
||||||
{
|
{
|
||||||
var scrollingHitObject = drawable as IScrollingHitObject;
|
var scrollingHitObject = drawable as IScrollingHitObject;
|
||||||
scrollingHitObject?.LifetimeOffset.BindTo(VisibleTimeRange);
|
|
||||||
|
if (scrollingHitObject != null)
|
||||||
|
{
|
||||||
|
scrollingHitObject.LifetimeOffset.BindTo(VisibleTimeRange);
|
||||||
|
scrollingHitObject.ScrollingAxes = ScrollingAxes;
|
||||||
|
}
|
||||||
|
|
||||||
base.Add(drawable);
|
base.Add(drawable);
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ namespace osu.Game.Rulesets.UI
|
|||||||
set { visibleTimeRange.BindTo(value); }
|
set { visibleTimeRange.BindTo(value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public new readonly ScrollingHitObjectContainer HitObjects;
|
internal new readonly ScrollingHitObjectContainer HitObjects;
|
||||||
|
|
||||||
protected ScrollingPlayfield(Axes scrollingAxes, float? customWidth = null)
|
protected ScrollingPlayfield(Axes scrollingAxes, float? customWidth = null)
|
||||||
: base(customWidth)
|
: base(customWidth)
|
||||||
@ -112,7 +112,7 @@ namespace osu.Game.Rulesets.UI
|
|||||||
/// necessary <see cref="VisibleTimeRange"/> for the contained <see cref="SpeedAdjustmentContainer"/>s.
|
/// necessary <see cref="VisibleTimeRange"/> for the contained <see cref="SpeedAdjustmentContainer"/>s.
|
||||||
/// </para>
|
/// </para>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ScrollingHitObjectContainer : HitObjectContainer<DrawableHitObject<TObject, TJudgement>>
|
internal class ScrollingHitObjectContainer : HitObjectContainer<DrawableHitObject<TObject, TJudgement>>
|
||||||
{
|
{
|
||||||
private readonly BindableDouble visibleTimeRange = new BindableDouble { Default = 1000 };
|
private readonly BindableDouble visibleTimeRange = new BindableDouble { Default = 1000 };
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
Loading…
Reference in New Issue
Block a user