1
0
mirror of https://github.com/ppy/osu.git synced 2025-02-15 09:42:57 +08:00

Limit shake duration to ensure it doesn't overlap miss window

This commit is contained in:
Dean Herbert 2018-07-06 17:24:30 +09:00
parent 98410dbb6d
commit 79af5cb0a0
4 changed files with 20 additions and 10 deletions

View File

@ -89,7 +89,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
var result = HitObject.HitWindows.ResultFor(timeOffset);
if (result == HitResult.None)
{
Shake();
Shake(Math.Abs(timeOffset) - HitObject.HitWindows.HalfWindowFor(HitResult.Miss));
return;
}

View File

@ -69,7 +69,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
private OsuInputManager osuActionInputManager;
internal OsuInputManager OsuActionInputManager => osuActionInputManager ?? (osuActionInputManager = GetContainingInputManager() as OsuInputManager);
protected virtual void Shake() => shakeContainer.Shake();
protected virtual void Shake(double maximumLength) => shakeContainer.Shake(maximumLength);
}
public enum ComboResult

View File

@ -30,8 +30,8 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
Position = slider.CurvePositionAt(completionProgress);
}
public Action OnShake;
public Action<double> OnShake;
protected override void Shake() => OnShake?.Invoke();
protected override void Shake(double maximumLength) => OnShake?.Invoke(maximumLength);
}
}

View File

@ -14,16 +14,26 @@ namespace osu.Game.Graphics.Containers
/// <summary>
/// Shake the contents of this container.
/// </summary>
public void Shake()
/// <param name="maximumLength">The maximum length the shake should last.</param>
public void Shake(double maximumLength)
{
const float shake_amount = 8;
const float shake_duration = 30;
this.MoveToX(shake_amount, shake_duration / 2, Easing.OutSine).Then()
.MoveToX(-shake_amount, shake_duration, Easing.InOutSine).Then()
.MoveToX(shake_amount, shake_duration, Easing.InOutSine).Then()
.MoveToX(-shake_amount, shake_duration, Easing.InOutSine).Then()
.MoveToX(0, shake_duration / 2, Easing.InSine);
// if we don't have enough time, don't bother shaking.
if (maximumLength < shake_duration * 2)
return;
var sequence = this.MoveToX(shake_amount, shake_duration / 2, Easing.OutSine).Then()
.MoveToX(-shake_amount, shake_duration, Easing.InOutSine).Then();
// if we don't have enough time for the second shake, skip it.
if (maximumLength > shake_duration * 4)
sequence = sequence
.MoveToX(shake_amount, shake_duration, Easing.InOutSine).Then()
.MoveToX(-shake_amount, shake_duration, Easing.InOutSine).Then();
sequence.MoveToX(0, shake_duration / 2, Easing.InSine);
}
}
}