mirror of
https://github.com/ppy/osu.git
synced 2024-11-11 11:37:28 +08:00
Merge branch 'master' into tournament-base-changes
This commit is contained in:
commit
2eb8f245da
@ -3,9 +3,6 @@
|
||||
|
||||
using NUnit.Framework;
|
||||
using osu.Framework.Graphics;
|
||||
using osu.Framework.Graphics.Sprites;
|
||||
using osu.Framework.Utils;
|
||||
using osu.Game.Graphics.Sprites;
|
||||
using osu.Game.Graphics.UserInterface;
|
||||
using osu.Game.Screens.Play.HUD;
|
||||
using osuTK;
|
||||
@ -45,32 +42,12 @@ namespace osu.Game.Tests.Visual.Gameplay
|
||||
};
|
||||
Add(accuracyCounter);
|
||||
|
||||
StarCounter stars = new StarCounter
|
||||
{
|
||||
Origin = Anchor.BottomLeft,
|
||||
Anchor = Anchor.BottomLeft,
|
||||
Position = new Vector2(20, -160),
|
||||
CountStars = 5,
|
||||
};
|
||||
Add(stars);
|
||||
|
||||
SpriteText starsLabel = new OsuSpriteText
|
||||
{
|
||||
Origin = Anchor.BottomLeft,
|
||||
Anchor = Anchor.BottomLeft,
|
||||
Position = new Vector2(20, -190),
|
||||
Text = stars.CountStars.ToString("0.00"),
|
||||
};
|
||||
Add(starsLabel);
|
||||
|
||||
AddStep(@"Reset all", delegate
|
||||
{
|
||||
score.Current.Value = 0;
|
||||
comboCounter.Current.Value = 0;
|
||||
numerator = denominator = 0;
|
||||
accuracyCounter.SetFraction(0, 0);
|
||||
stars.CountStars = 0;
|
||||
starsLabel.Text = stars.CountStars.ToString("0.00");
|
||||
});
|
||||
|
||||
AddStep(@"Hit! :D", delegate
|
||||
@ -88,20 +65,6 @@ namespace osu.Game.Tests.Visual.Gameplay
|
||||
denominator++;
|
||||
accuracyCounter.SetFraction(numerator, denominator);
|
||||
});
|
||||
|
||||
AddStep(@"Alter stars", delegate
|
||||
{
|
||||
stars.CountStars = RNG.NextSingle() * (stars.StarCount + 1);
|
||||
starsLabel.Text = stars.CountStars.ToString("0.00");
|
||||
});
|
||||
|
||||
AddStep(@"Stop counters", delegate
|
||||
{
|
||||
score.StopRolling();
|
||||
comboCounter.StopRolling();
|
||||
accuracyCounter.StopRolling();
|
||||
stars.StopAnimation();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
57
osu.Game.Tests/Visual/Gameplay/TestSceneStarCounter.cs
Normal file
57
osu.Game.Tests/Visual/Gameplay/TestSceneStarCounter.cs
Normal file
@ -0,0 +1,57 @@
|
||||
// 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 NUnit.Framework;
|
||||
using osu.Framework.Graphics;
|
||||
using osu.Framework.Graphics.Sprites;
|
||||
using osu.Framework.Utils;
|
||||
using osu.Game.Graphics.Sprites;
|
||||
using osu.Game.Graphics.UserInterface;
|
||||
using osuTK;
|
||||
|
||||
namespace osu.Game.Tests.Visual.Gameplay
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestSceneStarCounter : OsuTestScene
|
||||
{
|
||||
public TestSceneStarCounter()
|
||||
{
|
||||
StarCounter stars = new StarCounter
|
||||
{
|
||||
Origin = Anchor.Centre,
|
||||
Anchor = Anchor.Centre,
|
||||
Current = 5,
|
||||
};
|
||||
|
||||
Add(stars);
|
||||
|
||||
SpriteText starsLabel = new OsuSpriteText
|
||||
{
|
||||
Origin = Anchor.Centre,
|
||||
Anchor = Anchor.Centre,
|
||||
Scale = new Vector2(2),
|
||||
Y = 50,
|
||||
Text = stars.Current.ToString("0.00"),
|
||||
};
|
||||
|
||||
Add(starsLabel);
|
||||
|
||||
AddRepeatStep(@"random value", delegate
|
||||
{
|
||||
stars.Current = RNG.NextSingle() * (stars.StarCount + 1);
|
||||
starsLabel.Text = stars.Current.ToString("0.00");
|
||||
}, 10);
|
||||
|
||||
AddStep(@"Stop animation", delegate
|
||||
{
|
||||
stars.StopAnimation();
|
||||
});
|
||||
|
||||
AddStep(@"Reset", delegate
|
||||
{
|
||||
stars.Current = 0;
|
||||
starsLabel.Text = stars.Current.ToString("0.00");
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
@ -38,7 +38,8 @@ namespace osu.Game.Tournament.Components
|
||||
{
|
||||
RelativeSizeAxes = Axes.Both,
|
||||
FillMode = FillMode.Fit,
|
||||
Clock = new FramedClock(manualClock = new ManualClock())
|
||||
Clock = new FramedClock(manualClock = new ManualClock()),
|
||||
Loop = loop,
|
||||
};
|
||||
}
|
||||
else if (drawFallbackGradient)
|
||||
@ -51,10 +52,13 @@ namespace osu.Game.Tournament.Components
|
||||
}
|
||||
}
|
||||
|
||||
private bool loop;
|
||||
|
||||
public bool Loop
|
||||
{
|
||||
set
|
||||
{
|
||||
loop = value;
|
||||
if (video != null)
|
||||
video.Loop = value;
|
||||
}
|
||||
|
@ -141,7 +141,7 @@ namespace osu.Game.Tournament.Screens.Gameplay.Components
|
||||
currentTeamScore.BindTo(score);
|
||||
}
|
||||
|
||||
private void scoreChanged(ValueChangedEvent<int?> score) => counter.CountStars = score.NewValue ?? 0;
|
||||
private void scoreChanged(ValueChangedEvent<int?> score) => counter.Current = score.NewValue ?? 0;
|
||||
}
|
||||
|
||||
private class TeamDisplay : DrawableTournamentTeam
|
||||
|
@ -13,7 +13,7 @@ namespace osu.Game.Graphics.UserInterface
|
||||
{
|
||||
public class StarCounter : Container
|
||||
{
|
||||
private readonly Container<Star> stars;
|
||||
private readonly FillFlowContainer<Star> stars;
|
||||
|
||||
/// <summary>
|
||||
/// Maximum amount of stars displayed.
|
||||
@ -23,34 +23,29 @@ namespace osu.Game.Graphics.UserInterface
|
||||
/// </remarks>
|
||||
public int StarCount { get; }
|
||||
|
||||
private double animationDelay => 80;
|
||||
/// <summary>
|
||||
/// The added delay for each subsequent star to be animated.
|
||||
/// </summary>
|
||||
protected virtual double AnimationDelay => 80;
|
||||
|
||||
private double scalingDuration => 1000;
|
||||
private Easing scalingEasing => Easing.OutElasticHalf;
|
||||
private float minStarScale => 0.4f;
|
||||
|
||||
private double fadingDuration => 100;
|
||||
private float minStarAlpha => 0.5f;
|
||||
|
||||
private const float star_size = 20;
|
||||
private const float star_spacing = 4;
|
||||
|
||||
private float countStars;
|
||||
private float current;
|
||||
|
||||
/// <summary>
|
||||
/// Amount of stars represented.
|
||||
/// </summary>
|
||||
public float CountStars
|
||||
public float Current
|
||||
{
|
||||
get => countStars;
|
||||
get => current;
|
||||
|
||||
set
|
||||
{
|
||||
if (countStars == value) return;
|
||||
if (current == value) return;
|
||||
|
||||
if (IsLoaded)
|
||||
transformCount(value);
|
||||
countStars = value;
|
||||
animate(value);
|
||||
current = value;
|
||||
}
|
||||
}
|
||||
|
||||
@ -71,11 +66,13 @@ namespace osu.Game.Graphics.UserInterface
|
||||
AutoSizeAxes = Axes.Both,
|
||||
Direction = FillDirection.Horizontal,
|
||||
Spacing = new Vector2(star_spacing),
|
||||
ChildrenEnumerable = Enumerable.Range(0, StarCount).Select(i => new Star { Alpha = minStarAlpha })
|
||||
ChildrenEnumerable = Enumerable.Range(0, StarCount).Select(i => CreateStar())
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public virtual Star CreateStar() => new DefaultStar();
|
||||
|
||||
protected override void LoadComplete()
|
||||
{
|
||||
base.LoadComplete();
|
||||
@ -86,63 +83,60 @@ namespace osu.Game.Graphics.UserInterface
|
||||
|
||||
public void ResetCount()
|
||||
{
|
||||
countStars = 0;
|
||||
current = 0;
|
||||
StopAnimation();
|
||||
}
|
||||
|
||||
public void ReplayAnimation()
|
||||
{
|
||||
var t = countStars;
|
||||
var t = current;
|
||||
ResetCount();
|
||||
CountStars = t;
|
||||
Current = t;
|
||||
}
|
||||
|
||||
public void StopAnimation()
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
animate(current);
|
||||
foreach (var star in stars.Children)
|
||||
star.FinishTransforms(true);
|
||||
}
|
||||
|
||||
private float getStarScale(int i, float value) => i + 1 <= value ? 1.0f : Interpolation.ValueAt(value, 0, 1.0f, i, i + 1);
|
||||
|
||||
private void animate(float newValue)
|
||||
{
|
||||
for (var i = 0; i < stars.Children.Count; i++)
|
||||
{
|
||||
var star = stars.Children[i];
|
||||
|
||||
star.ClearTransforms(true);
|
||||
star.FadeTo(i < countStars ? 1.0f : minStarAlpha);
|
||||
star.Icon.ScaleTo(getStarScale(i, countStars));
|
||||
i++;
|
||||
|
||||
double delay = (current <= newValue ? Math.Max(i - current, 0) : Math.Max(current - 1 - i, 0)) * AnimationDelay;
|
||||
|
||||
using (star.BeginDelayedSequence(delay, true))
|
||||
star.DisplayAt(getStarScale(i, newValue));
|
||||
}
|
||||
}
|
||||
|
||||
private float getStarScale(int i, float value)
|
||||
public class DefaultStar : Star
|
||||
{
|
||||
if (value <= i)
|
||||
return minStarScale;
|
||||
private const double scaling_duration = 1000;
|
||||
|
||||
return i + 1 <= value ? 1.0f : Interpolation.ValueAt(value, minStarScale, 1.0f, i, i + 1);
|
||||
}
|
||||
private const double fading_duration = 100;
|
||||
|
||||
private void transformCount(float newValue)
|
||||
{
|
||||
int i = 0;
|
||||
private const Easing scaling_easing = Easing.OutElasticHalf;
|
||||
|
||||
foreach (var star in stars.Children)
|
||||
{
|
||||
star.ClearTransforms(true);
|
||||
private const float min_star_scale = 0.4f;
|
||||
|
||||
var delay = (countStars <= newValue ? Math.Max(i - countStars, 0) : Math.Max(countStars - 1 - i, 0)) * animationDelay;
|
||||
star.Delay(delay).FadeTo(i < newValue ? 1.0f : minStarAlpha, fadingDuration);
|
||||
star.Icon.Delay(delay).ScaleTo(getStarScale(i, newValue), scalingDuration, scalingEasing);
|
||||
private const float star_size = 20;
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
private class Star : Container
|
||||
{
|
||||
public readonly SpriteIcon Icon;
|
||||
|
||||
public Star()
|
||||
public DefaultStar()
|
||||
{
|
||||
Size = new Vector2(star_size);
|
||||
|
||||
Child = Icon = new SpriteIcon
|
||||
InternalChild = Icon = new SpriteIcon
|
||||
{
|
||||
Size = new Vector2(star_size),
|
||||
Icon = FontAwesome.Solid.Star,
|
||||
@ -150,6 +144,19 @@ namespace osu.Game.Graphics.UserInterface
|
||||
Origin = Anchor.Centre,
|
||||
};
|
||||
}
|
||||
|
||||
public override void DisplayAt(float scale)
|
||||
{
|
||||
scale = Math.Clamp(scale, min_star_scale, 1);
|
||||
|
||||
this.FadeTo(scale, fading_duration);
|
||||
Icon.ScaleTo(scale, scaling_duration, scaling_easing);
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class Star : CompositeDrawable
|
||||
{
|
||||
public abstract void DisplayAt(float scale);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ namespace osu.Game.Overlays.Profile.Sections.Historical
|
||||
}
|
||||
|
||||
[BackgroundDependencyLoader]
|
||||
private void load(OsuColour colours)
|
||||
private void load(OverlayColourProvider colourProvider)
|
||||
{
|
||||
AddRangeInternal(new Drawable[]
|
||||
{
|
||||
@ -61,7 +61,7 @@ namespace osu.Game.Overlays.Profile.Sections.Historical
|
||||
CornerRadius = corner_radius,
|
||||
Children = new Drawable[]
|
||||
{
|
||||
new ProfileItemContainer
|
||||
new MostPlayedBeatmapContainer
|
||||
{
|
||||
Child = new Container
|
||||
{
|
||||
@ -78,11 +78,14 @@ namespace osu.Game.Overlays.Profile.Sections.Historical
|
||||
Children = new Drawable[]
|
||||
{
|
||||
new MostPlayedBeatmapMetadataContainer(beatmap),
|
||||
new LinkFlowContainer(t => t.Font = OsuFont.GetFont(size: 12, weight: FontWeight.Regular))
|
||||
new LinkFlowContainer(t =>
|
||||
{
|
||||
t.Font = OsuFont.GetFont(size: 12, weight: FontWeight.Regular);
|
||||
t.Colour = colourProvider.Foreground1;
|
||||
})
|
||||
{
|
||||
AutoSizeAxes = Axes.Both,
|
||||
Direction = FillDirection.Horizontal,
|
||||
Colour = colours.GreySeafoamLighter
|
||||
}.With(d =>
|
||||
{
|
||||
d.AddText("mapped by ");
|
||||
@ -105,6 +108,16 @@ namespace osu.Game.Overlays.Profile.Sections.Historical
|
||||
});
|
||||
}
|
||||
|
||||
private class MostPlayedBeatmapContainer : ProfileItemContainer
|
||||
{
|
||||
[BackgroundDependencyLoader]
|
||||
private void load(OverlayColourProvider colourProvider)
|
||||
{
|
||||
IdleColour = colourProvider.Background4;
|
||||
HoverColour = colourProvider.Background3;
|
||||
}
|
||||
}
|
||||
|
||||
private class MostPlayedBeatmapMetadataContainer : BeatmapMetadataContainer
|
||||
{
|
||||
public MostPlayedBeatmapMetadataContainer(BeatmapInfo beatmap)
|
||||
|
@ -16,12 +16,33 @@ namespace osu.Game.Overlays.Profile.Sections
|
||||
|
||||
protected override Container<Drawable> Content => content;
|
||||
|
||||
private Color4 idleColour;
|
||||
private Color4 hoverColour;
|
||||
|
||||
private readonly Box background;
|
||||
private readonly Container content;
|
||||
|
||||
private Color4 idleColour;
|
||||
|
||||
protected Color4 IdleColour
|
||||
{
|
||||
get => idleColour;
|
||||
set
|
||||
{
|
||||
idleColour = value;
|
||||
fadeBackgroundColour();
|
||||
}
|
||||
}
|
||||
|
||||
private Color4 hoverColour;
|
||||
|
||||
protected Color4 HoverColour
|
||||
{
|
||||
get => hoverColour;
|
||||
set
|
||||
{
|
||||
hoverColour = value;
|
||||
fadeBackgroundColour();
|
||||
}
|
||||
}
|
||||
|
||||
public ProfileItemContainer()
|
||||
{
|
||||
RelativeSizeAxes = Axes.Both;
|
||||
@ -44,20 +65,25 @@ namespace osu.Game.Overlays.Profile.Sections
|
||||
[BackgroundDependencyLoader]
|
||||
private void load(OverlayColourProvider colourProvider)
|
||||
{
|
||||
background.Colour = idleColour = colourProvider.Background3;
|
||||
hoverColour = colourProvider.Background2;
|
||||
IdleColour = colourProvider.Background3;
|
||||
HoverColour = colourProvider.Background2;
|
||||
}
|
||||
|
||||
protected override bool OnHover(HoverEvent e)
|
||||
{
|
||||
background.FadeColour(hoverColour, hover_duration, Easing.OutQuint);
|
||||
return base.OnHover(e);
|
||||
fadeBackgroundColour(hover_duration);
|
||||
return true;
|
||||
}
|
||||
|
||||
protected override void OnHoverLost(HoverLostEvent e)
|
||||
{
|
||||
base.OnHoverLost(e);
|
||||
background.FadeColour(idleColour, hover_duration, Easing.OutQuint);
|
||||
fadeBackgroundColour(hover_duration);
|
||||
}
|
||||
|
||||
private void fadeBackgroundColour(double fadeDuration = 0)
|
||||
{
|
||||
background.FadeColour(IsHovered ? HoverColour : IdleColour, fadeDuration, Easing.OutQuint);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -123,7 +123,7 @@ namespace osu.Game.Screens.Select.Carousel
|
||||
},
|
||||
starCounter = new StarCounter
|
||||
{
|
||||
CountStars = (float)beatmap.StarDifficulty,
|
||||
Current = (float)beatmap.StarDifficulty,
|
||||
Scale = new Vector2(0.8f),
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user