2017-02-07 04:59:30 +00:00
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
2016-09-02 10:25:13 +00:00
2016-11-14 08:23:33 +00:00
using System ;
2016-09-02 10:25:13 +00:00
using System.Collections.Generic ;
2016-11-14 08:23:33 +00:00
using System.Linq ;
using osu.Framework.Allocation ;
2016-09-02 11:30:27 +00:00
using osu.Framework.Graphics ;
2016-09-02 10:25:13 +00:00
using osu.Framework.Graphics.Containers ;
2017-02-28 11:14:48 +00:00
using osu.Framework.Input ;
2016-11-14 09:03:20 +00:00
using osu.Game.Modes.Objects ;
2016-11-14 10:49:29 +00:00
using osu.Game.Modes.Objects.Drawables ;
2017-02-09 05:56:39 +00:00
using osu.Game.Beatmaps ;
2017-03-06 06:24:00 +00:00
using osu.Game.Screens.Play ;
2016-09-02 10:25:13 +00:00
2016-11-14 09:54:24 +00:00
namespace osu.Game.Modes.UI
2016-09-02 10:25:13 +00:00
{
2016-10-19 10:44:03 +00:00
public abstract class HitRenderer : Container
{
2016-11-29 12:28:43 +00:00
public event Action < JudgementInfo > OnJudgement ;
2016-11-29 14:59:56 +00:00
public event Action OnAllJudged ;
2017-03-06 04:59:11 +00:00
public abstract bool AllObjectsJudged { get ; }
2017-02-28 11:14:48 +00:00
2016-11-29 14:59:56 +00:00
protected void TriggerOnJudgement ( JudgementInfo j )
{
OnJudgement ? . Invoke ( j ) ;
if ( AllObjectsJudged )
OnAllJudged ? . Invoke ( ) ;
}
2017-03-06 04:59:11 +00:00
}
2016-11-02 05:07:20 +00:00
2017-03-06 04:59:11 +00:00
public abstract class HitRenderer < TObject > : HitRenderer
where TObject : HitObject
{
private List < TObject > objects ;
2016-11-02 05:07:20 +00:00
2017-03-06 06:24:00 +00:00
public PlayerInputManager InputManager ;
2016-11-29 14:59:56 +00:00
2017-03-06 04:59:11 +00:00
protected Playfield < TObject > Playfield ;
2016-10-19 10:44:03 +00:00
2017-03-06 04:59:11 +00:00
public override bool AllObjectsJudged = > Playfield . HitObjects . Children . First ( ) ? . Judgement . Result ! = null ; //reverse depth sort means First() instead of Last().
public IEnumerable < DrawableHitObject > DrawableObjects = > Playfield . HitObjects . Children ;
2016-09-02 11:30:27 +00:00
2017-02-09 05:56:39 +00:00
public Beatmap Beatmap
2016-10-01 09:40:14 +00:00
{
2016-10-13 01:10:15 +00:00
set
{
objects = Convert ( value ) ;
if ( IsLoaded )
loadObjects ( ) ;
}
2016-10-01 09:40:14 +00:00
}
2017-03-06 04:59:11 +00:00
protected abstract Playfield < TObject > CreatePlayfield ( ) ;
2016-10-13 01:10:15 +00:00
2017-03-06 04:59:11 +00:00
protected abstract HitObjectConverter < TObject > Converter { get ; }
2016-10-13 13:14:18 +00:00
2017-03-06 04:59:11 +00:00
protected virtual List < TObject > Convert ( Beatmap beatmap ) = > Converter . Convert ( beatmap ) ;
2016-10-13 01:10:15 +00:00
2017-03-07 01:59:19 +00:00
protected HitRenderer ( )
2016-09-02 11:30:27 +00:00
{
2016-10-13 01:10:15 +00:00
RelativeSizeAxes = Axes . Both ;
2016-11-12 17:34:36 +00:00
}
2016-10-13 01:10:15 +00:00
2016-11-12 17:34:36 +00:00
[BackgroundDependencyLoader]
private void load ( )
{
2017-02-28 11:14:48 +00:00
Playfield = CreatePlayfield ( ) ;
Playfield . InputManager = InputManager ;
Add ( Playfield ) ;
2016-10-13 01:10:15 +00:00
loadObjects ( ) ;
}
private void loadObjects ( )
{
if ( objects = = null ) return ;
2017-03-06 04:59:11 +00:00
foreach ( TObject h in objects )
2016-10-19 10:44:03 +00:00
{
2017-03-06 04:59:11 +00:00
DrawableHitObject < TObject > drawableObject = GetVisualRepresentation ( h ) ;
2016-10-19 10:44:03 +00:00
if ( drawableObject = = null ) continue ;
2016-11-29 12:28:43 +00:00
drawableObject . OnJudgement + = onJudgement ;
2016-10-19 10:44:03 +00:00
2016-11-02 05:07:20 +00:00
Playfield . Add ( drawableObject ) ;
2016-10-19 10:44:03 +00:00
}
2017-02-10 05:16:23 +00:00
Playfield . PostProcess ( ) ;
2016-10-19 10:44:03 +00:00
}
2017-03-06 04:59:11 +00:00
private void onJudgement ( DrawableHitObject < TObject > o , JudgementInfo j ) = > TriggerOnJudgement ( j ) ;
2016-10-13 01:10:15 +00:00
2017-03-06 04:59:11 +00:00
protected abstract DrawableHitObject < TObject > GetVisualRepresentation ( TObject h ) ;
2016-09-02 10:25:13 +00:00
}
}