Take circle radius into account when clamping to playfield

This commit is contained in:
Henry Lin 2021-06-29 13:36:30 +08:00
parent 0c5777c2c8
commit 2722565204

View File

@ -74,6 +74,10 @@ namespace osu.Game.Rulesets.Osu.Mods
applyRandomisation(rateOfChangeMultiplier, previous, current); applyRandomisation(rateOfChangeMultiplier, previous, current);
// Move hit objects back into the playfield if they are outside of it,
// which would sometimes happen during big jumps otherwise.
current.PositionRandomised = clampToPlayfield(current.PositionRandomised, (float)hitObject.Radius);
hitObject.Position = current.PositionRandomised; hitObject.Position = current.PositionRandomised;
// update end position as it may have changed as a result of the position update. // update end position as it may have changed as a result of the position update.
@ -142,14 +146,7 @@ namespace osu.Game.Rulesets.Osu.Mods
current.AngleRad = (float)Math.Atan2(posRelativeToPrev.Y, posRelativeToPrev.X); current.AngleRad = (float)Math.Atan2(posRelativeToPrev.Y, posRelativeToPrev.X);
var position = previous.EndPositionRandomised + posRelativeToPrev; current.PositionRandomised = previous.EndPositionRandomised + posRelativeToPrev;
// Move hit objects back into the playfield if they are outside of it,
// which would sometimes happen during big jumps otherwise.
position.X = MathHelper.Clamp(position.X, 0, OsuPlayfield.BASE_SIZE.X);
position.Y = MathHelper.Clamp(position.Y, 0, OsuPlayfield.BASE_SIZE.Y);
current.PositionRandomised = position;
} }
/// <summary> /// <summary>
@ -185,14 +182,12 @@ namespace osu.Game.Rulesets.Osu.Mods
{ {
for (int i = 0; i < hitObjects.Count; i++) for (int i = 0; i < hitObjects.Count; i++)
{ {
var hitObject = hitObjects[i];
// The first object is shifted by a vector slightly smaller than shift // The first object is shifted by a vector slightly smaller than shift
// The last object is shifted by a vector slightly larger than zero // The last object is shifted by a vector slightly larger than zero
Vector2 position = hitObjects[i].Position + shift * ((hitObjects.Count - i) / (float)(hitObjects.Count + 1)); Vector2 position = hitObject.Position + shift * ((hitObjects.Count - i) / (float)(hitObjects.Count + 1));
position.X = MathHelper.Clamp(position.X, 0, OsuPlayfield.BASE_SIZE.X); hitObject.Position = clampToPlayfield(position, (float)hitObject.Radius);
position.Y = MathHelper.Clamp(position.Y, 0, OsuPlayfield.BASE_SIZE.Y);
hitObjects[i].Position = position;
} }
} }
@ -217,6 +212,13 @@ namespace osu.Game.Rulesets.Osu.Mods
minMargin.Left = Math.Min(minMargin.Left, OsuPlayfield.BASE_SIZE.X - minMargin.Right); minMargin.Left = Math.Min(minMargin.Left, OsuPlayfield.BASE_SIZE.X - minMargin.Right);
minMargin.Top = Math.Min(minMargin.Top, OsuPlayfield.BASE_SIZE.Y - minMargin.Bottom); minMargin.Top = Math.Min(minMargin.Top, OsuPlayfield.BASE_SIZE.Y - minMargin.Bottom);
var radius = (float)slider.Radius;
minMargin.Left += radius;
minMargin.Right += radius;
minMargin.Top += radius;
minMargin.Bottom += radius;
return minMargin; return minMargin;
} }
@ -236,6 +238,14 @@ namespace osu.Game.Rulesets.Osu.Mods
} }
} }
private Vector2 clampToPlayfield(Vector2 position, float radius)
{
position.X = MathHelper.Clamp(position.X, radius, OsuPlayfield.BASE_SIZE.X - radius);
position.Y = MathHelper.Clamp(position.Y, radius, OsuPlayfield.BASE_SIZE.Y - radius);
return position;
}
private class RandomObjectInfo private class RandomObjectInfo
{ {
public float AngleRad { get; set; } public float AngleRad { get; set; }