1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-07 21:32:57 +08:00

Flags(redoing later), glowing text, proper Score and User usage

This commit is contained in:
DrabWeb 2017-03-04 22:29:52 -04:00
parent d1bad34434
commit 269c139d2a
6 changed files with 132 additions and 50 deletions

View File

@ -1,17 +1,18 @@
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>. // Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using OpenTK;
using System;
using System.Linq;
using System.Collections.Generic;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework.Screens.Testing; using osu.Framework.Screens.Testing;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Game.Screens.Select.Leaderboards;
using OpenTK;
using osu.Framework.Graphics.Textures; using osu.Framework.Graphics.Textures;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using System;
using osu.Framework.MathUtils; using osu.Framework.MathUtils;
using osu.Game.Screens.Select.Leaderboards;
using osu.Game.Modes; using osu.Game.Modes;
using System.Collections.Generic;
namespace osu.Desktop.VisualTests namespace osu.Desktop.VisualTests
{ {
@ -21,28 +22,24 @@ namespace osu.Desktop.VisualTests
public override string Description => @"From song select"; public override string Description => @"From song select";
private Leaderboard leaderboard; private Leaderboard leaderboard;
private TextureStore ts;
[BackgroundDependencyLoader]
private void load(TextureStore textures)
{
ts = textures;
}
private void newScores() private void newScores()
{ {
var scores = new List<LeaderboardScore>(); var scores = new List<Score>();
for (int i = 0; i < 10; i++) for (int i = 0; i < 10; i++)
{ {
scores.Add(new LeaderboardScore scores.Add(new Score
{ {
Name = @"ultralaserxx",
Avatar = ts.Get(@"Online/avatar-guest"),
Flag = ts.Get(@"Flags/__"),
Score = RNG.Next(0, 1000000),
Accuracy = Math.Round(RNG.NextDouble(0, 100), 2), Accuracy = Math.Round(RNG.NextDouble(0, 100), 2),
MaxCombo = RNG.Next(0, 3000), MaxCombo = RNG.Next(0, 3000),
Mods = new Mod[] { }, TotalScore = RNG.Next(1, 1000000),
Mods = Ruleset.GetRuleset(PlayMode.Osu).GetModsFor(ModType.DifficultyIncrease).ToArray(),
User = new Game.Users.User
{
Id = 2,
Username = @"peppy",
FlagName = @"AU",
},
}); });
} }

View File

@ -1,6 +1,8 @@
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>. // Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Game.Users;
namespace osu.Game.Modes namespace osu.Game.Modes
{ {
public class Score public class Score
@ -10,5 +12,7 @@ namespace osu.Game.Modes
public double Combo { get; set; } public double Combo { get; set; }
public double MaxCombo { get; set; } public double MaxCombo { get; set; }
public double Health { get; set; } public double Health { get; set; }
public Mod[] Mods { get; set; }
public User User { get; set; }
} }
} }

View File

@ -1,21 +1,28 @@
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>. // Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System.Collections.Generic;
using OpenTK; using OpenTK;
using OpenTK.Graphics;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using System.Collections.Generic; using osu.Framework.Graphics.Colour;
using osu.Game.Graphics;
using osu.Game.Modes; using osu.Game.Modes;
using osu.Framework.Graphics.Textures; using osu.Framework.Graphics.Textures;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.Primitives;
using osu.Framework.Graphics.Transforms;
namespace osu.Game.Screens.Select.Leaderboards namespace osu.Game.Screens.Select.Leaderboards
{ {
public class Leaderboard : Container public class Leaderboard : Container
{ {
private ScrollContainer scrollContainer;
private FillFlowContainer<LeaderboardScoreDisplay> scrollFlow; private FillFlowContainer<LeaderboardScoreDisplay> scrollFlow;
private LeaderboardScore[] scores; private Score[] scores;
public LeaderboardScore[] Scores public Score[] Scores
{ {
get { return scores; } get { return scores; }
set set
@ -30,6 +37,7 @@ namespace osu.Game.Screens.Select.Leaderboards
} }
scrollFlow.Children = scoreDisplays; scrollFlow.Children = scoreDisplays;
scrollContainer.ScrollTo(0f, false);
} }
} }
@ -37,7 +45,7 @@ namespace osu.Game.Screens.Select.Leaderboards
{ {
Children = new Drawable[] Children = new Drawable[]
{ {
new ScrollContainer scrollContainer = new ScrollContainer
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
ScrollDraggerVisible = false, ScrollDraggerVisible = false,
@ -55,15 +63,28 @@ namespace osu.Game.Screens.Select.Leaderboards
} }
} }
public class LeaderboardScore class LeaderboardFade : Container
{ {
public string Name; private Box gradient;
public Texture Avatar;
public Texture Flag; protected override bool OnMouseDown(Framework.Input.InputState state, Framework.Input.MouseDownEventArgs args)
public Texture Badge; {
public int Score; if (state.Keyboard.ShiftPressed)
public double Accuracy; FadeIn();
public int MaxCombo; else
public IEnumerable<Mod> Mods; FadeOut();
return base.OnMouseDown(state, args);
}
public void FadeIn()
{
gradient.FadeColour(Color4.White, 300, EasingTypes.OutQuint);
}
public void FadeOut()
{
gradient.FadeColour(Color4.White.Opacity(0), 300, EasingTypes.OutQuint);
}
} }
} }

