1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-06 09:42:55 +08:00

Add support for showing tick misses

This commit is contained in:
Dean Herbert 2023-12-20 20:23:19 +09:00
parent 22513e0070
commit 9b383e3276
No known key found for this signature in database
13 changed files with 62 additions and 72 deletions

View File

@ -34,8 +34,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
private Drawable scaleContainer; private Drawable scaleContainer;
public override bool DisplayResult => false;
public DrawableSliderRepeat() public DrawableSliderRepeat()
: base(null) : base(null)
{ {

View File

@ -24,11 +24,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
protected DrawableSlider DrawableSlider => (DrawableSlider)ParentHitObject; protected DrawableSlider DrawableSlider => (DrawableSlider)ParentHitObject;
/// <summary>
/// The judgement text is provided by the <see cref="DrawableSlider"/>.
/// </summary>
public override bool DisplayResult => false;
/// <summary> /// <summary>
/// Whether the hit samples only play on successful hits. /// Whether the hit samples only play on successful hits.
/// If <c>false</c>, the hit samples will also play on misses. /// If <c>false</c>, the hit samples will also play on misses.

View File

@ -20,8 +20,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
private const float default_tick_size = 16; private const float default_tick_size = 16;
public override bool DisplayResult => false;
protected DrawableSlider DrawableSlider => (DrawableSlider)ParentHitObject; protected DrawableSlider DrawableSlider => (DrawableSlider)ParentHitObject;
private SkinnableDrawable scaleContainer; private SkinnableDrawable scaleContainer;

View File

@ -28,6 +28,8 @@ namespace osu.Game.Rulesets.Osu.Scoring
case HitResult.Ok: case HitResult.Ok:
case HitResult.Meh: case HitResult.Meh:
case HitResult.Miss: case HitResult.Miss:
case HitResult.LargeTickMiss:
case HitResult.IgnoreMiss:
return true; return true;
} }

View File

