Add basic skinning test
BIN
osu.Game.Rulesets.Osu.Tests/Resources/default-skin/approachcircle@2x.png
Executable file
After Width: | Height: | Size: 18 KiB |
BIN
osu.Game.Rulesets.Osu.Tests/Resources/default-skin/hit300k@2x.png
Executable file
After Width: | Height: | Size: 28 KiB |
BIN
osu.Game.Rulesets.Osu.Tests/Resources/default-skin/hitcircle@2x.png
Executable file
After Width: | Height: | Size: 7.6 KiB |
BIN
osu.Game.Rulesets.Osu.Tests/Resources/default-skin/hitcircleoverlay@2x.png
Executable file
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 37 KiB |
BIN
osu.Game.Rulesets.Osu.Tests/Resources/special-skin/approachcircle@2x.png
Executable file
After Width: | Height: | Size: 31 KiB |
BIN
osu.Game.Rulesets.Osu.Tests/Resources/special-skin/hitcircle@2x.png
Executable file
After Width: | Height: | Size: 257 KiB |
BIN
osu.Game.Rulesets.Osu.Tests/Resources/special-skin/hitcircleoverlay@2x.png
Executable file
After Width: | Height: | Size: 256 KiB |
66
osu.Game.Rulesets.Osu.Tests/SkinnableTestScene.cs
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
// 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 System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Audio;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Framework.IO.Stores;
|
||||||
|
using osu.Game.Skinning;
|
||||||
|
using osu.Game.Tests.Visual;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Osu.Tests
|
||||||
|
{
|
||||||
|
public abstract class SkinnableTestScene : OsuGridTestScene
|
||||||
|
{
|
||||||
|
private static Skin getSkinFromResources(SkinManager skins, string name)
|
||||||
|
{
|
||||||
|
using (var storage = new DllResourceStore("osu.Game.Rulesets.Osu.Tests.dll"))
|
||||||
|
{
|
||||||
|
var tempName = Path.GetTempFileName();
|
||||||
|
|
||||||
|
File.Delete(tempName);
|
||||||
|
Directory.CreateDirectory(tempName);
|
||||||
|
|
||||||
|
var files = storage.GetAvailableResources().Where(f => f.StartsWith($"Resources/{name}"));
|
||||||
|
|
||||||
|
foreach (var file in files)
|
||||||
|
using (var stream = storage.GetStream(file))
|
||||||
|
using (var newFile = File.Create(Path.Combine(tempName, Path.GetFileName(file))))
|
||||||
|
stream.CopyTo(newFile);
|
||||||
|
|
||||||
|
return skins.GetSkin(skins.Import(tempName).Result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Skin metricsSkin;
|
||||||
|
private Skin defaultSkin;
|
||||||
|
private Skin specialSkin;
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load(AudioManager audio)
|
||||||
|
{
|
||||||
|
var skins = new SkinManager(LocalStorage, ContextFactory, null, audio);
|
||||||
|
|
||||||
|
metricsSkin = getSkinFromResources(skins, "metrics_skin");
|
||||||
|
defaultSkin = getSkinFromResources(skins, "default_skin");
|
||||||
|
specialSkin = getSkinFromResources(skins, "special_skin");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetContents(Func<Drawable> creationFunction)
|
||||||
|
{
|
||||||
|
Cell(0).Child = new LocalSkinOverrideContainer(null) { RelativeSizeAxes = Axes.Both }.WithChild(creationFunction());
|
||||||
|
Cell(1).Child = new LocalSkinOverrideContainer(metricsSkin) { RelativeSizeAxes = Axes.Both }.WithChild(creationFunction());
|
||||||
|
Cell(2).Child = new LocalSkinOverrideContainer(defaultSkin) { RelativeSizeAxes = Axes.Both }.WithChild(creationFunction());
|
||||||
|
Cell(3).Child = new LocalSkinOverrideContainer(specialSkin) { RelativeSizeAxes = Axes.Both }.WithChild(creationFunction());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected SkinnableTestScene()
|
||||||
|
: base(2, 2)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -7,7 +7,6 @@ using osu.Game.Beatmaps;
|
|||||||
using osu.Game.Beatmaps.ControlPoints;
|
using osu.Game.Beatmaps.ControlPoints;
|
||||||
using osu.Game.Rulesets.Osu.Objects;
|
using osu.Game.Rulesets.Osu.Objects;
|
||||||
using osu.Game.Rulesets.Osu.Objects.Drawables;
|
using osu.Game.Rulesets.Osu.Objects.Drawables;
|
||||||
using osu.Game.Tests.Visual;
|
|
||||||
using osuTK;
|
using osuTK;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System;
|
using System;
|
||||||
@ -19,37 +18,32 @@ using osu.Game.Rulesets.Scoring;
|
|||||||
namespace osu.Game.Rulesets.Osu.Tests
|
namespace osu.Game.Rulesets.Osu.Tests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class TestSceneHitCircle : OsuTestScene
|
public class TestSceneHitCircle : SkinnableTestScene
|
||||||
{
|
{
|
||||||
public override IReadOnlyList<Type> RequiredTypes => new[]
|
public override IReadOnlyList<Type> RequiredTypes => new[]
|
||||||
{
|
{
|
||||||
typeof(DrawableHitCircle)
|
typeof(DrawableHitCircle)
|
||||||
};
|
};
|
||||||
|
|
||||||
private readonly Container content;
|
|
||||||
protected override Container<Drawable> Content => content;
|
|
||||||
|
|
||||||
private int depthIndex;
|
private int depthIndex;
|
||||||
|
|
||||||
public TestSceneHitCircle()
|
public TestSceneHitCircle()
|
||||||
{
|
{
|
||||||
base.Content.Add(content = new OsuInputManager(new RulesetInfo { ID = 0 }));
|
AddStep("Miss Big Single", () => SetContents(() => testSingle(2)));
|
||||||
|
AddStep("Miss Medium Single", () => SetContents(() => testSingle(5)));
|
||||||
AddStep("Miss Big Single", () => testSingle(2));
|
AddStep("Miss Small Single", () => SetContents(() => testSingle(7)));
|
||||||
AddStep("Miss Medium Single", () => testSingle(5));
|
AddStep("Hit Big Single", () => SetContents(() => testSingle(2, true)));
|
||||||
AddStep("Miss Small Single", () => testSingle(7));
|
AddStep("Hit Medium Single", () => SetContents(() => testSingle(5, true)));
|
||||||
AddStep("Hit Big Single", () => testSingle(2, true));
|
AddStep("Hit Small Single", () => SetContents(() => testSingle(7, true)));
|
||||||
AddStep("Hit Medium Single", () => testSingle(5, true));
|
AddStep("Miss Big Stream", () => SetContents(() => testStream(2)));
|
||||||
AddStep("Hit Small Single", () => testSingle(7, true));
|
AddStep("Miss Medium Stream", () => SetContents(() => testStream(5)));
|
||||||
AddStep("Miss Big Stream", () => testStream(2));
|
AddStep("Miss Small Stream", () => SetContents(() => testStream(7)));
|
||||||
AddStep("Miss Medium Stream", () => testStream(5));
|
AddStep("Hit Big Stream", () => SetContents(() => testStream(2, true)));
|
||||||
AddStep("Miss Small Stream", () => testStream(7));
|
AddStep("Hit Medium Stream", () => SetContents(() => testStream(5, true)));
|
||||||
AddStep("Hit Big Stream", () => testStream(2, true));
|
AddStep("Hit Small Stream", () => SetContents(() => testStream(7, true)));
|
||||||
AddStep("Hit Medium Stream", () => testStream(5, true));
|
|
||||||
AddStep("Hit Small Stream", () => testStream(7, true));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void testSingle(float circleSize, bool auto = false, double timeOffset = 0, Vector2? positionOffset = null)
|
private Drawable testSingle(float circleSize, bool auto = false, double timeOffset = 0, Vector2? positionOffset = null)
|
||||||
{
|
{
|
||||||
positionOffset = positionOffset ?? Vector2.Zero;
|
positionOffset = positionOffset ?? Vector2.Zero;
|
||||||
|
|
||||||
@ -70,18 +64,22 @@ namespace osu.Game.Rulesets.Osu.Tests
|
|||||||
foreach (var mod in Mods.Value.OfType<IApplicableToDrawableHitObjects>())
|
foreach (var mod in Mods.Value.OfType<IApplicableToDrawableHitObjects>())
|
||||||
mod.ApplyToDrawableHitObjects(new[] { drawable });
|
mod.ApplyToDrawableHitObjects(new[] { drawable });
|
||||||
|
|
||||||
Add(drawable);
|
return drawable;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void testStream(float circleSize, bool auto = false)
|
private Drawable testStream(float circleSize, bool auto = false)
|
||||||
{
|
{
|
||||||
|
var container = new Container { RelativeSizeAxes = Axes.Both };
|
||||||
|
|
||||||
Vector2 pos = new Vector2(-250, 0);
|
Vector2 pos = new Vector2(-250, 0);
|
||||||
|
|
||||||
for (int i = 0; i <= 1000; i += 100)
|
for (int i = 0; i <= 1000; i += 100)
|
||||||
{
|
{
|
||||||
testSingle(circleSize, auto, i, pos);
|
container.Add(testSingle(circleSize, auto, i, pos));
|
||||||
pos.X += 50;
|
pos.X += 50;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return container;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected class TestDrawableHitCircle : DrawableHitCircle
|
protected class TestDrawableHitCircle : DrawableHitCircle
|
||||||
|
@ -45,7 +45,7 @@ namespace osu.Game.Skinning
|
|||||||
CurrentSkinInfo.Value = SkinInfo.Default;
|
CurrentSkinInfo.Value = SkinInfo.Default;
|
||||||
};
|
};
|
||||||
|
|
||||||
CurrentSkinInfo.ValueChanged += skin => CurrentSkin.Value = getSkin(skin.NewValue);
|
CurrentSkinInfo.ValueChanged += skin => CurrentSkin.Value = GetSkin(skin.NewValue);
|
||||||
CurrentSkin.ValueChanged += skin =>
|
CurrentSkin.ValueChanged += skin =>
|
||||||
{
|
{
|
||||||
if (skin.NewValue.SkinInfo != CurrentSkinInfo.Value)
|
if (skin.NewValue.SkinInfo != CurrentSkinInfo.Value)
|
||||||
@ -80,7 +80,7 @@ namespace osu.Game.Skinning
|
|||||||
{
|
{
|
||||||
await base.Populate(model, archive, cancellationToken);
|
await base.Populate(model, archive, cancellationToken);
|
||||||
|
|
||||||
Skin reference = getSkin(model);
|
Skin reference = GetSkin(model);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(reference.Configuration.SkinInfo.Name))
|
if (!string.IsNullOrEmpty(reference.Configuration.SkinInfo.Name))
|
||||||
{
|
{
|
||||||
@ -99,7 +99,7 @@ namespace osu.Game.Skinning
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="skinInfo">The skin to lookup.</param>
|
/// <param name="skinInfo">The skin to lookup.</param>
|
||||||
/// <returns>A <see cref="Skin"/> instance correlating to the provided <see cref="SkinInfo"/>.</returns>
|
/// <returns>A <see cref="Skin"/> instance correlating to the provided <see cref="SkinInfo"/>.</returns>
|
||||||
private Skin getSkin(SkinInfo skinInfo)
|
public Skin GetSkin(SkinInfo skinInfo)
|
||||||
{
|
{
|
||||||
if (skinInfo == SkinInfo.Default)
|
if (skinInfo == SkinInfo.Default)
|
||||||
return new DefaultSkin();
|
return new DefaultSkin();
|
||||||
|
@ -5,7 +5,7 @@ using osu.Framework.Extensions;
|
|||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
|
|
||||||
namespace osu.Game.Tests.Visual.UserInterface
|
namespace osu.Game.Tests.Visual
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// An abstract test case which exposes small cells arranged in a grid.
|
/// An abstract test case which exposes small cells arranged in a grid.
|
@ -35,7 +35,7 @@
|
|||||||
<DefineConstants></DefineConstants>
|
<DefineConstants></DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
<CodesignKey>iPhone Distribution</CodesignKey>
|
<CodesignKey>iPhone Developer</CodesignKey>
|
||||||
<MtouchUseLlvm>true</MtouchUseLlvm>
|
<MtouchUseLlvm>true</MtouchUseLlvm>
|
||||||
<MtouchFloat32>true</MtouchFloat32>
|
<MtouchFloat32>true</MtouchFloat32>
|
||||||
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
|
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
|
||||||
|