Refactor state updates to convert State into an IBindable

This commit is contained in:
smoogipoo 2019-07-23 21:08:41 +09:00
parent 9b526ef61e
commit 74b09c72fa

View File

@ -79,12 +79,12 @@ namespace osu.Game.Rulesets.Objects.Drawables
public override bool RemoveCompletedTransforms => false; public override bool RemoveCompletedTransforms => false;
protected override bool RequiresChildrenUpdate => true; protected override bool RequiresChildrenUpdate => true;
public override bool IsPresent => base.IsPresent || (state.Value == ArmedState.Idle && Clock?.CurrentTime >= LifetimeStart); public override bool IsPresent => base.IsPresent || (State.Value == ArmedState.Idle && Clock?.CurrentTime >= LifetimeStart);
public readonly Bindable<ArmedState> State = new Bindable<ArmedState>();
private readonly Bindable<ArmedState> state = new Bindable<ArmedState>(); private readonly Bindable<ArmedState> state = new Bindable<ArmedState>();
public IBindable<ArmedState> State => state;
protected DrawableHitObject(HitObject hitObject) protected DrawableHitObject(HitObject hitObject)
{ {
HitObject = hitObject; HitObject = hitObject;
@ -121,17 +121,7 @@ namespace osu.Game.Rulesets.Objects.Drawables
protected override void LoadComplete() protected override void LoadComplete()
{ {
base.LoadComplete(); base.LoadComplete();
updateState(ArmedState.Idle, true);
state.BindValueChanged(armed =>
{
updateState(armed.NewValue);
// apply any custom state overrides
ApplyCustomUpdateState?.Invoke(this, armed.NewValue);
if (armed.NewValue == ArmedState.Hit)
PlaySamples();
}, true);
} }
#region State / Transform Management #region State / Transform Management
@ -152,8 +142,17 @@ namespace osu.Game.Rulesets.Objects.Drawables
protected override void ClearInternal(bool disposeChildren = true) => throw new InvalidOperationException($"Should never clear a {nameof(DrawableHitObject)}"); protected override void ClearInternal(bool disposeChildren = true) => throw new InvalidOperationException($"Should never clear a {nameof(DrawableHitObject)}");
private void updateState(ArmedState state) private void updateState(ArmedState newState, bool force = false)
{ {
if (State.Value == newState && !force)
return;
// apply any custom state overrides
ApplyCustomUpdateState?.Invoke(this, newState);
if (newState == ArmedState.Hit)
PlaySamples();
if (UseTransformStateManagement) if (UseTransformStateManagement)
{ {
double transformTime = HitObject.StartTime - InitialLifetimeOffset; double transformTime = HitObject.StartTime - InitialLifetimeOffset;
@ -169,17 +168,15 @@ namespace osu.Game.Rulesets.Objects.Drawables
using (BeginDelayedSequence(InitialLifetimeOffset + judgementOffset, true)) using (BeginDelayedSequence(InitialLifetimeOffset + judgementOffset, true))
{ {
UpdateStateTransforms(state); UpdateStateTransforms(newState);
State.Value = state; state.Value = newState;
} }
} }
} }
else else
{ state.Value = newState;
State.Value = state;
}
UpdateState(state); UpdateState(newState);
} }
/// <summary> /// <summary>
@ -255,7 +252,8 @@ namespace osu.Game.Rulesets.Objects.Drawables
Result.TimeOffset = 0; Result.TimeOffset = 0;
Result.Type = HitResult.None; Result.Type = HitResult.None;
state.Value = ArmedState.Idle;
updateState(ArmedState.Idle);
} }
} }
} }
@ -336,11 +334,11 @@ namespace osu.Game.Rulesets.Objects.Drawables
break; break;
case HitResult.Miss: case HitResult.Miss:
state.Value = ArmedState.Miss; updateState(ArmedState.Miss);
break; break;
default: default:
state.Value = ArmedState.Hit; updateState(ArmedState.Hit);
break; break;
} }