diff --git a/osu.Game/Rulesets/UI/Playfield.cs b/osu.Game/Rulesets/UI/Playfield.cs
index a7fed7059b..bbf20c2c26 100644
--- a/osu.Game/Rulesets/UI/Playfield.cs
+++ b/osu.Game/Rulesets/UI/Playfield.cs
@@ -3,52 +3,37 @@
using System.Collections.Generic;
using osu.Framework.Graphics;
-using osu.Framework.Graphics.Containers;
using osu.Game.Rulesets.Objects.Drawables;
-using OpenTK;
using osu.Framework.Allocation;
namespace osu.Game.Rulesets.UI
{
- public abstract class Playfield : Container
+ public abstract class Playfield : ScalableContainer
{
///
/// The HitObjects contained in this Playfield.
///
public HitObjectContainer HitObjects { get; private set; }
- public Container ScaledContent;
-
- protected override Container Content => content;
- private readonly Container content;
-
- private List nestedPlayfields;
-
///
/// All the s nested inside this playfield.
///
public IReadOnlyList NestedPlayfields => nestedPlayfields;
+ private List nestedPlayfields;
///
/// A container for keeping track of DrawableHitObjects.
///
- /// Whether we want our internal coordinate system to be scaled to a specified width.
- protected Playfield(float? customWidth = null)
+ /// The width to scale the internal coordinate space to.
+ /// May be null if scaling based on is desired. If is also null, no scaling will occur.
+ ///
+ /// The height to scale the internal coordinate space to.
+ /// May be null if scaling based on is desired. If is also null, no scaling will occur.
+ ///
+ protected Playfield(float? customWidth = null, float? customHeight = null)
+ : base(customWidth, customHeight)
{
RelativeSizeAxes = Axes.Both;
-
- AddInternal(ScaledContent = new ScaledContainer
- {
- CustomWidth = customWidth,
- RelativeSizeAxes = Axes.Both,
- Children = new[]
- {
- content = new Container
- {
- RelativeSizeAxes = Axes.Both,
- }
- }
- });
}
[BackgroundDependencyLoader]
@@ -94,22 +79,5 @@ namespace osu.Game.Rulesets.UI
/// Creates the container that will be used to contain the s.
///
protected virtual HitObjectContainer CreateHitObjectContainer() => new HitObjectContainer();
-
- private class ScaledContainer : Container
- {
- ///
- /// A value (in game pixels that we should scale our content to match).
- ///
- public float? CustomWidth;
-
- //dividing by the customwidth will effectively scale our content to the required container size.
- protected override Vector2 DrawScale => CustomWidth.HasValue ? new Vector2(DrawSize.X / CustomWidth.Value) : base.DrawScale;
-
- protected override void Update()
- {
- base.Update();
- RelativeChildSize = new Vector2(DrawScale.X, RelativeChildSize.Y);
- }
- }
}
}
diff --git a/osu.Game/Rulesets/UI/ScalableContainer.cs b/osu.Game/Rulesets/UI/ScalableContainer.cs
new file mode 100644
index 0000000000..e1c1427470
--- /dev/null
+++ b/osu.Game/Rulesets/UI/ScalableContainer.cs
@@ -0,0 +1,86 @@
+// Copyright (c) 2007-2018 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using OpenTK;
+
+namespace osu.Game.Rulesets.UI
+{
+ ///
+ /// A which can have its internal coordinate system scaled to a specific size.
+ ///
+ public class ScalableContainer : Container
+ {
+ ///
+ /// The scaled content.
+ ///
+ public readonly Container ScaledContent;
+
+ protected override Container Content => content;
+ private readonly Container content;
+
+ ///
+ /// A which can have its internal coordinate system scaled to a specific size.
+ ///
+ /// The width to scale the internal coordinate space to.
+ /// May be null if scaling based on is desired. If is also null, no scaling will occur.
+ ///
+ /// The height to scale the internal coordinate space to.
+ /// May be null if scaling based on is desired. If is also null, no scaling will occur.
+ ///
+ public ScalableContainer(float? customWidth = null, float? customHeight = null)
+ {
+ AddInternal(ScaledContent = new ScaledContainer
+ {
+ CustomWidth = customWidth,
+ CustomHeight = customHeight,
+ RelativeSizeAxes = Axes.Both,
+ Child = content = new Container { RelativeSizeAxes = Axes.Both }
+ });
+ }
+
+ public class ScaledContainer : Container
+ {
+ ///
+ /// The value to scale the width of the content to match.
+ /// If null, is used.
+ ///
+ public float? CustomWidth;
+
+ ///
+ /// The value to scale the height of the content to match.
+ /// if null, is used.
+ ///
+ public float? CustomHeight;
+
+ ///
+ /// The scale that is required for the size of the content to match and .
+ ///
+ private Vector2 sizeScale
+ {
+ get
+ {
+ if (CustomWidth.HasValue && CustomHeight.HasValue)
+ return Vector2.Divide(DrawSize, new Vector2(CustomWidth.Value, CustomHeight.Value));
+ if (CustomWidth.HasValue)
+ return new Vector2(DrawSize.X / CustomWidth.Value);
+ if (CustomHeight.HasValue)
+ return new Vector2(DrawSize.Y / CustomHeight.Value);
+ return Vector2.One;
+ }
+ }
+
+ ///
+ /// Scale the content to the required container size by multiplying by .
+ ///
+ protected override Vector2 DrawScale => sizeScale * base.DrawScale;
+
+ protected override void Update()
+ {
+ base.Update();
+ RelativeChildSize = sizeScale;
+ }
+ }
+ }
+}
diff --git a/osu.Game/Rulesets/UI/Scrolling/ScrollingPlayfield.cs b/osu.Game/Rulesets/UI/Scrolling/ScrollingPlayfield.cs
index e168f6daec..1c1c8f7f61 100644
--- a/osu.Game/Rulesets/UI/Scrolling/ScrollingPlayfield.cs
+++ b/osu.Game/Rulesets/UI/Scrolling/ScrollingPlayfield.cs
@@ -62,9 +62,14 @@ namespace osu.Game.Rulesets.UI.Scrolling
/// Creates a new .
///
/// The direction in which s in this container should scroll.
- /// Whether we want our internal coordinate system to be scaled to a specified width
- protected ScrollingPlayfield(ScrollingDirection direction, float? customWidth = null)
- : base(customWidth)
+ /// The width to scale the internal coordinate space to.
+ /// May be null if scaling based on is desired. If is also null, no scaling will occur.
+ ///
+ /// The height to scale the internal coordinate space to.
+ /// May be null if scaling based on is desired. If is also null, no scaling will occur.
+ ///
+ protected ScrollingPlayfield(ScrollingDirection direction, float? customWidth = null, float? customHeight = null)
+ : base(customWidth, customHeight)
{
this.direction = direction;
}
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 70c904e8b9..5a827e155b 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -355,6 +355,7 @@
+