View File

@ -11,6 +11,8 @@ using osu.Framework.Graphics.Transforms;
using osu.Game.Graphics; using osu.Game.Graphics;
using osu.Game.Graphics.Sprites; using osu.Game.Graphics.Sprites;
using osu.Game.Modes; using osu.Game.Modes;
using osu.Framework.Graphics.Textures;
using osu.Framework.Allocation;
namespace osu.Game.Screens.Select.Leaderboards namespace osu.Game.Screens.Select.Leaderboards
{ {
@ -22,12 +24,27 @@ namespace osu.Game.Screens.Select.Leaderboards
private const float background_opacity = 0.25f; private const float background_opacity = 0.25f;
private const float score_letter_size = 20f; private const float score_letter_size = 20f;
private readonly EdgeEffect imageShadow = new EdgeEffect
{
Type = EdgeEffectType.Shadow,
Radius = 1,
Colour = Color4.Black.Opacity(0.2f),
};
private Box background; private Box background;
private Container content; private Container content;
private Sprite avatar, flag;
private FillFlowContainer<ScoreModIcon> modsContainer; private FillFlowContainer<ScoreModIcon> modsContainer;
private readonly int index; private readonly int index;
public readonly LeaderboardScore Score; public readonly Score Score;
[BackgroundDependencyLoader]
private void load(TextureStore textures)
{
avatar.Texture = textures.Get($@"https://a.ppy.sh/{Score.User.Id}") ?? textures.Get(@"Online/avatar-guest");
flag.Texture = textures.Get($@"Flags/{Score.User.FlagName}");
}
protected override bool OnHover(Framework.Input.InputState state) protected override bool OnHover(Framework.Input.InputState state)
{ {
@ -45,17 +62,18 @@ namespace osu.Game.Screens.Select.Leaderboards
{ {
base.LoadComplete(); base.LoadComplete();
FadeTo(0.01f); // TODO: This is hacky, find a better way // TODO: This is hacky, find a better way
FadeTo(0.01f);
content.MoveToX(DrawSize.X);
Delay(index * 50); Delay(index * 50);
Schedule(() => Schedule(() =>
{ {
FadeInFromZero(200); FadeInFromZero(200);
content.MoveToX(DrawSize.X);
content.MoveToX(0, 500, EasingTypes.OutQuint); content.MoveToX(0, 500, EasingTypes.OutQuint);
}); });
} }
public LeaderboardScoreDisplay(LeaderboardScore score, int i) public LeaderboardScoreDisplay(Score score, int i)
{ {
Score = score; Score = score;
index = i; index = i;
@ -112,13 +130,12 @@ namespace osu.Game.Screens.Select.Leaderboards
Size = new Vector2(height - edge_margin * 2, height - edge_margin * 2), Size = new Vector2(height - edge_margin * 2, height - edge_margin * 2),
CornerRadius = corner_radius, CornerRadius = corner_radius,
Masking = true, Masking = true,
EdgeEffect = imageShadow,
Children = new Drawable[] Children = new Drawable[]
{ {
new Sprite avatar = new Sprite
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
FillMode = FillMode.Fill,
Texture = Score.Avatar,
}, },
}, },
}, },
@ -131,7 +148,7 @@ namespace osu.Game.Screens.Select.Leaderboards
{ {
new OsuSpriteText new OsuSpriteText
{ {
Text = Score.Name, Text = Score.User?.Username,
Font = @"Exo2.0-BoldItalic", Font = @"Exo2.0-BoldItalic",
TextSize = 23, TextSize = 23,
}, },
@ -152,11 +169,10 @@ namespace osu.Game.Screens.Select.Leaderboards
Masking = true, Masking = true,
Children = new Drawable[] Children = new Drawable[]
{ {
new Sprite flag = new Sprite
{ {
RelativeSizeAxes = Axes.Y, RelativeSizeAxes = Axes.Y,
Width = 30f, Width = 30f,
Texture = Score.Flag,
}, },
new Sprite new Sprite
{ {
@ -164,7 +180,6 @@ namespace osu.Game.Screens.Select.Leaderboards
Anchor = Anchor.BottomRight, Anchor = Anchor.BottomRight,
RelativeSizeAxes = Axes.Y, RelativeSizeAxes = Axes.Y,
Width = 50f, Width = 50f,
Texture = Score.Badge,
}, },
}, },
}, },
@ -190,14 +205,11 @@ namespace osu.Game.Screens.Select.Leaderboards
Origin = Anchor.TopRight, Origin = Anchor.TopRight,
Size = new Vector2(score_letter_size), Size = new Vector2(score_letter_size),
}, },
new OsuSpriteText new GlowingSpriteText(string.Format("{0:n0}", Score.TotalScore), @"Venera", 23, Color4.White, OsuColour.FromHex(@"83ccfa"))
{ {
Anchor = Anchor.TopRight, Anchor = Anchor.TopRight,
Origin = Anchor.TopRight, Origin = Anchor.TopRight,
Position = new Vector2(-score_letter_size - 5f, 0f), Position = new Vector2(-score_letter_size - 5f, 0f),
Font = @"Venera",
Text = Score.Score.ToString(),
TextSize = 23,
}, },
modsContainer = new FillFlowContainer<ScoreModIcon> modsContainer = new FillFlowContainer<ScoreModIcon>
{ {
@ -221,6 +233,51 @@ namespace osu.Game.Screens.Select.Leaderboards
} }
} }
class GlowingSpriteText : Container
{
public GlowingSpriteText(string text, string font, int textSize, Color4 textColour, Color4 glowColour)
{
AutoSizeAxes = Axes.Both;
Children = new Drawable[]
{
new BufferedContainer
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
BlurSigma = new Vector2(4),
CacheDrawnFrameBuffer = true,
RelativeSizeAxes = Axes.Both,
BlendingMode = BlendingMode.Additive,
Size = new Vector2(3f),
Children = new[]
{
new OsuSpriteText
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Font = font,
TextSize = textSize,
Text = text,
Colour = glowColour,
Shadow = false,
},
},
},
new OsuSpriteText
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Font = font,
TextSize = textSize,
Text = text,
Colour = textColour,
Shadow = false,
},
};
}
}
class ScoreModIcon : Container class ScoreModIcon : Container
{ {
public ScoreModIcon(FontAwesome icon, Color4 colour) public ScoreModIcon(FontAwesome icon, Color4 colour)
@ -274,13 +331,10 @@ namespace osu.Game.Screens.Select.Leaderboards
Colour = OsuColour.FromHex(@"a4edff"), Colour = OsuColour.FromHex(@"a4edff"),
Scale = new Vector2(0.8f), Scale = new Vector2(0.8f),
}, },
new OsuSpriteText new GlowingSpriteText(value, @"Exo2.0-Bold", 17, Color4.White, OsuColour.FromHex(@"83ccfa"))
{ {
Origin = Anchor.CentreLeft, Origin = Anchor.CentreLeft,
Margin = new MarginPadding { Left = 15, }, Margin = new MarginPadding { Left = 15, },
Font = @"Exo2.0-Bold",
Text = value,
TextSize = 17,
}, },
}; };
} }

View File

@ -30,6 +30,7 @@ using osu.Framework.Threading;
using osu.Game.Overlays.Mods; using osu.Game.Overlays.Mods;
using osu.Game.Overlays; using osu.Game.Overlays;
using osu.Game.Screens.Select.Options; using osu.Game.Screens.Select.Options;
using osu.Game.Screens.Select.Leaderboards;
namespace osu.Game.Screens.Select namespace osu.Game.Screens.Select
{ {

View File

@ -7,5 +7,10 @@ namespace osu.Game.Users
{ {
public int Id; public int Id;
public string Username; public string Username;
/// <summary>
/// Two-letter flag acronym (ISO 3166 standard)
/// </summary>
public string FlagName;
} }
} }