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:
commit
8c4e08d280
@ -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"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
40
osu.Game/Skinning/SkinnableSpriteText.cs
Normal file
40
osu.Game/Skinning/SkinnableSpriteText.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user