1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-12 23:12:56 +08:00

Fix legacy hit target being layered incorrectly

This commit is contained in:
smoogipoo 2020-08-24 22:36:37 +09:00
parent 997ea2f27e
commit 500cb0ccf5
4 changed files with 45 additions and 16 deletions

View File

@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence. // 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. // See the LICENCE file in the repository root for full licence text.
using JetBrains.Annotations;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Graphics; using osu.Framework.Graphics;
@ -21,15 +22,20 @@ namespace osu.Game.Rulesets.Mania.Skinning
private readonly IBindable<ScrollingDirection> direction = new Bindable<ScrollingDirection>(); private readonly IBindable<ScrollingDirection> direction = new Bindable<ScrollingDirection>();
private readonly bool isLastColumn; private readonly bool isLastColumn;
private Container borderLineContainer; [CanBeNull]
private readonly LegacyStageBackground stageBackground;
private Container hitTargetContainer;
private Container lightContainer; private Container lightContainer;
private Sprite light; private Sprite light;
private Drawable hitTarget;
private float hitPosition; private float hitPosition;
public LegacyColumnBackground(bool isLastColumn) public LegacyColumnBackground(bool isLastColumn, [CanBeNull] LegacyStageBackground stageBackground)
{ {
this.isLastColumn = isLastColumn; this.isLastColumn = isLastColumn;
this.stageBackground = stageBackground;
RelativeSizeAxes = Axes.Both; RelativeSizeAxes = Axes.Both;
} }
@ -47,6 +53,7 @@ namespace osu.Game.Rulesets.Mania.Skinning
bool hasLeftLine = leftLineWidth > 0; bool hasLeftLine = leftLineWidth > 0;
bool hasRightLine = rightLineWidth > 0 && skin.GetConfig<LegacySkinConfiguration.LegacySetting, decimal>(LegacySkinConfiguration.LegacySetting.Version)?.Value >= 2.4m bool hasRightLine = rightLineWidth > 0 && skin.GetConfig<LegacySkinConfiguration.LegacySetting, decimal>(LegacySkinConfiguration.LegacySetting.Version)?.Value >= 2.4m
|| isLastColumn; || isLastColumn;
bool hasHitTarget = Column.Index == 0 || stageBackground == null;
hitPosition = GetColumnSkinConfig<float>(skin, LegacyManiaSkinConfigurationLookups.HitPosition)?.Value hitPosition = GetColumnSkinConfig<float>(skin, LegacyManiaSkinConfigurationLookups.HitPosition)?.Value
?? Stage.HIT_TARGET_POSITION; ?? Stage.HIT_TARGET_POSITION;
@ -63,18 +70,29 @@ namespace osu.Game.Rulesets.Mania.Skinning
Color4 lightColour = GetColumnSkinConfig<Color4>(skin, LegacyManiaSkinConfigurationLookups.ColumnLightColour)?.Value Color4 lightColour = GetColumnSkinConfig<Color4>(skin, LegacyManiaSkinConfigurationLookups.ColumnLightColour)?.Value
?? Color4.White; ?? Color4.White;
InternalChildren = new Drawable[] Drawable background;
InternalChildren = new[]
{ {
new Box background = new Box
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
Colour = backgroundColour Colour = backgroundColour
}, },
borderLineContainer = new Container hitTargetContainer = new Container
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
Children = new[] Children = new[]
{ {
// In legacy skins, the hit target takes on the full stage size and is sandwiched between the column background and the column light.
// To simulate this effect in lazer's hierarchy, the hit target is added to the first column's background and manually extended to the full size of the stage.
// Adding to the first columns allows depth issues to be resolved - if it were added to the last column, the previous column lights would appear below it.
// This still means that the hit target will appear below the next column backgrounds, but that's a much easier problem to solve by proxying the backgrounds below.
hitTarget = new LegacyHitTarget
{
RelativeSizeAxes = Axes.Y,
Alpha = hasHitTarget ? 1 : 0
},
new Box new Box
{ {
RelativeSizeAxes = Axes.Y, RelativeSizeAxes = Axes.Y,
@ -113,6 +131,9 @@ namespace osu.Game.Rulesets.Mania.Skinning
} }
}; };
// Resolve depth issues with the hit target appearing under the next column backgrounds by proxying to the stage background (always below the columns).
stageBackground?.AddColumnBackground(background.CreateProxy());
direction.BindTo(scrollingInfo.Direction); direction.BindTo(scrollingInfo.Direction);
direction.BindValueChanged(onDirectionChanged, true); direction.BindValueChanged(onDirectionChanged, true);
} }
@ -124,17 +145,23 @@ namespace osu.Game.Rulesets.Mania.Skinning
lightContainer.Anchor = Anchor.TopCentre; lightContainer.Anchor = Anchor.TopCentre;
lightContainer.Scale = new Vector2(1, -1); lightContainer.Scale = new Vector2(1, -1);
borderLineContainer.Padding = new MarginPadding { Top = hitPosition }; hitTargetContainer.Padding = new MarginPadding { Top = hitPosition };
} }
else else
{ {
lightContainer.Anchor = Anchor.BottomCentre; lightContainer.Anchor = Anchor.BottomCentre;
lightContainer.Scale = Vector2.One; lightContainer.Scale = Vector2.One;
borderLineContainer.Padding = new MarginPadding { Bottom = hitPosition }; hitTargetContainer.Padding = new MarginPadding { Bottom = hitPosition };
} }
} }
protected override void Update()
{
base.Update();
hitTarget.Width = stageBackground?.DrawWidth ?? DrawWidth;
}
public bool OnPressed(ManiaAction action) public bool OnPressed(ManiaAction action)
{ {
if (action == Column.Action.Value) if (action == Column.Action.Value)

View File

@ -20,11 +20,6 @@ namespace osu.Game.Rulesets.Mania.Skinning
private Container directionContainer; private Container directionContainer;
public LegacyHitTarget()
{
RelativeSizeAxes = Axes.Both;
}
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(ISkinSource skin, IScrollingInfo scrollingInfo) private void load(ISkinSource skin, IScrollingInfo scrollingInfo)
{ {

View File

@ -14,6 +14,7 @@ namespace osu.Game.Rulesets.Mania.Skinning
{ {
private Drawable leftSprite; private Drawable leftSprite;
private Drawable rightSprite; private Drawable rightSprite;
private Container columnBackgroundContainer;
public LegacyStageBackground() public LegacyStageBackground()
{ {
@ -44,7 +45,8 @@ namespace osu.Game.Rulesets.Mania.Skinning
Origin = Anchor.TopLeft, Origin = Anchor.TopLeft,
X = -0.05f, X = -0.05f,
Texture = skin.GetTexture(rightImage) Texture = skin.GetTexture(rightImage)
} },
columnBackgroundContainer = new Container { RelativeSizeAxes = Axes.Both }
}; };
} }
@ -58,5 +60,7 @@ namespace osu.Game.Rulesets.Mania.Skinning
if (rightSprite?.Height > 0) if (rightSprite?.Height > 0)
rightSprite.Scale = new Vector2(1, DrawHeight / rightSprite.Height); rightSprite.Scale = new Vector2(1, DrawHeight / rightSprite.Height);
} }
public void AddColumnBackground(Drawable background) => columnBackgroundContainer.Add(background);
} }
} }

