Merge pull request #18977 from goodtrailer/stable-slider-ball-fadeout

Imitate stable's slider ball fade in/out animation
This commit is contained in:
Dean Herbert 2022-07-02 18:47:31 +09:00 committed by GitHub
commit c07ee80dbe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 41 additions and 4 deletions

View File

@ -1,12 +1,12 @@
// 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.
#nullable disable
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites;
using osu.Game.Rulesets.Objects.Drawables;
using osu.Game.Rulesets.Osu.Objects.Drawables;
using osu.Game.Skinning;
using osuTK.Graphics;
@ -18,8 +18,11 @@ public class LegacySliderBall : CompositeDrawable
private readonly ISkin skin;
private Sprite layerNd;
private Sprite layerSpec;
[Resolved(canBeNull: true)]
private DrawableHitObject? parentObject { get; set; }
private Sprite layerNd = null!;
private Sprite layerSpec = null!;
public LegacySliderBall(Drawable animationContent, ISkin skin)
{
@ -58,6 +61,17 @@ private void load()
};
}
protected override void LoadComplete()
{
base.LoadComplete();
if (parentObject != null)
{
parentObject.ApplyCustomUpdateState += updateStateTransforms;
updateStateTransforms(parentObject, parentObject.State.Value);
}
}
protected override void UpdateAfterChildren()
{
base.UpdateAfterChildren();
@ -68,5 +82,28 @@ protected override void UpdateAfterChildren()
layerNd.Rotation = -appliedRotation;
layerSpec.Rotation = -appliedRotation;
}
private void updateStateTransforms(DrawableHitObject drawableObject, ArmedState _)
{
// Gets called by slider ticks, tails, etc., leading to duplicated
// animations which in this case have no visual impact (due to
// instant fade) but may negatively affect performance
if (drawableObject is not DrawableSlider)
return;
using (BeginAbsoluteSequence(drawableObject.StateUpdateTime))
this.FadeIn();
using (BeginAbsoluteSequence(drawableObject.HitStateUpdateTime))
this.FadeOut();
}
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);
if (parentObject != null)
parentObject.ApplyCustomUpdateState -= updateStateTransforms;
}
}
}