//Copyright (c) 2007-2016 ppy Pty Ltd . //Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using System; using System.Diagnostics; using osu.Framework; using osu.Framework.Graphics.Containers; namespace osu.Game.Modes.Objects.Drawables { public abstract class DrawableHitObject : Container, IStateful { //todo: move to a more central implementation. this logic should not be at a drawable level. public Action OnHit; public Action OnMiss; public Action CheckJudgement; public Container ChildObjects; public JudgementInfo Judgement; public HitObject HitObject; public DrawableHitObject(HitObject hitObject) { HitObject = hitObject; Depth = -(float)hitObject.StartTime; } private ArmedState state; public ArmedState State { get { return state; } set { if (state == value) return; state = value; UpdateState(state); } } /// /// Process a hit of this hitobject. Carries out judgement. /// /// Preliminary judgement information provided by the hit source. /// Whether a hit was processed. protected bool Hit(JudgementInfo judgement) { if (State != ArmedState.Idle) return false; judgement.TimeOffset = Time.Current - HitObject.EndTime; CheckJudgement?.Invoke(this, judgement); if (judgement.Result == HitResult.Ignore) return false; Judgement = judgement; switch (judgement.Result) { default: State = ArmedState.Hit; OnHit?.Invoke(this); break; case HitResult.Miss: State = ArmedState.Miss; OnMiss?.Invoke(this); break; } return true; } protected override void Update() { base.Update(); if (Time.Current >= HitObject.EndTime && Judgement == null) Hit(new JudgementInfo()); } protected abstract void UpdateState(ArmedState state); } public enum ArmedState { Idle, Hit, Miss } }