View File

@ -57,6 +57,8 @@ namespace osu.Game.Rulesets.Mania.Skinning
/// </summary> /// </summary>
private Lazy<bool> hasKeyTexture; private Lazy<bool> hasKeyTexture;
private LegacyStageBackground stageBackground;
public ManiaLegacySkinTransformer(ISkinSource source, IBeatmap beatmap) public ManiaLegacySkinTransformer(ISkinSource source, IBeatmap beatmap)
: base(source) : base(source)
{ {
@ -88,10 +90,11 @@ namespace osu.Game.Rulesets.Mania.Skinning
switch (maniaComponent.Component) switch (maniaComponent.Component)
{ {
case ManiaSkinComponents.ColumnBackground: case ManiaSkinComponents.ColumnBackground:
return new LegacyColumnBackground(maniaComponent.TargetColumn == beatmap.TotalColumns - 1); return new LegacyColumnBackground(maniaComponent.TargetColumn == beatmap.TotalColumns - 1, stageBackground);
case ManiaSkinComponents.HitTarget: case ManiaSkinComponents.HitTarget:
return new LegacyHitTarget(); // Created within the column background, but should not fall back. See comments in LegacyColumnBackground.
return Drawable.Empty();
case ManiaSkinComponents.KeyArea: case ManiaSkinComponents.KeyArea:
return new LegacyKeyArea(); return new LegacyKeyArea();
@ -112,7 +115,7 @@ namespace osu.Game.Rulesets.Mania.Skinning
return new LegacyHitExplosion(); return new LegacyHitExplosion();
case ManiaSkinComponents.StageBackground: case ManiaSkinComponents.StageBackground:
return new LegacyStageBackground(); return stageBackground = new LegacyStageBackground();
case ManiaSkinComponents.StageForeground: case ManiaSkinComponents.StageForeground:
return new LegacyStageForeground(); return new LegacyStageForeground();