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
using System.Collections.Generic ;
using osu.Framework.Graphics ;
using osu.Game.Rulesets.Objects.Drawables ;
using osu.Framework.Allocation ;
2018-07-20 16:04:33 +08:00
using osu.Framework.Configuration ;
2018-08-03 20:03:11 +08:00
using osu.Game.Beatmaps ;
using osu.Game.Rulesets.Mods ;
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 ; }
/// <summary>
/// All the <see cref="Playfield"/>s nested inside this playfield.
/// </summary>
public IReadOnlyList < Playfield > NestedPlayfields = > nestedPlayfields ;
private List < Playfield > nestedPlayfields ;
2018-07-20 16:04:33 +08:00
/// <summary>
/// Whether judgements should be displayed by this and and all nested <see cref="Playfield"/>s.
/// </summary>
public readonly BindableBool DisplayJudgements = new BindableBool ( true ) ;
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 ;
}
2018-08-03 20:03:11 +08:00
private WorkingBeatmap beatmap ;
2018-04-13 17:19:50 +08:00
[BackgroundDependencyLoader]
2018-08-03 20:03:11 +08:00
private void load ( IBindableBeatmap b )
2018-04-13 17:19:50 +08:00
{
2018-08-03 20:03:11 +08:00
beatmap = b . Value ;
2018-04-13 17:19:50 +08:00
HitObjects = CreateHitObjectContainer ( ) ;
HitObjects . RelativeSizeAxes = Axes . Both ;
Add ( HitObjects ) ;
}
/// <summary>
/// Performs post-processing tasks (if any) after all DrawableHitObjects are loaded into this Playfield.
/// </summary>
public virtual void PostProcess ( ) = > nestedPlayfields ? . ForEach ( p = > p . PostProcess ( ) ) ;
/// <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>
protected void AddNested ( Playfield otherPlayfield )
{
if ( nestedPlayfields = = null )
nestedPlayfields = new List < Playfield > ( ) ;
nestedPlayfields . Add ( otherPlayfield ) ;
2018-07-20 16:04:33 +08:00
otherPlayfield . DisplayJudgements . BindTo ( DisplayJudgements ) ;
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 ( ) ;
2018-08-03 20:03:11 +08:00
protected override void Update ( )
{
base . Update ( ) ;
if ( beatmap ! = null )
foreach ( var m in beatmap . Mods . Value )
if ( m is IUpdatableByPlayfield u )
u . Update ( this ) ;
}
2018-04-13 17:19:50 +08:00
}
}