/// <summary> /// 使用字符串构建一个ManiaHit对象 /// </summary> /// <param name="data"></param> public void Parse(string data) { var info = data.Split(','); if (BeatmapColumn == 0) { throw new ArgumentException(); } Position = new OsuPixel(int.Parse(info[0]), int.Parse(info[1])); var val = double.Parse(info[2]); Offset = double.IsNaN(val) || double.IsInfinity(val) ? 0 : (int)val; IntType = int.Parse(info[3]); var types = new HitObjectTypesConverter().Convert(IntType, out var maybeBestVal); if (maybeBestVal != HitObjectTypes.HitCircle) { throw new ArgumentException("该行的数据不适用。"); } Column = (int)Math.Floor(Position.x * BeatmapColumn / 512d); HitSound = new HitSoundsConverter().Convert(int.Parse(info[4]), out _)[0]; if (info.Length > 5) { HitSample = new HitSample(info[5]); } }
/// <summary> /// 将字符串解析成Fruit /// </summary> /// <param name="data"></param> public void Parse(string data) { var info = data.Split(','); Position = new OsuPixel(int.Parse(info[0]), int.Parse(info[1])); var val = double.Parse(info[2]); Offset = double.IsNaN(val) || double.IsInfinity(val) ? 0 : (int)val; type = int.Parse(info[3]); var types = new HitObjectTypesConverter().Convert(type, out var maybeBestVal); if (maybeBestVal != HitObjectTypes.HitCircle) { throw new ArgumentException("该行的数据不适用。"); } if (types.Contains(HitObjectTypes.NewCombo)) { IsNewGroup = true; } HitSound = new HitSoundsConverter().Convert(int.Parse(info[4]), out _)[0]; if (info.Length > 5) { HitSample = new HitSample(info[5]); } }
/// <summary> /// 使用字符串构造一个Sprite对象 /// </summary> /// <param name="dataline"></param> public void Parse(string dataline) { if (!dataline.StartsWith("Sprite,") && !dataline.StartsWith("4,")) { throw new FailToParseException("该行的数据不适用。"); } var data = dataline.Split(','); var sprite = data[0]; var suc = int.TryParse(data[1], out var layer); if (!suc) { Layer = StoryBoardTools.GetLayerByString(data[1]); } else { Layer = (StoryBoardLayer)layer; } suc = int.TryParse(data[2], out var origin); if (!suc) { Origin = StoryBoardTools.GetOriginByString(data[2]); } else { Origin = (StoryBoardOrigin)origin; } Path = data[3].Trim('\"'); Position = new OsuPixel(double.Parse(data[4]), double.Parse(data[5])); }
public static OsuPixel Rotate(double cx, double cy, OsuPixel p, double radians) { var cos = Math.Cos(radians); var sin = Math.Sin(radians); return(new OsuPixel((cos * (p.x - cx)) - (sin * (p.y - cy)) + cx, (sin * (p.x - cx)) + (cos * (p.y - cy)) + cy)); }
/// <summary> /// 在两点连线上的点 /// </summary> /// <param name="p0"></param> /// <param name="p1"></param> /// <param name="length"></param> /// <returns></returns> public static OsuPixel PointOnLine(OsuPixel p0, OsuPixel p1, double length) { var fullLength = Math.Pow(Math.Pow(p1.x - p0.x, 2) + Math.Pow(p1.y - p0.y, 2), 0.5); var n = fullLength - length; if (fullLength == 0) { Console.WriteLine("full_length was forced to 1!"); fullLength = 1; } var x = (n * p0.x + length * p1.x) / fullLength; var y = (n * p0.y + length * p1.y) / fullLength; //Console.WriteLine($"Before ({p0.x},{p0.y}) ({p1.x},{p1.y})"); //Console.WriteLine($"After ({x},{y})"); return(new OsuPixel(x, y)); }
/// <inheritdoc /> public void Parse(string dataline) { if (!dataline.StartsWith("Animation,") && !dataline.StartsWith("6,")) { throw new FailToParseException("该行的数据不适用。"); } var data = dataline.Split(','); var suc = int.TryParse(data[1], out var layer); if (!suc) { Layer = StoryBoardTools.GetLayerByString(data[1]); } else { Layer = (StoryBoardLayer)layer; } suc = int.TryParse(data[2], out var origin); if (!suc) { Origin = StoryBoardTools.GetOriginByString(data[2]); } else { Origin = (StoryBoardOrigin)origin; } Path = data[3].Trim('\"'); Position = new OsuPixel(double.Parse(data[4]), double.Parse(data[5])); FrameCount = double.Parse(data[6]); FrameDelay = double.Parse(data[7]); suc = int.TryParse(data[8], out var loopType); if (!suc) { LoopType = StoryBoardTools.GetLoopTypeByString(data[8]); } else { LoopType = (StoryBoardAnimationLoopType)loopType; } }
/// <summary> /// 使用字符串构建一个LargeTaikoRedHit /// </summary> /// <param name="data"></param> public void Parse(string data) { var info = data.Split(','); Position = new OsuPixel(int.Parse(info[0]), int.Parse(info[1])); var val = double.Parse(info[2]); Offset = double.IsNaN(val) || double.IsInfinity(val) ? 0 : (int)val; _type = int.Parse(info[3]); var types = new HitObjectTypesConverter().Convert(_type, out var maybeBestVal); if (maybeBestVal != HitObjectTypes.HitCircle) { return; } if (info.Length > 5) { HitSample = new HitSample(info[5]); } }
void CalcBezier(List <OsuPixel> points) { var order = points.Count; var step = 0.25 / Constants.SliderQuality / order; double i = 0; int n = order - 1; while (i < 1 + step) { double x = 0, y = 0; for (int p = 0; p < n + 1; p++) { var a = MathUtlity.Combine(p, n) * Math.Pow(1 - i, n - p) * Math.Pow(i, p); x += a * points[p].x; y += a * points[p].y; } var point = new OsuPixel(x, y); Position.Add(point); i += step; } }
/// <summary> /// 计算两点的夹角 /// </summary> /// <param name="p0">点1</param> /// <param name="p1">点2</param> /// <returns>角度</returns> public static double AngleFromPoints(OsuPixel p0, OsuPixel p1) { return(Math.Atan2(p1.y - p0.y, p1.x - p0.x)); }
/// <summary> /// 将字符串解析为Drumroll /// </summary> /// <param name="data"></param> public void Parse(string data) //(x,y)_,time,type,hitSound,endTime,hitSample { var info = data.Split(','); Position = new OsuPixel(int.Parse(info[0]), int.Parse(info[1])); var val = double.Parse(info[2]); Offset = double.IsNaN(val) || double.IsInfinity(val) ? 0 : (int)val; _type = int.Parse(info[3]); var types = new HitObjectTypesConverter().Convert(_type, out var maybeBestVal); if (maybeBestVal != HitObjectTypes.Slider && maybeBestVal != HitObjectTypes.Spinner) { throw new ArgumentException("该行的数据不适用。"); } if (maybeBestVal == HitObjectTypes.Spinner) { DrumRollType = DrumRollTypes.Spinner; if (!types.Contains(HitObjectTypes.Spinner)) { throw new ArgumentException("该行的数据不适用。"); } HitSound = new HitSoundsConverter().Convert(int.Parse(info[4]), out _)[0]; var eval = double.Parse(info[5]); EndTime = double.IsNaN(eval) || double.IsInfinity(eval) ? 0 : (int)eval; if (info.Length > 6) { HitSample = new HitSample(info[6]); } } if (maybeBestVal == HitObjectTypes.Slider) { DrumRollType = DrumRollTypes.Slider; if (!types.Contains(HitObjectTypes.Slider)) { throw new ArgumentException("该行的数据不适用。"); } HitSound = new HitSoundsConverter().Convert(int.Parse(info[4]), out _)[0]; var sliderinfo = info[5]; var typeAndPoint = sliderinfo.Split('|'); _curvetype = typeAndPoint[0]; CurveType = Slider.GetCurveTypeByString(_curvetype); for (var i = 1; i < typeAndPoint.Length; i++) { var point = typeAndPoint[i].Split(':'); if (point.Length == 2) { var x = int.Parse(point[0]); var y = int.Parse(point[1]); curvePoints.Add(new OsuPixel(x, y)); } } RepeatTime = int.Parse(info[6]); Length = double.Parse(info[7]); if (info.Length > 8) { var sampleSets = new List <SampleSets>(); var additionSampleSets = new List <SampleSets>(); var hitSounds = new List <HitSounds>(); var hitSoundstrs = info[8].Split('|'); foreach (var str in hitSoundstrs) { hitSounds.Add(new HitSoundsConverter().Convert(int.Parse(str), out _)[0]); } if (hitSoundstrs.Length > 0) { StartingHitSound = new SliderHitSound(hitSounds[0]); } if (hitSoundstrs.Length > 1) { DuringHitSound = new SliderHitSound(hitSounds[1]); } if (hitSoundstrs.Length > 2) { EndingHitSound = new SliderHitSound(hitSounds[2]); } if (info.Length > 9) { var sampleSetstrs = info[9].Split('|'); foreach (var sampleSetstr in sampleSetstrs) { var samples = sampleSetstr.Split(':'); var sampleSet = int.Parse(samples[0]); var addionSampleSet = int.Parse(samples[1]); sampleSets.Add((SampleSets)sampleSet); additionSampleSets.Add((SampleSets)addionSampleSet); } if (sampleSets.Count > 1) { StartingHitSound = new SliderHitSound(hitSounds[0], new EdgeSound(sampleSets[0], additionSampleSets[0])); } if (sampleSets.Count > 2) { DuringHitSound = new SliderHitSound(hitSounds[1], new EdgeSound(sampleSets[1], additionSampleSets[1])); } if (sampleSets.Count > 3) { EndingHitSound = new SliderHitSound(hitSounds[2], new EdgeSound(sampleSets[2], additionSampleSets[2])); } } } } }