mirror of
https://github.com/ppy/osu.git
synced 2024-11-11 08:27:49 +08:00
Fix legacy mania note body animation not resetting sometimes
Hopefully closes https://github.com/ppy/osu/issues/28284. As far as I can tell this is a somewhat difficult one to reproduce because it relies on a specific set of circumstances (at least the reproduction case that I found does). The reset to frame 0 would previously be called explicitly when `isHitting` changed:182ca145c7/osu.Game.Rulesets.Mania/Skinning/Legacy/LegacyBodyPiece.cs (L144)
However, it can be the case that `bodyAnimation` is not loaded at the point of this call. This is significant because `SkinnableTextureAnimation` contains this logic:182ca145c7/osu.Game/Skinning/LegacySkinExtensions.cs (L192-L211)
which cannot be moved any earlier (because any earlier the `Clock` may no longer be correct), and also causes the animation to be seeked forward while it is stopped. I can't figure out a decent way to layer this otherwise (by scheduling or whatever), so this commit is just applying the nuclear option of just seeking back to frame 0 on every update frame in which the body piece is not being hit.
This commit is contained in:
parent
182ca145c7
commit
bf0040447c
@ -140,10 +140,7 @@ namespace osu.Game.Rulesets.Mania.Skinning.Legacy
|
|||||||
private void onIsHittingChanged(ValueChangedEvent<bool> isHitting)
|
private void onIsHittingChanged(ValueChangedEvent<bool> isHitting)
|
||||||
{
|
{
|
||||||
if (bodySprite is TextureAnimation bodyAnimation)
|
if (bodySprite is TextureAnimation bodyAnimation)
|
||||||
{
|
|
||||||
bodyAnimation.GotoFrame(0);
|
|
||||||
bodyAnimation.IsPlaying = isHitting.NewValue;
|
bodyAnimation.IsPlaying = isHitting.NewValue;
|
||||||
}
|
|
||||||
|
|
||||||
if (lightContainer == null)
|
if (lightContainer == null)
|
||||||
return;
|
return;
|
||||||
@ -219,6 +216,9 @@ namespace osu.Game.Rulesets.Mania.Skinning.Legacy
|
|||||||
{
|
{
|
||||||
base.Update();
|
base.Update();
|
||||||
|
|
||||||
|
if (!isHitting.Value)
|
||||||
|
(bodySprite as TextureAnimation)?.GotoFrame(0);
|
||||||
|
|
||||||
if (holdNote.Body.HasHoldBreak)
|
if (holdNote.Body.HasHoldBreak)
|
||||||
missFadeTime.Value = holdNote.Body.Result.TimeAbsolute;
|
missFadeTime.Value = holdNote.Body.Result.TimeAbsolute;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user