Exemplo n.º 1
0
        private void Load()
        {
            var beatmap = new Beatmap();

            AddStep("Spawn HitSlider", () =>
            {
                var clock = new StopwatchClock();

                var hs = new HitSlider(beatmap, PathType.Linear, new [] { new Vector2(200, 200), new Vector2(400, 200) }, 250, 2)
                {
                    BeginTime = 600,
                    Anchor    = Anchor.Centre,
                    Origin    = Anchor.Centre,

                    HitObjectColour = Color4.Red,

                    Clock = new FramedClock(clock)
                };
                Add(hs);

                clock.Start();

                hs.Show();
            });
        }
Exemplo n.º 2
0
        public void ParseBeatmap(string beatmap, string path)
        {
            var bm = beatmap.Split("\n");

            var hitObjects  = false;
            var general     = false;
            var difficulty  = false;
            var color       = false;
            var timingPonts = false;
            var events      = false;

            var hitObjColIndex = 0;
            var hitObjectColor = SkinManager.SkinColors[0];

            foreach (var fln in bm)
            {
                var line = fln.Trim();

                if (line.Equals("") || line.Equals(" "))
                {
                    // We've finished reading!
                    hitObjects  = false;
                    general     = false;
                    difficulty  = false;
                    color       = false;
                    timingPonts = false;
                    events      = false;

                    continue;
                }

                if (line.StartsWith("osu file format v"))
                {
                    var l = line.Split("osu file format v");
                }

                if (line.StartsWith("[HitObjects]"))
                {
                    hitObjects = true;
                    continue;
                }

                if (line.StartsWith("[General]"))
                {
                    general = true;
                    continue;
                }

                if (line.StartsWith("[Difficulty]"))
                {
                    difficulty = true;
                    continue;
                }

                if (line.StartsWith("[Colours]"))
                {
                    color = true;
                    continue;
                }

                if (line.StartsWith("[TimingPoints]"))
                {
                    timingPonts = true;
                    continue;
                }

                if (line.StartsWith("[Events]"))
                {
                    events = true;
                    continue;
                }

                if (general)
                {
                    if (line.StartsWith("AudioLeadIn:"))
                    {
                        General.AudioLeadIn = int.Parse(line.Split("AudioLeadIn:")[1].Trim());
                    }

                    if (line.StartsWith("AudioFilename:"))
                    {
                        General.AudioFilename = line.Split("AudioFilename:")[1].Trim();
                    }
                }

                if (difficulty)
                {
                    if (line.StartsWith("CircleSize:"))
                    {
                        Difficulty.CircleSize = double.Parse(line.Split("CircleSize:")[1].Trim());
                    }
                    if (line.StartsWith("ApproachRate:"))
                    {
                        Difficulty.ApproachRate = double.Parse(line.Split("ApproachRate:")[1].Trim());
                    }
                    if (line.StartsWith("OverallDifficulty:"))
                    {
                        Difficulty.OverallDifficulty = double.Parse(line.Split("OverallDifficulty:")[1].Trim());
                    }
                    if (line.StartsWith("SliderMultiplier:"))
                    {
                        Difficulty.SliderMultiplier = double.Parse(line.Split("SliderMultiplier:")[1].Trim());
                    }
                }

                if (color)
                {
                    var l   = line.Split(":").Where(s => !string.IsNullOrWhiteSpace(s)).Distinct().ToList();
                    var rgb = l[1];
                    var col = rgb.Split(",");
                    Colors.Add(new Color4(byte.Parse(col[0]), byte.Parse(col[1]), byte.Parse(col[2]), Byte.MaxValue));
                }

                if (timingPonts)
                {
                    var l           = line.Split(",");
                    var timingPoint = new TimingPoint
                    {
                        Offset      = double.Parse(l[0].Trim()),
                        MsPerBeat   = double.Parse(l[1].Trim()),
                        Meter       = int.Parse(l[2].Trim()),
                        SampleSet   = int.Parse(l[3].Trim()),
                        SampleIndex = int.Parse(l[4].Trim()),
                        Volume      = int.Parse(l[5].Trim()),
                        Inherited   = l[6].Trim() == "0", // this is reversed for some f*****g reason. FINALLY!!
                        KiaiMode    = l[7].Trim() == "1"
                    };
                    timingPoint.BPM = 60000d / timingPoint.MsPerBeat;

                    if (timingPoint.Inherited)
                    {
                        timingPoint.SpeedMultiplier = -100 * _lastBpm / timingPoint.MsPerBeat;
                    }
                    else
                    {
                        timingPoint.SpeedMultiplier = timingPoint.BPM;
                        _lastBpm = timingPoint.SpeedMultiplier;
                    }

                    timingPoint.Velocity = Difficulty.SliderMultiplier * timingPoint.SpeedMultiplier / 600f;

                    TimingPoints.Add(timingPoint);
                }

                if (events)
                {
                    var l = line.Split(",");
                    if (l[0].StartsWith("//"))
                    {
                        continue;
                    }
                    switch (l[0])
                    {
                    case "0":
                        var backgroundPath = Path.GetDirectoryName(path) + "/" +
                                             l[2]     // Remove Quotes
                                             .Remove(0, 1)
                                             .Remove(l[2].Length - 2, 1);

                        if (!File.Exists(backgroundPath))
                        {
                            continue;
                        }

                        using (var fs = File.OpenRead(backgroundPath))
                        {
                            Background = Texture.FromStream(fs);
                        }

                        break;

                    default:
                        Console.WriteLine("Event [{0}] not implemented!", l[0]);
                        break;
                    }
                }

                if (hitObjects)
                {
                    var l             = line.Split(",");
                    var x             = double.Parse(l[0]);
                    var y             = double.Parse(l[1]);
                    var timing        = int.Parse(l[2]);
                    var hitObjectType = Enum.Parse <HitObjectType>(l[3]);

                    if ((hitObjectType & HitObjectType.NewCombo) != 0)
                    {
                        hitObjColIndex++;
                        if (hitObjColIndex >= Colors.Count)
                        {
                            hitObjColIndex = 0;
                        }

                        if (Colors.Count == 0)
                        {
                            Colors.AddRange(SkinManager.SkinColors);
                        }

                        hitObjectColor = Colors[hitObjColIndex];
                    }

                    if ((hitObjectType & HitObjectType.Circle) != 0)
                    {
                        HitObject circle = new HitCircle(this, new Vector2((float)x, (float)y));
                        circle.BeginTime       = timing;
                        circle.HitObjectColour = hitObjectColor;

                        HitObjects.Add(circle);
                    }

                    if ((hitObjectType & HitObjectType.Slider) != 0)
                    {
                        var sliderInfo = l[5].Split("|");

                        var sliderType = sliderInfo[0] switch
                        {
                            "L" => PathType.Linear,
                            "P" => PathType.PerfectCurve,
                            "B" => PathType.Bezier,
                            "C" => PathType.Catmull,
                            _ => PathType.Linear
                        };

                        var curvePoints = new List <Vector2> {
                            new Vector2((float)x, (float)y)
                        };

                        foreach (var s in sliderInfo)
                        {
                            if (!s.Contains(":"))
                            {
                                continue;
                            }

                            var cp = s.Split(":").Select(double.Parse).ToList();

                            x = cp[0];
                            y = cp[1];

                            var curvePoint = new Vector2((float)x, (float)y);

                            curvePoints.Add(curvePoint);
                        }

                        var pixelLength = double.Parse(l[7].Trim());
                        var repeats     = int.Parse(l[6].Trim());

                        HitObject slider = new HitSlider(
                            this,
                            sliderType, curvePoints,
                            pixelLength, repeats);

                        slider.BeginTime       = timing;
                        slider.TimingPoint     = TimingPoints.FirstOrDefault(s => s.Offset >= timing);
                        slider.HitObjectColour = hitObjectColor;

                        HitObjects.Add(slider);
                    }
                }
            }

            // Sort by Time
            HitObjects.Sort((a, b) => (int)(a.BeginTime - b.BeginTime));

            for (var i = 0; i < HitObjects.Count; i++)
            {
                var obj = HitObjects[i];

                obj.Depth = i;
            }
        }