Implement ripples (legacy and default)

This commit is contained in:
Dean Herbert 2023-04-29 16:06:08 +09:00
parent b39a9d816e
commit a4ae9e409b
5 changed files with 67 additions and 4 deletions

View File

@ -8,6 +8,7 @@ using NUnit.Framework;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Audio.Sample; using osu.Framework.Audio.Sample;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Extensions.ObjectExtensions;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.Shapes;
@ -18,6 +19,7 @@ using osu.Framework.Testing.Input;
using osu.Framework.Utils; using osu.Framework.Utils;
using osu.Game.Audio; using osu.Game.Audio;
using osu.Game.Configuration; using osu.Game.Configuration;
using osu.Game.Rulesets.Osu.Configuration;
using osu.Game.Rulesets.Osu.Skinning; using osu.Game.Rulesets.Osu.Skinning;
using osu.Game.Rulesets.Osu.UI.Cursor; using osu.Game.Rulesets.Osu.UI.Cursor;
using osu.Game.Screens.Play; using osu.Game.Screens.Play;
@ -40,6 +42,8 @@ namespace osu.Game.Rulesets.Osu.Tests
private Drawable background; private Drawable background;
private readonly Bindable<bool> ripples = new Bindable<bool>();
public TestSceneGameplayCursor() public TestSceneGameplayCursor()
{ {
var ruleset = new OsuRuleset(); var ruleset = new OsuRuleset();
@ -57,6 +61,8 @@ namespace osu.Game.Rulesets.Osu.Tests
}); });
}); });
AddToggleStep("ripples", v => ripples.Value = v);
AddSliderStep("circle size", 0f, 10f, 0f, val => AddSliderStep("circle size", 0f, 10f, 0f, val =>
{ {
config.SetValue(OsuSetting.AutoCursorSize, true); config.SetValue(OsuSetting.AutoCursorSize, true);
@ -67,6 +73,13 @@ namespace osu.Game.Rulesets.Osu.Tests
AddStep("test cursor container", () => loadContent(false)); AddStep("test cursor container", () => loadContent(false));
} }
[BackgroundDependencyLoader]
private void load()
{
var rulesetConfig = (OsuRulesetConfigManager)RulesetConfigs.GetConfigFor(Ruleset.Value.CreateInstance()).AsNonNull();
rulesetConfig.BindWith(OsuRulesetSetting.ShowCursorRipples, ripples);
}
[TestCase(1, 1)] [TestCase(1, 1)]
[TestCase(5, 1)] [TestCase(5, 1)]
[TestCase(10, 1)] [TestCase(10, 1)]

View File

@ -10,6 +10,7 @@ namespace osu.Game.Rulesets.Osu
Cursor, Cursor,
CursorTrail, CursorTrail,
CursorParticles, CursorParticles,
CursorRipple,
SliderScorePoint, SliderScorePoint,
ReverseArrow, ReverseArrow,
HitCircleText, HitCircleText,

View File

@ -105,6 +105,8 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
if (GetTexture("cursor-ripple") != null) if (GetTexture("cursor-ripple") != null)
return this.GetAnimation("cursor-ripple", false, false); return this.GetAnimation("cursor-ripple", false, false);
return null;
case OsuSkinComponents.CursorParticles: case OsuSkinComponents.CursorParticles:
if (GetTexture("star2") != null) if (GetTexture("star2") != null)
return new LegacyCursorParticles(); return new LegacyCursorParticles();

View File

@ -3,19 +3,66 @@
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework.Input.Bindings;
using osu.Framework.Input.Events;
using osu.Game.Rulesets.Osu.Configuration; using osu.Game.Rulesets.Osu.Configuration;
using osu.Game.Rulesets.Osu.Skinning.Default;
using osu.Game.Skinning;
using osuTK;
namespace osu.Game.Rulesets.Osu.UI.Cursor namespace osu.Game.Rulesets.Osu.UI.Cursor
{ {
public partial class CursorRippleVisualiser : CompositeDrawable public partial class CursorRippleVisualiser : CompositeDrawable, IKeyBindingHandler<OsuAction>
{ {
private readonly Bindable<bool> showRipples = new Bindable<bool>(true); private readonly Bindable<bool> showRipples = new Bindable<bool>(true);
[BackgroundDependencyLoader(true)] [BackgroundDependencyLoader(true)]
private void load(OsuRulesetConfigManager rulesetConfig) private void load(OsuRulesetConfigManager? rulesetConfig)
{ {
rulesetConfig?.BindWith(OsuRulesetSetting.ShowCursorTrail, showRipples); rulesetConfig?.BindWith(OsuRulesetSetting.ShowCursorRipples, showRipples);
}
public bool OnPressed(KeyBindingPressEvent<OsuAction> e)
{
if (showRipples.Value)
{
var ripple = new SkinnableDrawable(new OsuSkinComponentLookup(OsuSkinComponents.CursorRipple), _ => new DefaultCursorRipple())
{
Blending = BlendingParameters.Additive,
Position = e.MousePosition
};
AddInternal(ripple);
ripple.ScaleTo(0.05f)
.ScaleTo(0.5f, 700, Easing.Out)
.FadeTo(0.2f)
.FadeOut(700)
.Expire();
}
return false;
}
public void OnReleased(KeyBindingReleaseEvent<OsuAction> e)
{
}
public partial class DefaultCursorRipple : CompositeDrawable
{
[BackgroundDependencyLoader]
private void load()
{
InternalChildren = new Drawable[]
{
new RingPiece(3)
{
Size = new Vector2(512),
}
};
}
} }
} }
} }

View File

@ -48,7 +48,7 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor
Children = new[] Children = new[]
{ {
cursorTrail = new SkinnableDrawable(new OsuSkinComponentLookup(OsuSkinComponents.CursorTrail), _ => new DefaultCursorTrail(), confineMode: ConfineMode.NoScaling), cursorTrail = new SkinnableDrawable(new OsuSkinComponentLookup(OsuSkinComponents.CursorTrail), _ => new DefaultCursorTrail(), confineMode: ConfineMode.NoScaling),
new SkinnableDrawable(new OsuSkinComponentLookup(OsuSkinComponents.CursorRipples), confineMode: ConfineMode.NoScaling), new CursorRippleVisualiser(),
new SkinnableDrawable(new OsuSkinComponentLookup(OsuSkinComponents.CursorParticles), confineMode: ConfineMode.NoScaling), new SkinnableDrawable(new OsuSkinComponentLookup(OsuSkinComponents.CursorParticles), confineMode: ConfineMode.NoScaling),
} }
}; };