1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-14 17:17:24 +08:00

Merge branch 'master' of https://github.com/qwewqa/osu into mania-dual-fix

This commit is contained in:
Kyle Chang 2018-10-28 12:02:18 -04:00
commit 8c4e08d280
6 changed files with 140 additions and 33 deletions

View File

@ -4,7 +4,6 @@
using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites;
using osu.Game.Graphics.Sprites; using osu.Game.Graphics.Sprites;
using OpenTK.Graphics; using OpenTK.Graphics;
using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.Shapes;
@ -14,7 +13,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
{ {
public class NumberPiece : Container public class NumberPiece : Container
{ {
private readonly SpriteText number; private readonly SkinnableSpriteText number;
public string Text public string Text
{ {
@ -41,15 +40,14 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
}, },
Child = new Box() Child = new Box()
}, s => s.GetTexture("Play/osu/hitcircle") == null), }, s => s.GetTexture("Play/osu/hitcircle") == null),
number = new OsuSpriteText number = new SkinnableSpriteText("Play/osu/number-text", _ => new OsuSpriteText
{ {
Text = @"1",
Font = @"Venera", Font = @"Venera",
UseFullGlyphHeight = false, UseFullGlyphHeight = false,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
TextSize = 40, TextSize = 40,
Alpha = 1 }, restrictSize: false)
{
Text = @"1"
} }
}; };
} }

View File

@ -12,6 +12,7 @@ using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.Textures; using osu.Framework.Graphics.Textures;
using osu.Framework.IO.Stores; using osu.Framework.IO.Stores;
using osu.Game.Database; using osu.Game.Database;
using osu.Game.Graphics.Sprites;
using OpenTK; using OpenTK;
namespace osu.Game.Skinning namespace osu.Game.Skinning
@ -56,30 +57,39 @@ namespace osu.Game.Skinning
case "Play/Great": case "Play/Great":
componentName = "hit300"; componentName = "hit300";
break; break;
case "Play/osu/number-text":
return !hasFont(Configuration.HitCircleFont) ? null : new LegacySpriteText(Textures, Configuration.HitCircleFont) { Scale = new Vector2(0.96f) };
} }
float ratio = 0.72f; // brings sizing roughly in-line with stable var texture = GetTexture(componentName);
var texture = GetTexture($"{componentName}@2x");
if (texture == null) if (texture == null)
{ return null;
ratio *= 2;
texture = GetTexture(componentName);
}
if (texture == null) return null; return new Sprite { Texture = texture };
return new Sprite
{
Texture = texture,
Scale = new Vector2(ratio),
};
} }
public override Texture GetTexture(string componentName) => Textures.Get(componentName); public override Texture GetTexture(string componentName)
{
float ratio = 2;
var texture = Textures.Get($"{componentName}@2x");
if (texture == null)
{
ratio = 1;
texture = Textures.Get(componentName);
}
if (texture != null)
texture.ScaleAdjust = ratio / 0.72f; // brings sizing roughly in-line with stable
return texture;
}
public override SampleChannel GetSample(string sampleName) => Samples.Get(sampleName); public override SampleChannel GetSample(string sampleName) => Samples.Get(sampleName);
private bool hasFont(string fontName) => GetTexture($"{fontName}-0") != null;
protected class LegacySkinResourceStore<T> : IResourceStore<byte[]> protected class LegacySkinResourceStore<T> : IResourceStore<byte[]>
where T : INamedFileInfo where T : INamedFileInfo
{ {
@ -142,5 +152,40 @@ namespace osu.Game.Skinning
#endregion #endregion
} }
private class LegacySpriteText : OsuSpriteText
{
private readonly TextureStore textures;
private readonly string font;
public LegacySpriteText(TextureStore textures, string font)
{
this.textures = textures;
this.font = font;
Shadow = false;
UseFullGlyphHeight = false;
}
protected override Texture GetTextureForCharacter(char c)
{
string textureName = $"{font}-{c}";
// Approximate value that brings character sizing roughly in-line with stable
float ratio = 36;
var texture = textures.Get($"{textureName}@2x");
if (texture == null)
{
ratio = 18;
texture = textures.Get(textureName);
}
if (texture != null)
texture.ScaleAdjust = ratio;
return texture;
}
}
} }
} }

View File

@ -19,6 +19,7 @@ namespace osu.Game.Skinning
switch (section) switch (section)
{ {
case Section.General: case Section.General:
{
var pair = SplitKeyVal(line); var pair = SplitKeyVal(line);
switch (pair.Key) switch (pair.Key)
@ -32,6 +33,20 @@ namespace osu.Game.Skinning
} }
break; break;
}
case Section.Fonts:
{
var pair = SplitKeyVal(line);
switch (pair.Key)
{
case "HitCirclePrefix":
skin.HitCircleFont = pair.Value;
break;
}
break;
}
} }
base.ParseLine(skin, section, line); base.ParseLine(skin, section, line);

