Manage catcher trails by lifetime entries

This commit is contained in:
ekrctb
2021-07-29 17:12:01 +09:00
parent c67c763a92
commit 81f23e1111
5 changed files with 133 additions and 40 deletions

View File

@ -2,12 +2,13 @@
// See the LICENCE file in the repository root for full licence text.
using System;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Pooling;
using osu.Game.Rulesets.Catch.Skinning;
using osu.Game.Rulesets.Objects.Pooling;
using osu.Game.Skinning;
using osuTK;
using osuTK.Graphics;
namespace osu.Game.Rulesets.Catch.UI
@ -16,7 +17,7 @@ namespace osu.Game.Rulesets.Catch.UI
/// Represents a component responsible for displaying
/// the appropriate catcher trails when requested to.
/// </summary>
public class CatcherTrailDisplay : SkinReloadableDrawable
public class CatcherTrailDisplay : PooledDrawableWithLifetimeContainer<CatcherTrailEntry, CatcherTrail>
{
/// <summary>
/// The most recent time a dash trail was added to this container.
@ -29,12 +30,17 @@ namespace osu.Game.Rulesets.Catch.UI
public Color4 HyperDashAfterImageColour => hyperDashAfterImages.Colour;
protected override bool RemoveRewoundEntry => true;
private readonly DrawablePool<CatcherTrail> trailPool;
private readonly Container<CatcherTrail> dashTrails;
private readonly Container<CatcherTrail> hyperDashTrails;
private readonly Container<CatcherTrail> hyperDashAfterImages;
[Resolved]
private ISkinSource skin { get; set; }
public CatcherTrailDisplay()
{
RelativeSizeAxes = Axes.Both;
@ -48,50 +54,60 @@ namespace osu.Game.Rulesets.Catch.UI
};
}
protected override void SkinChanged(ISkinSource skin)
protected override void LoadComplete()
{
base.SkinChanged(skin);
base.LoadComplete();
skin.SourceChanged += skinSourceChanged;
skinSourceChanged();
}
private void skinSourceChanged()
{
hyperDashTrails.Colour = skin.GetConfig<CatchSkinColour, Color4>(CatchSkinColour.HyperDash)?.Value ?? Catcher.DEFAULT_HYPER_DASH_COLOUR;
hyperDashAfterImages.Colour = skin.GetConfig<CatchSkinColour, Color4>(CatchSkinColour.HyperDashAfterImage)?.Value ?? hyperDashTrails.Colour;
}
/// <summary>
/// Displays a hyper-dash after-image of the catcher.
/// </summary>
public void DisplayHyperDashAfterImage(CatcherAnimationState animationState, float x, Vector2 scale)
protected override void AddDrawable(CatcherTrailEntry entry, CatcherTrail drawable)
{
var trail = createTrail(animationState, x, scale);
switch (entry.Animation)
{
case CatcherTrailAnimation.Dashing:
dashTrails.Add(drawable);
break;
hyperDashAfterImages.Add(trail);
case CatcherTrailAnimation.HyperDashing:
hyperDashTrails.Add(drawable);
break;
trail.MoveToOffset(new Vector2(0, -10), 1200, Easing.In);
trail.ScaleTo(trail.Scale * 0.95f).ScaleTo(trail.Scale * 1.2f, 1200, Easing.In);
trail.FadeOut(1200);
trail.Expire(true);
case CatcherTrailAnimation.HyperDashAfterimage:
hyperDashAfterImages.Add(drawable);
break;
}
}
public void DisplayDashTrail(CatcherAnimationState animationState, float x, Vector2 scale, bool hyperDashing)
protected override void RemoveDrawable(CatcherTrailEntry entry, CatcherTrail drawable)
{
var trail = createTrail(animationState, x, scale);
switch (entry.Animation)
{
case CatcherTrailAnimation.Dashing:
dashTrails.Remove(drawable);
break;
if (hyperDashing)
hyperDashTrails.Add(trail);
else
dashTrails.Add(trail);
case CatcherTrailAnimation.HyperDashing:
hyperDashTrails.Remove(drawable);
break;
trail.FadeTo(0.4f).FadeOut(800, Easing.OutQuint);
trail.Expire(true);
case CatcherTrailAnimation.HyperDashAfterimage:
hyperDashAfterImages.Remove(drawable);
break;
}
}
private CatcherTrail createTrail(CatcherAnimationState animationState, float x, Vector2 scale)
protected override CatcherTrail GetDrawable(CatcherTrailEntry entry)
{
CatcherTrail trail = trailPool.Get();
trail.AnimationState = animationState;
trail.Scale = scale;
trail.Position = new Vector2(x, 0);
trail.Apply(entry);
return trail;
}
@ -107,5 +123,13 @@ namespace osu.Game.Rulesets.Catch.UI
return maxTime;
}
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);
if (skin != null)
skin.SourceChanged -= skinSourceChanged;
}
}
}