Ejemplo n.º 1
0
        /// <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]);
            }
        }
Ejemplo n.º 2
0
        /// <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]);
            }
        }
Ejemplo n.º 3
0
        /// <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]));
        }
Ejemplo n.º 4
0
        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));
        }
Ejemplo n.º 5
0
        /// <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));
        }
Ejemplo n.º 6
0
        /// <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;
            }
        }
Ejemplo n.º 7
0
        /// <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]);
            }
        }
Ejemplo n.º 8
0
        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;
            }
        }
Ejemplo n.º 9
0
 /// <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));
 }
Ejemplo n.º 10
0
        /// <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]));
                        }
                    }
                }
            }
        }