1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-11 15:07:44 +08:00
osu-lazer/osu.Game.Rulesets.Taiko/UI/HitExplosion.cs

97 lines
3.2 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.
2018-04-13 17:19:50 +08:00
using System;
using System.Linq;
2018-11-20 15:51:59 +08:00
using osuTK;
2018-04-13 17:19:50 +08:00
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Rulesets.Objects.Drawables;
using osu.Game.Rulesets.Scoring;
2018-04-13 17:19:50 +08:00
using osu.Game.Rulesets.Taiko.Objects;
using osu.Game.Rulesets.Taiko.Objects.Drawables;
using osu.Game.Skinning;
2018-04-13 17:19:50 +08:00
namespace osu.Game.Rulesets.Taiko.UI
{
/// <summary>
/// A circle explodes from the hit target to indicate a hitobject has been hit.
/// </summary>
internal class HitExplosion : CircularContainer
{
public override bool RemoveWhenNotAlive => true;
2020-09-25 18:37:34 +08:00
[Cached(typeof(DrawableHitObject))]
2018-04-13 17:19:50 +08:00
public readonly DrawableHitObject JudgedObject;
2020-09-25 18:37:34 +08:00
2020-09-25 18:25:58 +08:00
private readonly HitResult result;
2018-04-13 17:19:50 +08:00
private SkinnableDrawable skinnable;
public override double LifetimeStart => skinnable.Drawable.LifetimeStart;
public override double LifetimeEnd => skinnable.Drawable.LifetimeEnd;
2020-09-25 18:25:58 +08:00
public HitExplosion(DrawableHitObject judgedObject, HitResult result)
2018-04-13 17:19:50 +08:00
{
JudgedObject = judgedObject;
2020-09-25 18:25:58 +08:00
this.result = result;
2018-04-13 17:19:50 +08:00
Anchor = Anchor.Centre;
2018-04-13 17:19:50 +08:00
Origin = Anchor.Centre;
RelativeSizeAxes = Axes.Both;
Size = new Vector2(TaikoHitObject.DEFAULT_SIZE);
RelativePositionAxes = Axes.Both;
}
[BackgroundDependencyLoader]
private void load()
2018-04-13 17:19:50 +08:00
{
2020-09-25 18:25:58 +08:00
Child = skinnable = new SkinnableDrawable(new TaikoSkinComponent(getComponentName(JudgedObject)), _ => new DefaultHitExplosion(JudgedObject, result));
}
private TaikoSkinComponents getComponentName(DrawableHitObject judgedObject)
{
2020-09-25 18:25:58 +08:00
switch (result)
{
case HitResult.Miss:
return TaikoSkinComponents.TaikoExplosionMiss;
2020-09-29 16:16:55 +08:00
case HitResult.Ok:
return useStrongExplosion(judgedObject)
2020-09-29 16:16:55 +08:00
? TaikoSkinComponents.TaikoExplosionOkStrong
: TaikoSkinComponents.TaikoExplosionOk;
case HitResult.Great:
return useStrongExplosion(judgedObject)
? TaikoSkinComponents.TaikoExplosionGreatStrong
: TaikoSkinComponents.TaikoExplosionGreat;
}
throw new ArgumentOutOfRangeException(nameof(judgedObject), "Invalid result type");
}
private bool useStrongExplosion(DrawableHitObject judgedObject)
{
if (!(judgedObject.HitObject is Hit))
return false;
if (!(judgedObject.NestedHitObjects.SingleOrDefault() is DrawableStrongNestedHit nestedHit))
return false;
return judgedObject.Result.Type == nestedHit.Result.Type;
2018-04-13 17:19:50 +08:00
}
/// <summary>
/// Transforms this hit explosion to visualise a secondary hit.
/// </summary>
public void VisualiseSecondHit()
{
this.ResizeTo(new Vector2(TaikoHitObject.DEFAULT_STRONG_SIZE), 50);
}
}
}