osu/osu.Game.Rulesets.Osu/UI/Cursor/OsuCursor.cs

139 lines
4.9 KiB
C#
Raw Normal View History

2019-03-19 08:39:53 +00:00
// 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 osu.Framework.Allocation;
using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
2019-04-09 07:27:10 +00:00
using osu.Framework.Graphics.Effects;
2019-03-19 08:39:53 +00:00
using osu.Framework.Graphics.Shapes;
using osu.Game.Rulesets.Osu.Skinning;
2019-03-19 08:39:53 +00:00
using osu.Game.Skinning;
using osuTK;
using osuTK.Graphics;
namespace osu.Game.Rulesets.Osu.UI.Cursor
{
public class OsuCursor : SkinReloadableDrawable
{
2019-07-25 07:17:02 +00:00
private const float size = 28;
2019-03-19 08:39:53 +00:00
private bool cursorExpand;
2019-12-10 11:45:06 +00:00
private SkinnableDrawable cursorSprite;
2019-12-10 12:40:10 +00:00
private Drawable expandTarget => (cursorSprite.Drawable as OsuCursorSprite)?.ExpandTarget ?? cursorSprite;
2019-03-19 08:39:53 +00:00
public OsuCursor()
{
Origin = Anchor.Centre;
2019-07-25 07:17:02 +00:00
Size = new Vector2(size);
2019-03-19 08:39:53 +00:00
}
protected override void SkinChanged(ISkinSource skin, bool allowFallback)
{
cursorExpand = skin.GetConfig<OsuSkinConfiguration, bool>(OsuSkinConfiguration.CursorExpand)?.Value ?? true;
2019-03-19 08:39:53 +00:00
}
[BackgroundDependencyLoader]
private void load()
2019-03-19 08:39:53 +00:00
{
InternalChild = new Container
2019-03-19 08:39:53 +00:00
{
RelativeSizeAxes = Axes.Both,
Origin = Anchor.Centre,
Anchor = Anchor.Centre,
2019-12-10 11:45:06 +00:00
Child = cursorSprite = new SkinnableDrawable(new OsuSkinComponent(OsuSkinComponents.Cursor), _ => new DefaultCursor(), confineMode: ConfineMode.NoScaling)
2019-03-19 08:39:53 +00:00
{
Origin = Anchor.Centre,
Anchor = Anchor.Centre,
}
};
}
private const float pressed_scale = 1.2f;
private const float released_scale = 1f;
public void Expand()
{
if (!cursorExpand) return;
expandTarget.ScaleTo(released_scale).ScaleTo(pressed_scale, 400, Easing.OutElasticHalf);
2019-03-19 08:39:53 +00:00
}
public void Contract() => expandTarget.ScaleTo(released_scale, 400, Easing.OutQuad);
2019-07-25 07:17:02 +00:00
private class DefaultCursor : OsuCursorSprite
2019-07-25 07:17:02 +00:00
{
public DefaultCursor()
{
RelativeSizeAxes = Axes.Both;
Anchor = Anchor.Centre;
Origin = Anchor.Centre;
2019-12-10 12:40:10 +00:00
InternalChildren = new[]
2019-07-25 07:17:02 +00:00
{
ExpandTarget = new CircularContainer
2019-07-25 07:17:02 +00:00
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
2019-07-25 07:17:02 +00:00
RelativeSizeAxes = Axes.Both,
Masking = true,
BorderThickness = size / 6,
BorderColour = Color4.White,
EdgeEffect = new EdgeEffectParameters
{
Type = EdgeEffectType.Shadow,
Colour = Color4.Pink.Opacity(0.5f),
Radius = 5,
},
Children = new Drawable[]
{
new Box
{
RelativeSizeAxes = Axes.Both,
Alpha = 0,
AlwaysPresent = true,
},
new CircularContainer
{
Origin = Anchor.Centre,
Anchor = Anchor.Centre,
RelativeSizeAxes = Axes.Both,
Masking = true,
BorderThickness = size / 3,
BorderColour = Color4.White.Opacity(0.5f),
Children = new Drawable[]
{
new Box
{
RelativeSizeAxes = Axes.Both,
Alpha = 0,
AlwaysPresent = true,
},
},
},
},
},
new Circle
{
Origin = Anchor.Centre,
Anchor = Anchor.Centre,
RelativeSizeAxes = Axes.Both,
Scale = new Vector2(0.14f),
Colour = new Color4(34, 93, 204, 255),
EdgeEffect = new EdgeEffectParameters
{
Type = EdgeEffectType.Glow,
Radius = 8,
Colour = Color4.White,
},
},
2019-07-25 07:17:02 +00:00
};
}
}
2019-03-19 08:39:53 +00:00
}
}