1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-12 17:43:05 +08:00

Disambiguate object flipping and reflection methods

This commit is contained in:
apollo-dw 2022-12-07 21:09:53 +00:00
parent 1776485b93
commit 684b16cef5
4 changed files with 24 additions and 20 deletions

View File

@ -20,7 +20,7 @@ namespace osu.Game.Rulesets.Osu.Mods
{ {
var osuObject = (OsuHitObject)hitObject; var osuObject = (OsuHitObject)hitObject;
OsuHitObjectGenerationUtils.ReflectVertically(osuObject); OsuHitObjectGenerationUtils.ReflectVerticallyAlongPlayfield(osuObject);
} }
} }
} }

View File

@ -27,16 +27,16 @@ namespace osu.Game.Rulesets.Osu.Mods
switch (Reflection.Value) switch (Reflection.Value)
{ {
case MirrorType.Horizontal: case MirrorType.Horizontal:
OsuHitObjectGenerationUtils.ReflectHorizontally(osuObject); OsuHitObjectGenerationUtils.ReflectHorizontallyAlongPlayfield(osuObject);
break; break;
case MirrorType.Vertical: case MirrorType.Vertical:
OsuHitObjectGenerationUtils.ReflectVertically(osuObject); OsuHitObjectGenerationUtils.ReflectVerticallyAlongPlayfield(osuObject);
break; break;
case MirrorType.Both: case MirrorType.Both:
OsuHitObjectGenerationUtils.ReflectHorizontally(osuObject); OsuHitObjectGenerationUtils.ReflectHorizontallyAlongPlayfield(osuObject);
OsuHitObjectGenerationUtils.ReflectVertically(osuObject); OsuHitObjectGenerationUtils.ReflectVerticallyAlongPlayfield(osuObject);
break; break;
} }
} }

View File

@ -67,7 +67,7 @@ namespace osu.Game.Rulesets.Osu.Mods
if (positionInfos[i].HitObject is Slider slider && random.NextDouble() < 0.5) if (positionInfos[i].HitObject is Slider slider && random.NextDouble() < 0.5)
{ {
OsuHitObjectGenerationUtils.FlipSliderHorizontally(slider); OsuHitObjectGenerationUtils.FlipSliderInPlaceHorizontally(slider);
} }
if (i == 0) if (i == 0)

View File

@ -112,21 +112,24 @@ namespace osu.Game.Rulesets.Osu.Utils
/// Reflects the position of the <see cref="OsuHitObject"/> in the playfield horizontally. /// Reflects the position of the <see cref="OsuHitObject"/> in the playfield horizontally.
/// </summary> /// </summary>
/// <param name="osuObject">The object to reflect.</param> /// <param name="osuObject">The object to reflect.</param>
public static void ReflectHorizontally(OsuHitObject osuObject) public static void ReflectHorizontallyAlongPlayfield(OsuHitObject osuObject)
{ {
osuObject.Position = new Vector2(OsuPlayfield.BASE_SIZE.X - osuObject.X, osuObject.Position.Y); osuObject.Position = new Vector2(OsuPlayfield.BASE_SIZE.X - osuObject.X, osuObject.Position.Y);
if (osuObject is not Slider slider) if (osuObject is not Slider slider)
return; return;
FlipSliderHorizontally(slider); void flipNestedObject(OsuHitObject nested) => nested.Position = new Vector2(OsuPlayfield.BASE_SIZE.X - nested.Position.X, nested.Position.Y);
static void flipControlPoint(PathControlPoint point) => point.Position = new Vector2(-point.Position.X, point.Position.Y);
modifySlider(slider, flipNestedObject, flipControlPoint);
} }
/// <summary> /// <summary>
/// Reflects the position of the <see cref="OsuHitObject"/> in the playfield vertically. /// Reflects the position of the <see cref="OsuHitObject"/> in the playfield vertically.
/// </summary> /// </summary>
/// <param name="osuObject">The object to reflect.</param> /// <param name="osuObject">The object to reflect.</param>
public static void ReflectVertically(OsuHitObject osuObject) public static void ReflectVerticallyAlongPlayfield(OsuHitObject osuObject)
{ {
osuObject.Position = new Vector2(osuObject.Position.X, OsuPlayfield.BASE_SIZE.Y - osuObject.Y); osuObject.Position = new Vector2(osuObject.Position.X, OsuPlayfield.BASE_SIZE.Y - osuObject.Y);
@ -139,6 +142,18 @@ namespace osu.Game.Rulesets.Osu.Utils
modifySlider(slider, flipNestedObject, flipControlPoint); modifySlider(slider, flipNestedObject, flipControlPoint);
} }
/// <summary>
/// Flips the position of the <see cref="Slider"/> around its start position horizontally.
/// </summary>
/// <param name="slider">The slider to be flipped.</param>
public static void FlipSliderInPlaceHorizontally(Slider slider)
{
void flipNestedObject(OsuHitObject nested) => nested.Position = new Vector2(slider.X - (nested.X - slider.X), nested.Y);
static void flipControlPoint(PathControlPoint point) => point.Position = new Vector2(-point.Position.X, point.Position.Y);
modifySlider(slider, flipNestedObject, flipControlPoint);
}
/// <summary> /// <summary>
/// Rotate a slider about its start position by the specified angle. /// Rotate a slider about its start position by the specified angle.
/// </summary> /// </summary>
@ -152,17 +167,6 @@ namespace osu.Game.Rulesets.Osu.Utils
modifySlider(slider, rotateNestedObject, rotateControlPoint); modifySlider(slider, rotateNestedObject, rotateControlPoint);
} }
/// <summary>
/// Flips the slider about its start position horizontally.
/// </summary>
public static void FlipSliderHorizontally(Slider slider)
{
void flipNestedObject(OsuHitObject nested) => nested.Position = new Vector2(slider.X - (nested.X - slider.X), nested.Y);
static void flipControlPoint(PathControlPoint point) => point.Position = new Vector2(-point.Position.X, point.Position.Y);
modifySlider(slider, flipNestedObject, flipControlPoint);
}
private static void modifySlider(Slider slider, Action<OsuHitObject> modifyNestedObject, Action<PathControlPoint> modifyControlPoint) private static void modifySlider(Slider slider, Action<OsuHitObject> modifyNestedObject, Action<PathControlPoint> modifyControlPoint)
{ {
// No need to update the head and tail circles, since slider handles that when the new slider path is set // No need to update the head and tail circles, since slider handles that when the new slider path is set