Define constant input drum width for osu!taiko

This commit is contained in:
Salman Ahmed 2024-01-19 23:26:35 +03:00
parent 0c03326eaf
commit d4fef99e1f
6 changed files with 24 additions and 44 deletions

View File

@ -30,8 +30,11 @@ private void load()
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Size = new Vector2(200),
Child = new InputDrum()
Size = new Vector2(180f, 200f),
Child = new InputDrum
{
RelativeSizeAxes = Axes.Both,
}
}
});
}

View File

@ -37,7 +37,7 @@ public partial class ArgonInputDrum : AspectContainer
public ArgonInputDrum()
{
RelativeSizeAxes = Axes.Y;
RelativeSizeAxes = Axes.X;
}
[BackgroundDependencyLoader]

View File

@ -19,7 +19,7 @@ public partial class DefaultInputDrum : AspectContainer
{
public DefaultInputDrum()
{
RelativeSizeAxes = Axes.Y;
RelativeSizeAxes = Axes.X;
}
[BackgroundDependencyLoader]

View File

@ -8,6 +8,7 @@
using osu.Framework.Graphics.Sprites;
using osu.Framework.Input.Bindings;
using osu.Framework.Input.Events;
using osu.Game.Rulesets.Taiko.UI;
using osu.Game.Skinning;
using osuTK;
@ -18,22 +19,20 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Legacy
/// </summary>
internal partial class LegacyInputDrum : Container
{
private Container content = null!;
private LegacyHalfDrum left = null!;
private LegacyHalfDrum right = null!;
public LegacyInputDrum()
{
RelativeSizeAxes = Axes.Y;
AutoSizeAxes = Axes.X;
RelativeSizeAxes = Axes.Both;
}
[BackgroundDependencyLoader]
private void load(ISkinSource skin)
{
Child = content = new Container
Child = new Container
{
Size = new Vector2(180, 200),
RelativeSizeAxes = Axes.Both,
Children = new Drawable[]
{
new Sprite
@ -66,33 +65,24 @@ private void load(ISkinSource skin)
const float ratio = 1.6f;
// because the right half is flipped, we need to position using width - position to get the true "topleft" origin position
float negativeScaleAdjust = content.Width / ratio;
const float negative_scale_adjust = TaikoPlayfield.INPUT_DRUM_WIDTH / ratio;
if (skin.GetConfig<SkinConfiguration.LegacySetting, decimal>(SkinConfiguration.LegacySetting.Version)?.Value >= 2.1m)
{
left.Centre.Position = new Vector2(0, taiko_bar_y) * ratio;
right.Centre.Position = new Vector2(negativeScaleAdjust - 56, taiko_bar_y) * ratio;
right.Centre.Position = new Vector2(negative_scale_adjust - 56, taiko_bar_y) * ratio;
left.Rim.Position = new Vector2(0, taiko_bar_y) * ratio;
right.Rim.Position = new Vector2(negativeScaleAdjust - 56, taiko_bar_y) * ratio;
right.Rim.Position = new Vector2(negative_scale_adjust - 56, taiko_bar_y) * ratio;
}
else
{
left.Centre.Position = new Vector2(18, taiko_bar_y + 31) * ratio;
right.Centre.Position = new Vector2(negativeScaleAdjust - 54, taiko_bar_y + 31) * ratio;
right.Centre.Position = new Vector2(negative_scale_adjust - 54, taiko_bar_y + 31) * ratio;
left.Rim.Position = new Vector2(8, taiko_bar_y + 23) * ratio;
right.Rim.Position = new Vector2(negativeScaleAdjust - 53, taiko_bar_y + 23) * ratio;
right.Rim.Position = new Vector2(negative_scale_adjust - 53, taiko_bar_y + 23) * ratio;
}
}
protected override void Update()
{
base.Update();
// Relying on RelativeSizeAxes.Both + FillMode.Fit doesn't work due to the precise pixel layout requirements.
// This is a bit ugly but makes the non-legacy implementations a lot cleaner to implement.
content.Scale = new Vector2(DrawHeight / content.Size.Y);
}
/// <summary>
/// A half-drum. Contains one centre and one rim hit.
/// </summary>

View File

@ -14,12 +14,6 @@ namespace osu.Game.Rulesets.Taiko.UI
/// </summary>
internal partial class InputDrum : Container
{
public InputDrum()
{
AutoSizeAxes = Axes.X;
RelativeSizeAxes = Axes.Y;
}
[BackgroundDependencyLoader]
private void load()
{
@ -27,8 +21,7 @@ private void load()
{
new SkinnableDrawable(new TaikoSkinComponentLookup(TaikoSkinComponents.InputDrum), _ => new DefaultInputDrum())
{
RelativeSizeAxes = Axes.Y,
AutoSizeAxes = Axes.X,
RelativeSizeAxes = Axes.Both,
},
};
}

View File

@ -31,6 +31,8 @@ public partial class TaikoPlayfield : ScrollingPlayfield
/// </summary>
public const float BASE_HEIGHT = 200;
public const float INPUT_DRUM_WIDTH = 180f;
/// <summary>
/// Whether the hit target should be nudged further towards the left area, matching the stable "classic" position.
/// </summary>
@ -49,7 +51,6 @@ public partial class TaikoPlayfield : ScrollingPlayfield
private ProxyContainer topLevelHitContainer = null!;
private InputDrum inputDrum = null!;
private Container rightArea = null!;
/// <remarks>
/// <see cref="Playfield.AddNested"/> is purposefully not called on this to prevent i.e. being able to interact
@ -66,8 +67,8 @@ private void load(OsuColour colours)
{
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
AutoSizeAxes = Axes.X,
RelativeSizeAxes = Axes.Y,
Width = INPUT_DRUM_WIDTH,
};
InternalChildren = new[]
@ -76,8 +77,8 @@ private void load(OsuColour colours)
new Container
{
Name = "Left overlay",
RelativeSizeAxes = Axes.Both,
FillMode = FillMode.Fit,
RelativeSizeAxes = Axes.Y,
Width = INPUT_DRUM_WIDTH,
BorderColour = colours.Gray0,
Children = new[]
{
@ -93,10 +94,11 @@ private void load(OsuColour colours)
RelativeSizeAxes = Axes.None,
Y = 0.2f
},
rightArea = new Container
new Container
{
Name = "Right area",
RelativeSizeAxes = Axes.Both,
Padding = new MarginPadding { Left = INPUT_DRUM_WIDTH },
Children = new Drawable[]
{
new Container
@ -220,14 +222,6 @@ protected override void OnNewDrawableHitObject(DrawableHitObject drawableHitObje
topLevelHitContainer.Add(taikoObject.CreateProxiedContent());
}
protected override void Update()
{
base.Update();
// todo: input drum width should be constant.
rightArea.Padding = new MarginPadding { Left = inputDrum.DrawWidth };
}
#region Pooling support
public override void Add(HitObject h)