View File

@ -14,5 +14,7 @@ namespace osu.Game.Skinning
public List<Color4> ComboColours { get; set; } = new List<Color4>(); public List<Color4> ComboColours { get; set; } = new List<Color4>();
public Dictionary<string, Color4> CustomColours { get; set; } = new Dictionary<string, Color4>(); public Dictionary<string, Color4> CustomColours { get; set; } = new Dictionary<string, Color4>();
public string HitCircleFont { get; set; } = "default";
} }
} }

View File

@ -18,6 +18,11 @@ namespace osu.Game.Skinning
public class SkinnableDrawable<T> : SkinReloadableDrawable public class SkinnableDrawable<T> : SkinReloadableDrawable
where T : Drawable where T : Drawable
{ {
/// <summary>
/// The displayed component. May or may not be a type-<typeparamref name="T"/> member.
/// </summary>
protected Drawable Drawable { get; private set; }
private readonly Func<string, T> createDefault; private readonly Func<string, T> createDefault;
private readonly string componentName; private readonly string componentName;
@ -31,7 +36,8 @@ namespace osu.Game.Skinning
/// <param name="defaultImplementation">A function to create the default skin implementation of this element.</param> /// <param name="defaultImplementation">A function to create the default skin implementation of this element.</param>
/// <param name="allowFallback">A conditional to decide whether to allow fallback to the default implementation if a skinned element is not present.</param> /// <param name="allowFallback">A conditional to decide whether to allow fallback to the default implementation if a skinned element is not present.</param>
/// <param name="restrictSize">Whether a user-skin drawable should be limited to the size of our parent.</param> /// <param name="restrictSize">Whether a user-skin drawable should be limited to the size of our parent.</param>
public SkinnableDrawable(string name, Func<string, T> defaultImplementation, Func<ISkinSource, bool> allowFallback = null, bool restrictSize = true) : base(allowFallback) public SkinnableDrawable(string name, Func<string, T> defaultImplementation, Func<ISkinSource, bool> allowFallback = null, bool restrictSize = true)
: base(allowFallback)
{ {
componentName = name; componentName = name;
createDefault = defaultImplementation; createDefault = defaultImplementation;
@ -42,26 +48,27 @@ namespace osu.Game.Skinning
protected override void SkinChanged(ISkinSource skin, bool allowFallback) protected override void SkinChanged(ISkinSource skin, bool allowFallback)
{ {
var drawable = skin.GetDrawableComponent(componentName); Drawable = skin.GetDrawableComponent(componentName);
if (drawable != null)
if (Drawable != null)
{ {
if (restrictSize) if (restrictSize)
{ {
drawable.RelativeSizeAxes = Axes.Both; Drawable.RelativeSizeAxes = Axes.Both;
drawable.Size = Vector2.One; Drawable.Size = Vector2.One;
drawable.Scale = Vector2.One; Drawable.Scale = Vector2.One;
drawable.FillMode = FillMode.Fit; Drawable.FillMode = FillMode.Fit;
} }
} }
else if (allowFallback) else if (allowFallback)
drawable = createDefault(componentName); Drawable = createDefault(componentName);
if (drawable != null) if (Drawable != null)
{ {
drawable.Origin = Anchor.Centre; Drawable.Origin = Anchor.Centre;
drawable.Anchor = Anchor.Centre; Drawable.Anchor = Anchor.Centre;
InternalChild = drawable; InternalChild = Drawable;
} }
else else
ClearInternal(); ClearInternal();

View File

@ -0,0 +1,40 @@
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System;
using osu.Framework.Graphics.Sprites;
namespace osu.Game.Skinning
{
public class SkinnableSpriteText : SkinnableDrawable<SpriteText>, IHasText
{
public SkinnableSpriteText(string name, Func<string, SpriteText> defaultImplementation, Func<ISkinSource, bool> allowFallback = null, bool restrictSize = true)
: base(name, defaultImplementation, allowFallback, restrictSize)
{
}
protected override void SkinChanged(ISkinSource skin, bool allowFallback)
{
base.SkinChanged(skin, allowFallback);
if (Drawable is IHasText textDrawable)
textDrawable.Text = Text;
}
private string text;
public string Text
{
get => text;
set
{
if (text == value)
return;
text = value;
if (Drawable is IHasText textDrawable)
textDrawable.Text = value;
}
}
}
}