diff --git a/osu.Game.Modes.Osu/Objects/OsuHitObjectParser.cs b/osu.Game.Modes.Osu/Objects/OsuHitObjectParser.cs index ce480e1eac..801b74084b 100644 --- a/osu.Game.Modes.Osu/Objects/OsuHitObjectParser.cs +++ b/osu.Game.Modes.Osu/Objects/OsuHitObjectParser.cs @@ -29,8 +29,6 @@ namespace osu.Game.Modes.Osu.Objects result = new HitCircle(); break; case HitObjectType.Slider: - Slider s = new Slider(); - CurveTypes curveType = CurveTypes.Catmull; int repeatCount = 0; double length = 0; @@ -79,18 +77,13 @@ namespace osu.Game.Modes.Osu.Objects if (split.Length > 7) length = Convert.ToDouble(split[7], CultureInfo.InvariantCulture); - s.RepeatCount = repeatCount; - - s.Curve = new SliderCurve + result = new Slider { ControlPoints = points, Length = length, - CurveType = curveType + CurveType = curveType, + RepeatCount = repeatCount }; - - s.Curve.Calculate(); - - result = s; break; case HitObjectType.Spinner: result = new Spinner(); @@ -101,7 +94,8 @@ namespace osu.Game.Modes.Osu.Objects } result.Position = new Vector2(int.Parse(split[0]), int.Parse(split[1])); result.StartTime = double.Parse(split[2]); - result.Sample = new HitSampleInfo { + result.Sample = new HitSampleInfo + { Type = (SampleType)int.Parse(split[4]), Set = SampleSet.Soft, }; diff --git a/osu.Game.Modes.Osu/Objects/Slider.cs b/osu.Game.Modes.Osu/Objects/Slider.cs index 85ee83a7f8..a809761698 100644 --- a/osu.Game.Modes.Osu/Objects/Slider.cs +++ b/osu.Game.Modes.Osu/Objects/Slider.cs @@ -1,6 +1,7 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using System.Collections.Generic; using osu.Game.Beatmaps; using OpenTK; @@ -19,11 +20,28 @@ namespace osu.Game.Modes.Osu.Objects set { stackHeight = value; - if (Curve != null) - Curve.Offset = StackOffset; + Curve.Offset = StackOffset; } } + public List ControlPoints + { + get { return Curve.ControlPoints; } + set { Curve.ControlPoints = value; } + } + + public double Length + { + get { return Curve.Length; } + set { Curve.Length = value; } + } + + public CurveTypes CurveType + { + get { return Curve.CurveType; } + set { Curve.CurveType = value; } + } + public double Velocity; public override void SetDefaultsFromBeatmap(Beatmap beatmap) @@ -35,7 +53,7 @@ namespace osu.Game.Modes.Osu.Objects public int RepeatCount; - public SliderCurve Curve; + internal readonly SliderCurve Curve = new SliderCurve(); } public enum CurveTypes diff --git a/osu.Game.Modes.Osu/Objects/SliderCurve.cs b/osu.Game.Modes.Osu/Objects/SliderCurve.cs index 62931a7356..06312cb489 100644 --- a/osu.Game.Modes.Osu/Objects/SliderCurve.cs +++ b/osu.Game.Modes.Osu/Objects/SliderCurve.cs @@ -172,6 +172,9 @@ namespace osu.Game.Modes.Osu.Objects /// End progress. Ranges from 0 (beginning of the slider) to 1 (end of the slider). public void GetPathToProgress(List path, double p0, double p1) { + if (calculatedPath.Count == 0 && ControlPoints.Count > 0) + Calculate(); + double d0 = progressToDistance(p0); double d1 = progressToDistance(p1); @@ -196,6 +199,9 @@ namespace osu.Game.Modes.Osu.Objects /// public Vector2 PositionAt(double progress) { + if (calculatedPath.Count == 0 && ControlPoints.Count > 0) + Calculate(); + double d = progressToDistance(progress); return interpolateVertices(indexOfDistance(d), d) + Offset; }