mirror of
https://github.com/ppy/osu.git
synced 2024-12-15 09:42:54 +08:00
Fix incorrect slider snaking in repeat sliders.
This commit is contained in:
parent
773d64cd5e
commit
97c4807f0b
@ -15,6 +15,7 @@ using osu.Framework.Allocation;
|
|||||||
using osu.Framework.Graphics.Textures;
|
using osu.Framework.Graphics.Textures;
|
||||||
using osu.Game.Configuration;
|
using osu.Game.Configuration;
|
||||||
using osu.Framework.Configuration;
|
using osu.Framework.Configuration;
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace osu.Game.Modes.Osu.Objects.Drawables
|
namespace osu.Game.Modes.Osu.Objects.Drawables
|
||||||
{
|
{
|
||||||
@ -73,29 +74,57 @@ namespace osu.Game.Modes.Osu.Objects.Drawables
|
|||||||
body.PathWidth = 32;
|
body.PathWidth = 32;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void computeProgress(out int repeat, out double progress)
|
||||||
|
{
|
||||||
|
progress = MathHelper.Clamp((Time.Current - slider.StartTime) / slider.Duration, 0, 1);
|
||||||
|
|
||||||
|
repeat = (int)(progress * slider.RepeatCount);
|
||||||
|
progress = (progress * slider.RepeatCount) % 1;
|
||||||
|
|
||||||
|
if (repeat % 2 == 1)
|
||||||
|
progress = 1 - progress;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateBall(double progress)
|
||||||
|
{
|
||||||
|
ball.Alpha = Time.Current >= slider.StartTime && Time.Current <= slider.EndTime ? 1 : 0;
|
||||||
|
ball.Position = slider.Curve.PositionAt(progress);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateBody(int repeat, double progress)
|
||||||
|
{
|
||||||
|
double drawStartProgress = 0;
|
||||||
|
double drawEndProgress = MathHelper.Clamp((Time.Current - slider.StartTime + TIME_PREEMPT) / TIME_FADEIN, 0, 1);
|
||||||
|
|
||||||
|
if (repeat >= slider.RepeatCount - 1)
|
||||||
|
{
|
||||||
|
if (Math.Min(repeat, slider.RepeatCount - 1) % 2 == 1)
|
||||||
|
{
|
||||||
|
drawStartProgress = 0;
|
||||||
|
drawEndProgress = progress;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
drawStartProgress = progress;
|
||||||
|
drawEndProgress = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
body.SetRange(
|
||||||
|
snakingOut ? drawStartProgress : 0,
|
||||||
|
snakingIn ? drawEndProgress : 1);
|
||||||
|
}
|
||||||
|
|
||||||
protected override void Update()
|
protected override void Update()
|
||||||
{
|
{
|
||||||
base.Update();
|
base.Update();
|
||||||
|
|
||||||
ball.Alpha = Time.Current >= slider.StartTime && Time.Current <= slider.EndTime ? 1 : 0;
|
double progress;
|
||||||
|
int repeat;
|
||||||
|
computeProgress(out repeat, out progress);
|
||||||
|
|
||||||
double currentProgress = MathHelper.Clamp((Time.Current - slider.StartTime) / slider.Duration, 0, 1);
|
updateBall(progress);
|
||||||
double drawStartProgress = 0;
|
updateBody(repeat, progress);
|
||||||
|
|
||||||
int currentRepeat = (int)(currentProgress * slider.RepeatCount);
|
|
||||||
currentProgress = (currentProgress * slider.RepeatCount) % 1;
|
|
||||||
if (currentRepeat % 2 == 1)
|
|
||||||
currentProgress = 1 - currentProgress;
|
|
||||||
|
|
||||||
if (currentRepeat >= slider.RepeatCount - 1)
|
|
||||||
drawStartProgress = currentProgress;
|
|
||||||
|
|
||||||
ball.Position = slider.Curve.PositionAt(currentProgress);
|
|
||||||
|
|
||||||
double drawEndProgress = MathHelper.Clamp((Time.Current - slider.StartTime + TIME_PREEMPT) / TIME_FADEIN, 0, 1);
|
|
||||||
body.SetRange(
|
|
||||||
snakingOut ? drawStartProgress : 0,
|
|
||||||
snakingIn ? drawEndProgress : 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void CheckJudgement(bool userTriggered)
|
protected override void CheckJudgement(bool userTriggered)
|
||||||
|
Loading…
Reference in New Issue
Block a user