Rework osu! hidden mod to avoid storing hitobjects

This commit is contained in:
smoogipoo
2020-12-03 14:28:37 +09:00
parent a5bb194cb8
commit e3bbc2b128
4 changed files with 97 additions and 70 deletions

View File

@ -2,6 +2,8 @@
// See the LICENCE file in the repository root for full licence text.
using System;
using System.Diagnostics;
using JetBrains.Annotations;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Game.Rulesets.Objects.Drawables;
@ -11,14 +13,15 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
{
public class DrawableSliderHead : DrawableHitCircle
{
[CanBeNull]
public Slider Slider => drawableSlider?.HitObject;
private readonly IBindable<int> pathVersion = new Bindable<int>();
protected override OsuSkinComponents CirclePieceComponent => OsuSkinComponents.SliderHeadHitCircle;
private DrawableSlider drawableSlider;
private Slider slider => drawableSlider?.HitObject;
public DrawableSliderHead()
{
}
@ -58,11 +61,13 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
{
base.Update();
double completionProgress = Math.Clamp((Time.Current - slider.StartTime) / slider.Duration, 0, 1);
Debug.Assert(Slider != null);
double completionProgress = Math.Clamp((Time.Current - Slider.StartTime) / Slider.Duration, 0, 1);
//todo: we probably want to reconsider this before adding scoring, but it looks and feels nice.
if (!IsHit)
Position = slider.CurvePositionAt(completionProgress);
Position = Slider.CurvePositionAt(completionProgress);
}
public Action<double> OnShake;
@ -71,8 +76,8 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
private void updatePosition()
{
if (slider != null)
Position = HitObject.Position - slider.Position;
if (Slider != null)
Position = HitObject.Position - Slider.Position;
}
}
}

View File

@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using JetBrains.Annotations;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
@ -18,6 +19,9 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
{
public new SliderRepeat HitObject => (SliderRepeat)base.HitObject;
[CanBeNull]
public Slider Slider => drawableSlider?.HitObject;
private double animDuration;
public Drawable CirclePiece { get; private set; }

View File

@ -2,6 +2,7 @@
// See the LICENCE file in the repository root for full licence text.
using System.Diagnostics;
using JetBrains.Annotations;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
@ -15,6 +16,9 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
{
public new SliderTailCircle HitObject => (SliderTailCircle)base.HitObject;
[CanBeNull]
public Slider Slider => drawableSlider?.HitObject;
/// <summary>
/// The judgement text is provided by the <see cref="DrawableSlider"/>.
/// </summary>
@ -22,6 +26,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
public bool Tracking { get; set; }
private DrawableSlider drawableSlider;
private SkinnableDrawable circlePiece;
private Container scaleContainer;
@ -59,6 +64,13 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
ScaleBindable.BindValueChanged(scale => scaleContainer.Scale = new Vector2(scale.NewValue));
}
protected override void OnParentReceived(DrawableHitObject parent)
{
base.OnParentReceived(parent);
drawableSlider = (DrawableSlider)parent;
}
protected override void UpdateInitialTransforms()
{
base.UpdateInitialTransforms();