mirror of https://github.com/ppy/osu
Always track final follow circle size
This commit is contained in:
parent
043aa82a31
commit
ede5ca31a1
|
@ -30,9 +30,6 @@ public class OsuModClassic : ModClassic, IApplicableToHitObject, IApplicableToDr
|
|||
[SettingSource("Apply classic note lock", "Applies note lock to the full hit window.")]
|
||||
public Bindable<bool> ClassicNoteLock { get; } = new BindableBool(true);
|
||||
|
||||
[SettingSource("Use fixed slider follow circle hit area", "Makes the slider follow circle track its final size at all times.")]
|
||||
public Bindable<bool> FixedFollowCircleHitArea { get; } = new BindableBool(true);
|
||||
|
||||
[SettingSource("Always play a slider's tail sample", "Always plays a slider's tail sample regardless of whether it was hit or not.")]
|
||||
public Bindable<bool> AlwaysPlayTailSample { get; } = new BindableBool(true);
|
||||
|
||||
|
@ -62,10 +59,6 @@ public void ApplyToDrawableHitObject(DrawableHitObject obj)
|
|||
{
|
||||
switch (obj)
|
||||
{
|
||||
case DrawableSlider slider:
|
||||
slider.Ball.InputTracksVisualSize = !FixedFollowCircleHitArea.Value;
|
||||
break;
|
||||
|
||||
case DrawableSliderHead head:
|
||||
head.TrackFollowCircle = !NoSliderHeadMovement.Value;
|
||||
break;
|
||||
|
|
|
@ -34,13 +34,8 @@ public Color4 AccentColour
|
|||
set => ball.Colour = value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Whether to track accurately to the visual size of this <see cref="SliderBall"/>.
|
||||
/// If <c>false</c>, tracking will be performed at the final scale at all times.
|
||||
/// </summary>
|
||||
public bool InputTracksVisualSize = true;
|
||||
|
||||
private readonly Drawable followCircle;
|
||||
private readonly Drawable fullSizeFollowCircle;
|
||||
private readonly DrawableSlider drawableSlider;
|
||||
private readonly Drawable ball;
|
||||
|
||||
|
@ -62,6 +57,13 @@ public SliderBall(DrawableSlider drawableSlider)
|
|||
Alpha = 0,
|
||||
Child = new SkinnableDrawable(new OsuSkinComponent(OsuSkinComponents.SliderFollowCircle), _ => new DefaultFollowCircle()),
|
||||
},
|
||||
fullSizeFollowCircle = new CircularContainer
|
||||
{
|
||||
Origin = Anchor.Centre,
|
||||
Anchor = Anchor.Centre,
|
||||
RelativeSizeAxes = Axes.Both,
|
||||
Masking = true
|
||||
},
|
||||
ball = new SkinnableDrawable(new OsuSkinComponent(OsuSkinComponents.SliderBall), _ => new DefaultSliderBall())
|
||||
{
|
||||
Anchor = Anchor.Centre,
|
||||
|
@ -104,14 +106,9 @@ private set
|
|||
|
||||
tracking = value;
|
||||
|
||||
if (InputTracksVisualSize)
|
||||
followCircle.ScaleTo(tracking ? 2.4f : 1f, 300, Easing.OutQuint);
|
||||
else
|
||||
{
|
||||
// We need to always be tracking the final size, at both endpoints. For now, this is achieved by removing the scale duration.
|
||||
followCircle.ScaleTo(tracking ? 2.4f : 1f);
|
||||
}
|
||||
fullSizeFollowCircle.Scale = new Vector2(tracking ? 2.4f : 1f);
|
||||
|
||||
followCircle.ScaleTo(tracking ? 2.4f : 1f, 300, Easing.OutQuint);
|
||||
followCircle.FadeTo(tracking ? 1f : 0, 300, Easing.OutQuint);
|
||||
}
|
||||
}
|
||||
|
@ -170,7 +167,7 @@ protected override void Update()
|
|||
// in valid time range
|
||||
Time.Current >= drawableSlider.HitObject.StartTime && Time.Current < drawableSlider.HitObject.EndTime &&
|
||||
// in valid position range
|
||||
lastScreenSpaceMousePosition.HasValue && followCircle.ReceivePositionalInputAt(lastScreenSpaceMousePosition.Value) &&
|
||||
lastScreenSpaceMousePosition.HasValue && fullSizeFollowCircle.ReceivePositionalInputAt(lastScreenSpaceMousePosition.Value) &&
|
||||
// valid action
|
||||
(actions?.Any(isValidTrackingAction) ?? false);
|
||||
|
||||
|
|
Loading…
Reference in New Issue