2018-04-13 17:19:50 +08:00
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
2018-07-17 14:48:51 +08:00
using System ;
2018-04-13 17:19:50 +08:00
using System.Collections.Generic ;
2018-07-17 14:48:51 +08:00
using System.Linq ;
2018-04-13 17:19:50 +08:00
using osu.Framework.Graphics ;
using osu.Game.Rulesets.Objects.Drawables ;
using osu.Framework.Allocation ;
2018-07-17 14:48:51 +08:00
using osu.Framework.Extensions.IEnumerableExtensions ;
2018-04-13 17:19:50 +08:00
namespace osu.Game.Rulesets.UI
{
public abstract class Playfield : ScalableContainer
{
/// <summary>
/// The HitObjects contained in this Playfield.
/// </summary>
public HitObjectContainer HitObjects { get ; private set ; }
2018-07-17 14:48:51 +08:00
private readonly Lazy < List < Playfield > > nestedPlayfields = new Lazy < List < Playfield > > ( ) ;
public IEnumerable < Playfield > NestedPlayfields = > nestedPlayfields . IsValueCreated ? nestedPlayfields . Value : Enumerable . Empty < Playfield > ( ) ;
2018-04-13 17:19:50 +08:00
/// <summary>
/// A container for keeping track of DrawableHitObjects.
/// </summary>
/// <param name="customWidth">The width to scale the internal coordinate space to.
/// May be null if scaling based on <paramref name="customHeight"/> is desired. If <paramref name="customHeight"/> is also null, no scaling will occur.
/// </param>
/// <param name="customHeight">The height to scale the internal coordinate space to.
/// May be null if scaling based on <paramref name="customWidth"/> is desired. If <paramref name="customWidth"/> is also null, no scaling will occur.
/// </param>
protected Playfield ( float? customWidth = null , float? customHeight = null )
: base ( customWidth , customHeight )
{
RelativeSizeAxes = Axes . Both ;
}
[BackgroundDependencyLoader]
private void load ( )
{
HitObjects = CreateHitObjectContainer ( ) ;
HitObjects . RelativeSizeAxes = Axes . Both ;
Add ( HitObjects ) ;
}
/// <summary>
/// Performs post-processing tasks (if any) after all DrawableHitObjects are loaded into this Playfield.
/// </summary>
2018-07-17 14:48:51 +08:00
public virtual void PostProcess ( ) = > NestedPlayfields . ForEach ( p = > p . PostProcess ( ) ) ;
2018-04-13 17:19:50 +08:00
/// <summary>
/// Adds a DrawableHitObject to this Playfield.
/// </summary>
/// <param name="h">The DrawableHitObject to add.</param>
public virtual void Add ( DrawableHitObject h ) = > HitObjects . Add ( h ) ;
/// <summary>
/// Remove a DrawableHitObject from this Playfield.
/// </summary>
/// <param name="h">The DrawableHitObject to remove.</param>
public virtual void Remove ( DrawableHitObject h ) = > HitObjects . Remove ( h ) ;
/// <summary>
/// Registers a <see cref="Playfield"/> as a nested <see cref="Playfield"/>.
/// This does not add the <see cref="Playfield"/> to the draw hierarchy.
/// </summary>
/// <param name="otherPlayfield">The <see cref="Playfield"/> to add.</param>
2018-07-17 14:48:51 +08:00
protected void AddNested ( Playfield otherPlayfield ) = > nestedPlayfields . Value . Add ( otherPlayfield ) ;
2018-04-13 17:19:50 +08:00
/// <summary>
/// Creates the container that will be used to contain the <see cref="DrawableHitObject"/>s.
/// </summary>
protected virtual HitObjectContainer CreateHitObjectContainer ( ) = > new HitObjectContainer ( ) ;
}
}