@ -62,25 +62,23 @@ namespace osu.Game.Rulesets.Osu.Skinning.Argon
/// </remarks> /// </remarks>
public virtual void PlayAnimation() public virtual void PlayAnimation()
{ {
switch (Result) if (Result.IsHit())
{ {
default: JudgementText
JudgementText .FadeInFromZero(300, Easing.OutQuint)
.FadeInFromZero(300, Easing.OutQuint) .ScaleTo(Vector2.One)
.ScaleTo(Vector2.One) .ScaleTo(new Vector2(1.2f), 1800, Easing.OutQuint);
.ScaleTo(new Vector2(1.2f), 1800, Easing.OutQuint); }
break; else
{
this.ScaleTo(1.6f);
this.ScaleTo(1, 100, Easing.In);
case HitResult.Miss: this.MoveTo(Vector2.Zero);
this.ScaleTo(1.6f); this.MoveToOffset(new Vector2(0, 100), 800, Easing.InQuint);
this.ScaleTo(1, 100, Easing.In);
this.MoveTo(Vector2.Zero); this.RotateTo(0);
this.MoveToOffset(new Vector2(0, 100), 800, Easing.InQuint); this.RotateTo(40, 800, Easing.InQuint);
this.RotateTo(0);
this.RotateTo(40, 800, Easing.InQuint);
break;
} }
this.FadeOutFromOne(800); this.FadeOutFromOne(800);

View File

@ -170,7 +170,10 @@ namespace osu.Game.Rulesets.Osu.UI
if (!judgedObject.DisplayResult || !DisplayJudgements.Value) if (!judgedObject.DisplayResult || !DisplayJudgements.Value)
return; return;
DrawableOsuJudgement explosion = poolDictionary[result.Type].Get(doj => doj.Apply(result, judgedObject)); if (!poolDictionary.TryGetValue(result.Type, out var pool))
return;
DrawableOsuJudgement explosion = pool.Get(doj => doj.Apply(result, judgedObject));
judgementLayer.Add(explosion); judgementLayer.Add(explosion);

View File

@ -77,6 +77,7 @@ namespace osu.Game.Graphics
{ {
case HitResult.SmallTickMiss: case HitResult.SmallTickMiss:
case HitResult.LargeTickMiss: case HitResult.LargeTickMiss:
case HitResult.IgnoreMiss:
case HitResult.Miss: case HitResult.Miss:
case HitResult.ComboBreak: case HitResult.ComboBreak:
return Red; return Red;

View File

@ -38,18 +38,16 @@ namespace osu.Game.Rulesets.Judgements
/// </remarks> /// </remarks>
public virtual void PlayAnimation() public virtual void PlayAnimation()
{ {
switch (Result) if (Result != HitResult.None && !Result.IsHit())
{ {
case HitResult.Miss: this.ScaleTo(1.6f);
this.ScaleTo(1.6f); this.ScaleTo(1, 100, Easing.In);
this.ScaleTo(1, 100, Easing.In);
this.MoveTo(Vector2.Zero); this.MoveTo(Vector2.Zero);
this.MoveToOffset(new Vector2(0, 100), 800, Easing.InQuint); this.MoveToOffset(new Vector2(0, 100), 800, Easing.InQuint);
this.RotateTo(0); this.RotateTo(0);
this.RotateTo(40, 800, Easing.InQuint); this.RotateTo(40, 800, Easing.InQuint);
break;
} }
this.FadeOutFromOne(800); this.FadeOutFromOne(800);

View File

@ -133,12 +133,11 @@ namespace osu.Game.Rulesets.Judgements
case HitResult.None: case HitResult.None:
break; break;
case HitResult.Miss:
ApplyMissAnimations();
break;
default: default:
ApplyHitAnimations(); if (Result.Type.IsHit())
ApplyHitAnimations();
else
ApplyMissAnimations();
break; break;
} }

View File

@ -86,6 +86,7 @@ namespace osu.Game.Rulesets.Scoring
/// Indicates a large tick miss. /// Indicates a large tick miss.
/// </summary> /// </summary>
[EnumMember(Value = "large_tick_miss")] [EnumMember(Value = "large_tick_miss")]
[Description(@"x")]
[Order(10)] [Order(10)]
LargeTickMiss, LargeTickMiss,
@ -117,6 +118,7 @@ namespace osu.Game.Rulesets.Scoring
/// Indicates a miss that should be ignored for scoring purposes. /// Indicates a miss that should be ignored for scoring purposes.
/// </summary> /// </summary>
[EnumMember(Value = "ignore_miss")] [EnumMember(Value = "ignore_miss")]
[Description("x")]
[Order(13)] [Order(13)]
IgnoreMiss, IgnoreMiss,

View File

@ -50,7 +50,7 @@ namespace osu.Game.Skinning
}); });
} }
if (result != HitResult.Miss) if (result.IsHit())
{ {
//new judgement shows old as a temporary effect //new judgement shows old as a temporary effect
AddInternal(temporaryOldStyle = new LegacyJudgementPieceOld(result, createMainDrawable, 1.05f, true) AddInternal(temporaryOldStyle = new LegacyJudgementPieceOld(result, createMainDrawable, 1.05f, true)

View File

@ -52,39 +52,35 @@ namespace osu.Game.Skinning
if (animation?.FrameCount > 1 && !forceTransforms) if (animation?.FrameCount > 1 && !forceTransforms)
return; return;
switch (result) if (result.IsHit())
{ {
case HitResult.Miss: this.ScaleTo(0.6f).Then()
this.ScaleTo(1.6f); .ScaleTo(1.1f, fade_in_length * 0.8f).Then() // t = 0.8
this.ScaleTo(1, 100, Easing.In); .Delay(fade_in_length * 0.2f) // t = 1.0
.ScaleTo(0.9f, fade_in_length * 0.2f).Then() // t = 1.2
// stable dictates scale of 0.9->1 over time 1.0 to 1.4, but we are already at 1.2.
// so we need to force the current value to be correct at 1.2 (0.95) then complete the
// second half of the transform.
.ScaleTo(0.95f).ScaleTo(finalScale, fade_in_length * 0.2f); // t = 1.4
}
else
{
this.ScaleTo(1.6f);
this.ScaleTo(1, 100, Easing.In);
decimal? legacyVersion = skin.GetConfig<SkinConfiguration.LegacySetting, decimal>(SkinConfiguration.LegacySetting.Version)?.Value; decimal? legacyVersion = skin.GetConfig<SkinConfiguration.LegacySetting, decimal>(SkinConfiguration.LegacySetting.Version)?.Value;
if (legacyVersion >= 2.0m) if (legacyVersion >= 2.0m)
{ {
this.MoveTo(new Vector2(0, -5)); this.MoveTo(new Vector2(0, -5));
this.MoveToOffset(new Vector2(0, 80), fade_out_delay + fade_out_length, Easing.In); this.MoveToOffset(new Vector2(0, 80), fade_out_delay + fade_out_length, Easing.In);
} }
float rotation = RNG.NextSingle(-8.6f, 8.6f); float rotation = RNG.NextSingle(-8.6f, 8.6f);
this.RotateTo(0); this.RotateTo(0);
this.RotateTo(rotation, fade_in_length) this.RotateTo(rotation, fade_in_length)
.Then().RotateTo(rotation * 2, fade_out_delay + fade_out_length - fade_in_length, Easing.In); .Then().RotateTo(rotation * 2, fade_out_delay + fade_out_length - fade_in_length, Easing.In);
break;
default:
this.ScaleTo(0.6f).Then()
.ScaleTo(1.1f, fade_in_length * 0.8f).Then() // t = 0.8
.Delay(fade_in_length * 0.2f) // t = 1.0
.ScaleTo(0.9f, fade_in_length * 0.2f).Then() // t = 1.2
// stable dictates scale of 0.9->1 over time 1.0 to 1.4, but we are already at 1.2.
// so we need to force the current value to be correct at 1.2 (0.95) then complete the
// second half of the transform.
.ScaleTo(0.95f).ScaleTo(finalScale, fade_in_length * 0.2f); // t = 1.4
break;
} }
} }

View File

@ -453,11 +453,11 @@ namespace osu.Game.Skinning
private Drawable? getJudgementAnimation(HitResult result) private Drawable? getJudgementAnimation(HitResult result)
{ {
if (!result.IsHit())
return this.GetAnimation("hit0", true, false);
switch (result) switch (result)
{ {
case HitResult.Miss:
return this.GetAnimation("hit0", true, false);
case HitResult.Meh: case HitResult.Meh:
return this.GetAnimation("hit50", true, false); return this.GetAnimation("hit50", true, false);