osu/osu.Game.Rulesets.Catch/UI/CatcherTrail.cs

69 lines
2.3 KiB
C#
Raw Normal View History

// 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.
2020-12-07 09:12:55 +00:00
using osu.Framework.Graphics;
2021-06-16 07:14:42 +00:00
using osu.Framework.Timing;
using osu.Game.Rulesets.Objects.Pooling;
using osuTK;
namespace osu.Game.Rulesets.Catch.UI
{
2021-06-16 05:01:12 +00:00
/// <summary>
/// A trail of the catcher.
/// It also represents a hyper dash afterimage.
/// </summary>
public class CatcherTrail : PoolableDrawableWithLifetime<CatcherTrailEntry>
{
private readonly SkinnableCatcher body;
2020-12-07 09:12:55 +00:00
public CatcherTrail()
2020-12-07 09:12:55 +00:00
{
Size = new Vector2(Catcher.BASE_SIZE);
Origin = Anchor.TopCentre;
2021-06-14 10:46:48 +00:00
Blending = BlendingParameters.Additive;
2021-06-16 07:14:42 +00:00
InternalChild = body = new SkinnableCatcher
{
// Using a frozen clock because trails should not be animated when the skin has an animated catcher.
// TODO: The animation should be frozen at the animation frame at the time of the trail generation.
Clock = new FramedClock(new ManualClock()),
};
}
protected override void OnApply(CatcherTrailEntry entry)
{
Position = new Vector2(entry.Position, 0);
2021-07-30 23:31:08 +00:00
Scale = entry.Scale;
body.AnimationState.Value = entry.CatcherState;
using (BeginAbsoluteSequence(entry.LifetimeStart, false))
applyTransforms(entry.Animation);
}
protected override void OnFree(CatcherTrailEntry entry)
{
2021-07-30 23:31:08 +00:00
ApplyTransformsAt(double.MinValue);
ClearTransforms();
}
private void applyTransforms(CatcherTrailAnimation animation)
{
switch (animation)
{
case CatcherTrailAnimation.Dashing:
case CatcherTrailAnimation.HyperDashing:
this.FadeTo(0.4f).FadeOut(800, Easing.OutQuint);
break;
2021-08-02 06:08:42 +00:00
case CatcherTrailAnimation.HyperDashAfterImage:
this.MoveToOffset(new Vector2(0, -10), 1200, Easing.In);
this.ScaleTo(Scale * 0.95f).ScaleTo(Scale * 1.2f, 1200, Easing.In);
this.FadeOut(1200);
break;
}
Expire();
}
}
}