// Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Game.Modes.Objects; using osu.Game.Modes.Objects.Drawables; using osu.Game.Screens.Play; using OpenTK; namespace osu.Game.Modes.UI { public abstract class Playfield : Container where T : HitObject { public HitObjectContainer> HitObjects; public virtual void Add(DrawableHitObject h) => HitObjects.Add(h); private Container scaledContent; public override bool Contains(Vector2 screenSpacePos) => true; protected override Container Content { get; } /// /// 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) { AddInternal(scaledContent = new ScaledContainer { CustomWidth = customWidth, RelativeSizeAxes = Axes.Both, Children = new[] { Content = new Container { RelativeSizeAxes = Axes.Both, } } }); Add(HitObjects = new HitObjectContainer> { RelativeSizeAxes = Axes.Both, }); } /// /// An optional inputManager to provide interactivity etc. /// public PlayerInputManager InputManager; [BackgroundDependencyLoader] private void load() { if (InputManager != null) { //if we've been provided an InputManager, we want it to sit inside the scaledcontainer scaledContent.Remove(Content); scaledContent.Add(InputManager); InputManager.Add(Content); } } public virtual void PostProcess() { } private class ScaledContainer : Container { public float? CustomWidth; protected override Vector2 DrawScale => CustomWidth.HasValue ? new Vector2(DrawSize.X / CustomWidth.Value) : base.DrawScale; public override bool Contains(Vector2 screenSpacePos) => true; } public class HitObjectContainer : Container where U : Drawable { public override bool Contains(Vector2 screenSpacePos) => true; } } }