mirror of
https://github.com/ppy/osu.git
synced 2025-03-11 16:47:46 +08:00
Separate classes
This commit is contained in:
parent
c1f56cd0ba
commit
7bd75eca81
@ -272,7 +272,7 @@ namespace osu.Game.Rulesets.Osu.Tests
|
|||||||
|
|
||||||
private DrawableOsuHitObject getObject(int index) => hitObjectContainer[index];
|
private DrawableOsuHitObject getObject(int index) => hitObjectContainer[index];
|
||||||
|
|
||||||
private FollowPointRenderer.FollowPointLifetimeEntry getEntry(int index) => followPointRenderer.Entries[index];
|
private FollowPointLifetimeEntry getEntry(int index) => followPointRenderer.Entries[index];
|
||||||
|
|
||||||
private FollowPointConnection getGroup(int index) => followPointRenderer.ChildrenOfType<FollowPointConnection>().Single(c => c.Entry == getEntry(index));
|
private FollowPointConnection getGroup(int index) => followPointRenderer.ChildrenOfType<FollowPointConnection>().Single(c => c.Entry == getEntry(index));
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Connections
|
|||||||
public const int SPACING = 32;
|
public const int SPACING = 32;
|
||||||
public const double PREEMPT = 800;
|
public const double PREEMPT = 800;
|
||||||
|
|
||||||
public FollowPointRenderer.FollowPointLifetimeEntry Entry;
|
public FollowPointLifetimeEntry Entry;
|
||||||
public DrawablePool<FollowPoint> Pool;
|
public DrawablePool<FollowPoint> Pool;
|
||||||
|
|
||||||
protected override void PrepareForUse()
|
protected override void PrepareForUse()
|
||||||
|
@ -0,0 +1,98 @@
|
|||||||
|
// 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.Bindables;
|
||||||
|
using osu.Framework.Graphics.Performance;
|
||||||
|
using osu.Game.Rulesets.Objects;
|
||||||
|
using osuTK;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Osu.Objects.Drawables.Connections
|
||||||
|
{
|
||||||
|
public class FollowPointLifetimeEntry : LifetimeEntry
|
||||||
|
{
|
||||||
|
public event Action Invalidated;
|
||||||
|
public readonly OsuHitObject Start;
|
||||||
|
|
||||||
|
public FollowPointLifetimeEntry(OsuHitObject start)
|
||||||
|
{
|
||||||
|
Start = start;
|
||||||
|
LifetimeStart = Start.StartTime;
|
||||||
|
|
||||||
|
bindEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
private OsuHitObject end;
|
||||||
|
|
||||||
|
public OsuHitObject End
|
||||||
|
{
|
||||||
|
get => end;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
UnbindEvents();
|
||||||
|
|
||||||
|
end = value;
|
||||||
|
|
||||||
|
bindEvents();
|
||||||
|
|
||||||
|
refreshLifetimes();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void bindEvents()
|
||||||
|
{
|
||||||
|
UnbindEvents();
|
||||||
|
|
||||||
|
// Note: Positions are bound for instantaneous feedback from positional changes from the editor, before ApplyDefaults() is called on hitobjects.
|
||||||
|
Start.DefaultsApplied += onDefaultsApplied;
|
||||||
|
Start.PositionBindable.ValueChanged += onPositionChanged;
|
||||||
|
|
||||||
|
if (End != null)
|
||||||
|
{
|
||||||
|
End.DefaultsApplied += onDefaultsApplied;
|
||||||
|
End.PositionBindable.ValueChanged += onPositionChanged;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UnbindEvents()
|
||||||
|
{
|
||||||
|
if (Start != null)
|
||||||
|
{
|
||||||
|
Start.DefaultsApplied -= onDefaultsApplied;
|
||||||
|
Start.PositionBindable.ValueChanged -= onPositionChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (End != null)
|
||||||
|
{
|
||||||
|
End.DefaultsApplied -= onDefaultsApplied;
|
||||||
|
End.PositionBindable.ValueChanged -= onPositionChanged;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onDefaultsApplied(HitObject obj) => refreshLifetimes();
|
||||||
|
|
||||||
|
private void onPositionChanged(ValueChangedEvent<Vector2> obj) => refreshLifetimes();
|
||||||
|
|
||||||
|
private void refreshLifetimes()
|
||||||
|
{
|
||||||
|
if (End == null || End.NewCombo || Start is Spinner || End is Spinner)
|
||||||
|
{
|
||||||
|
LifetimeEnd = LifetimeStart;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2 startPosition = Start.StackedEndPosition;
|
||||||
|
Vector2 endPosition = End.StackedPosition;
|
||||||
|
Vector2 distanceVector = endPosition - startPosition;
|
||||||
|
|
||||||
|
// The lifetime start will match the fade-in time of the first follow point.
|
||||||
|
float fraction = (int)(FollowPointConnection.SPACING * 1.5) / distanceVector.Length;
|
||||||
|
FollowPointConnection.GetFadeTimes(Start, End, fraction, out var fadeInTime, out _);
|
||||||
|
|
||||||
|
LifetimeStart = fadeInTime;
|
||||||
|
LifetimeEnd = double.MaxValue; // This will be set by the connection.
|
||||||
|
|
||||||
|
Invalidated?.Invoke();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,6 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
@ -11,7 +10,6 @@ using osu.Framework.Graphics.Containers;
|
|||||||
using osu.Framework.Graphics.Performance;
|
using osu.Framework.Graphics.Performance;
|
||||||
using osu.Framework.Graphics.Pooling;
|
using osu.Framework.Graphics.Pooling;
|
||||||
using osu.Game.Rulesets.Objects;
|
using osu.Game.Rulesets.Objects;
|
||||||
using osuTK;
|
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Osu.Objects.Drawables.Connections
|
namespace osu.Game.Rulesets.Osu.Objects.Drawables.Connections
|
||||||
{
|
{
|
||||||
@ -184,92 +182,5 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Connections
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class FollowPointLifetimeEntry : LifetimeEntry
|
|
||||||
{
|
|
||||||
public event Action Invalidated;
|
|
||||||
public readonly OsuHitObject Start;
|
|
||||||
|
|
||||||
public FollowPointLifetimeEntry(OsuHitObject start)
|
|
||||||
{
|
|
||||||
Start = start;
|
|
||||||
LifetimeStart = Start.StartTime;
|
|
||||||
|
|
||||||
bindEvents();
|
|
||||||
}
|
|
||||||
|
|
||||||
private OsuHitObject end;
|
|
||||||
|
|
||||||
public OsuHitObject End
|
|
||||||
{
|
|
||||||
get => end;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
UnbindEvents();
|
|
||||||
|
|
||||||
end = value;
|
|
||||||
|
|
||||||
bindEvents();
|
|
||||||
|
|
||||||
refreshLifetimes();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void bindEvents()
|
|
||||||
{
|
|
||||||
UnbindEvents();
|
|
||||||
|
|
||||||
// Note: Positions are bound for instantaneous feedback from positional changes from the editor, before ApplyDefaults() is called on hitobjects.
|
|
||||||
Start.DefaultsApplied += onDefaultsApplied;
|
|
||||||
Start.PositionBindable.ValueChanged += onPositionChanged;
|
|
||||||
|
|
||||||
if (End != null)
|
|
||||||
{
|
|
||||||
End.DefaultsApplied += onDefaultsApplied;
|
|
||||||
End.PositionBindable.ValueChanged += onPositionChanged;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void UnbindEvents()
|
|
||||||
{
|
|
||||||
if (Start != null)
|
|
||||||
{
|
|
||||||
Start.DefaultsApplied -= onDefaultsApplied;
|
|
||||||
Start.PositionBindable.ValueChanged -= onPositionChanged;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (End != null)
|
|
||||||
{
|
|
||||||
End.DefaultsApplied -= onDefaultsApplied;
|
|
||||||
End.PositionBindable.ValueChanged -= onPositionChanged;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void onDefaultsApplied(HitObject obj) => refreshLifetimes();
|
|
||||||
|
|
||||||
private void onPositionChanged(ValueChangedEvent<Vector2> obj) => refreshLifetimes();
|
|
||||||
|
|
||||||
private void refreshLifetimes()
|
|
||||||
{
|
|
||||||
if (End == null || End.NewCombo || Start is Spinner || End is Spinner)
|
|
||||||
{
|
|
||||||
LifetimeEnd = LifetimeStart;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Vector2 startPosition = Start.StackedEndPosition;
|
|
||||||
Vector2 endPosition = End.StackedPosition;
|
|
||||||
Vector2 distanceVector = endPosition - startPosition;
|
|
||||||
|
|
||||||
// The lifetime start will match the fade-in time of the first follow point.
|
|
||||||
float fraction = (int)(FollowPointConnection.SPACING * 1.5) / distanceVector.Length;
|
|
||||||
FollowPointConnection.GetFadeTimes(Start, End, fraction, out var fadeInTime, out _);
|
|
||||||
|
|
||||||
LifetimeStart = fadeInTime;
|
|
||||||
LifetimeEnd = double.MaxValue; // This will be set by the connection.
|
|
||||||
|
|
||||||
Invalidated?.Invoke();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user