diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherArea.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherArea.cs
index 5079e57e5e..1cbfa6338e 100644
--- a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherArea.cs
+++ b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherArea.cs
@@ -44,7 +44,7 @@ namespace osu.Game.Rulesets.Catch.Tests
private void attemptCatch(Fruit fruit)
{
- fruit.OriginalX += catcher.X;
+ fruit.X = fruit.OriginalX + catcher.X;
fruit.ApplyDefaults(new ControlPointInfo(), new BeatmapDifficulty
{
CircleSize = circleSize
diff --git a/osu.Game.Rulesets.Catch/Objects/CatchHitObject.cs b/osu.Game.Rulesets.Catch/Objects/CatchHitObject.cs
index 6267eca7de..ae45182960 100644
--- a/osu.Game.Rulesets.Catch/Objects/CatchHitObject.cs
+++ b/osu.Game.Rulesets.Catch/Objects/CatchHitObject.cs
@@ -4,7 +4,6 @@
using osu.Framework.Bindables;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.ControlPoints;
-using osu.Game.Rulesets.Catch.Beatmaps;
using osu.Game.Rulesets.Catch.UI;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Objects.Types;
@@ -21,46 +20,40 @@ namespace osu.Game.Rulesets.Catch.Objects
///
/// The horizontal position of the hit object between 0 and .
///
- ///
- /// This value is the original value specified in the beatmap, not affected by beatmap processing.
- /// It should be used instead of when working on a beatmap, not a gameplay.
- ///
- public float OriginalX
+ public float X
{
- get => OriginalXBindable.Value;
set => OriginalXBindable.Value = value;
}
- float IHasXPosition.X => OriginalX;
+ float IHasXPosition.X => OriginalXBindable.Value;
+
+ public readonly Bindable XOffsetBindable = new Bindable();
///
- /// An alias of setter.
+ /// A random offset applied to the horizontal position, set by the beatmap processing.
///
- public float X
+ public float XOffset
{
- set => OriginalX = value;
+ set => XOffsetBindable.Value = value;
}
- public readonly Bindable EffectiveXBindable = new Bindable();
+ ///
+ /// The horizontal position of the hit object between 0 and .
+ ///
+ ///
+ /// This value is the original value specified in the beatmap, not affected by the beatmap processing.
+ /// Use for a gameplay.
+ ///
+ public float OriginalX => OriginalXBindable.Value;
///
/// The effective horizontal position of the hit object between 0 and .
///
- public float EffectiveX => EffectiveXBindable.Value;
-
- private float xOffset;
-
- ///
- /// A random offset applied to the horizontal position, set by the .
- ///
- internal float XOffset
- {
- set
- {
- xOffset = value;
- EffectiveXBindable.Value = OriginalX + xOffset;
- }
- }
+ ///
+ /// This value is the original value plus the offset applied by the beatmap processing.
+ /// Use if a value not affected by the offset is desired.
+ ///
+ public float EffectiveX => OriginalXBindable.Value + XOffsetBindable.Value;
public double TimePreempt = 1000;
@@ -127,10 +120,5 @@ namespace osu.Game.Rulesets.Catch.Objects
}
protected override HitWindows CreateHitWindows() => HitWindows.Empty;
-
- protected CatchHitObject()
- {
- OriginalXBindable.BindValueChanged(change => EffectiveXBindable.Value = change.NewValue + xOffset);
- }
}
}
diff --git a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs
index edd607a443..0c065948ef 100644
--- a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs
+++ b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawableCatchHitObject.cs
@@ -15,7 +15,8 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawables
{
public abstract class DrawableCatchHitObject : DrawableHitObject
{
- public readonly Bindable EffectiveXBindable = new Bindable();
+ public readonly Bindable OriginalXBindable = new Bindable();
+ public readonly Bindable XOffsetBindable = new Bindable();
protected override double InitialLifetimeOffset => HitObject.TimePreempt;
@@ -38,14 +39,16 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawables
{
base.OnApply();
- EffectiveXBindable.BindTo(HitObject.EffectiveXBindable);
+ OriginalXBindable.BindTo(HitObject.OriginalXBindable);
+ XOffsetBindable.BindTo(HitObject.XOffsetBindable);
}
protected override void OnFree()
{
base.OnFree();
- EffectiveXBindable.UnbindFrom(HitObject.EffectiveXBindable);
+ OriginalXBindable.UnbindFrom(HitObject.OriginalXBindable);
+ XOffsetBindable.UnbindFrom(HitObject.XOffsetBindable);
}
public Func CheckPosition;
diff --git a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawablePalpableCatchHitObject.cs b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawablePalpableCatchHitObject.cs
index d3fa43c6b6..84af7922f9 100644
--- a/osu.Game.Rulesets.Catch/Objects/Drawables/DrawablePalpableCatchHitObject.cs
+++ b/osu.Game.Rulesets.Catch/Objects/Drawables/DrawablePalpableCatchHitObject.cs
@@ -55,10 +55,8 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawables
[BackgroundDependencyLoader]
private void load()
{
- EffectiveXBindable.BindValueChanged(x =>
- {
- X = x.NewValue;
- }, true);
+ OriginalXBindable.BindValueChanged(_ => X = OriginalXBindable.Value + XOffsetBindable.Value);
+ XOffsetBindable.BindValueChanged(_ => X = OriginalXBindable.Value + XOffsetBindable.Value, true);
ScaleBindable.BindValueChanged(scale =>
{