osu/osu.Game.Rulesets.Osu/Mods/OsuModObjectScaleTween.cs

71 lines
2.4 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.
using System;
using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Objects.Drawables;
using osu.Game.Rulesets.Osu.Objects;
using osu.Game.Rulesets.Osu.Objects.Drawables;
namespace osu.Game.Rulesets.Osu.Mods
{
/// <summary>
/// Adjusts the size of hit objects during their fade in animation.
/// </summary>
2020-11-05 06:52:06 +00:00
public abstract class OsuModObjectScaleTween : ModWithVisibilityAdjustment
{
public override ModType Type => ModType.Fun;
public override double ScoreMultiplier => 1;
2020-07-17 14:12:01 +00:00
public abstract BindableNumber<float> StartScale { get; }
protected virtual float EndScale => 1;
2019-09-18 11:07:44 +00:00
public override Type[] IncompatibleMods => new[] { typeof(OsuModSpinIn), typeof(OsuModTraceable) };
2020-11-05 06:52:06 +00:00
protected override void ApplyNormalVisibilityState(DrawableHitObject hitObject, ArmedState state)
{
2020-11-05 06:52:06 +00:00
base.ApplyNormalVisibilityState(hitObject, state);
applyCustomState(hitObject, state);
}
2020-11-05 06:52:06 +00:00
private void applyCustomState(DrawableHitObject drawable, ArmedState state)
{
2020-11-05 06:52:06 +00:00
if (drawable is DrawableSpinner)
return;
var h = (OsuHitObject)drawable.HitObject;
// apply grow effect
switch (drawable)
{
case DrawableSliderHead _:
case DrawableSliderTail _:
// special cases we should *not* be scaling.
break;
case DrawableSlider _:
case DrawableHitCircle _:
{
using (drawable.BeginAbsoluteSequence(h.StartTime - h.TimePreempt))
2020-07-17 14:12:01 +00:00
drawable.ScaleTo(StartScale.Value).Then().ScaleTo(EndScale, h.TimePreempt, Easing.OutSine);
break;
}
}
// remove approach circles
switch (drawable)
{
case DrawableHitCircle circle:
// we don't want to see the approach circle
using (circle.BeginAbsoluteSequence(h.StartTime - h.TimePreempt))
circle.ApproachCircle.Hide();
break;
}
}
}
}