diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModTransform.cs b/osu.Game.Rulesets.Osu/Mods/OsuModTransform.cs index cc664ae72e..41daef1f38 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModTransform.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModTransform.cs @@ -8,6 +8,7 @@ using osu.Framework.Graphics.Sprites; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Osu.Objects; +using osu.Game.Rulesets.Osu.Objects.Drawables; using osuTK; namespace osu.Game.Rulesets.Osu.Mods @@ -27,26 +28,40 @@ namespace osu.Game.Rulesets.Osu.Mods public void ApplyToDrawableHitObjects(IEnumerable drawables) { foreach (var drawable in drawables) + drawable.ApplyCustomUpdateState += applyTransform; + } + + private void applyTransform(DrawableHitObject drawable, ArmedState state) + { + switch (drawable) { - var hitObject = (OsuHitObject)drawable.HitObject; + case DrawableSliderHead _: + case DrawableSliderTail _: + case DrawableSliderTick _: + case DrawableRepeatPoint _: + return; - float appearDistance = (float)(hitObject.TimePreempt - hitObject.TimeFadeIn) / 2; + default: + var hitObject = (OsuHitObject)drawable.HitObject; - Vector2 originalPosition = drawable.Position; - Vector2 appearOffset = new Vector2(MathF.Cos(theta), MathF.Sin(theta)) * appearDistance; + float appearDistance = (float)(hitObject.TimePreempt - hitObject.TimeFadeIn) / 2; - //the - 1 and + 1 prevents the hit objects to appear in the wrong position. - double appearTime = hitObject.StartTime - hitObject.TimePreempt - 1; - double moveDuration = hitObject.TimePreempt + 1; + Vector2 originalPosition = drawable.Position; + Vector2 appearOffset = new Vector2(MathF.Cos(theta), MathF.Sin(theta)) * appearDistance; - using (drawable.BeginAbsoluteSequence(appearTime, true)) - { - drawable - .MoveToOffset(appearOffset) - .MoveTo(originalPosition, moveDuration, Easing.InOutSine); - } + //the - 1 and + 1 prevents the hit objects to appear in the wrong position. + double appearTime = hitObject.StartTime - hitObject.TimePreempt - 1; + double moveDuration = hitObject.TimePreempt + 1; - theta += (float)hitObject.TimeFadeIn / 1000; + using (drawable.BeginAbsoluteSequence(appearTime, true)) + { + drawable + .MoveToOffset(appearOffset) + .MoveTo(originalPosition, moveDuration, Easing.InOutSine); + } + + theta += (float)hitObject.TimeFadeIn / 1000; + break; } } }