コード例 #1
0
        public void Parse(string[] lines)
        {
            Sections.Clear();
            Notes.Clear();
            NotesMap.Clear();

            var isNotes = false;

            foreach (var line in lines)
            {
                if (line.StartsWith("#"))
                {
                    continue;
                }

                if (!isNotes)
                {
                    if (line == "NOTES")
                    {
                        isNotes = true;
                        continue;
                    }

                    var arr = line.Split(':');
                    if (arr.Length < 2)
                    {
                        continue;
                    }

                    switch (arr[0].ToLower())
                    {
                    case "buttons":
                        int btn;
                        if (Int32.TryParse(arr[1], out btn))
                        {
                            NumberOfButtons = btn;
                        }
                        break;

                    case "author":
                        Author = arr[1];
                        break;

                    case "difficulty":
                        DifficultyName = arr[1];
                        break;

                    case "sections":
                        var strs = arr[1].Split('|');
                        foreach (var sectionStr in strs)
                        {
                            var sectionArr = sectionStr.Split(',');
                            if (sectionArr.Length < 2)
                            {
                                continue;
                            }

                            double bpm, start;
                            if (Double.TryParse(sectionArr[0], out start) &&
                                Double.TryParse(sectionArr[1], out bpm))
                            {
                                Sections.Add(new BeatmapSection
                                {
                                    Bpm       = bpm,
                                    StartTime = start,
                                });
                            }
                        }
                        break;

                    case "events":
                        strs = arr[1].Split('|');
                        foreach (var eventStr in strs)
                        {
                            var eventArr = eventStr.Split(',');
                            if (eventArr.Length < 4)
                            {
                                continue;
                            }

                            int sectionId, beat, subBeat, eventId;
                            if (Int32.TryParse(eventArr[0], out sectionId) &&
                                Int32.TryParse(eventArr[1], out beat) &&
                                Int32.TryParse(eventArr[2], out subBeat) &&
                                Int32.TryParse(eventArr[3], out eventId))
                            {
                                var ev = new BeatmapEvent(this, sectionId)
                                {
                                    EventId = eventId,
                                    Beat    = beat,
                                    SubBeat = subBeat
                                };

                                if (eventArr.Length > 4)
                                {
                                    ev.EventArgs = eventArr[4];
                                }
                                Events.Add(ev);
                            }
                        }
                        break;
                    }
                }
                else
                {
                    var note = Note.ParseLine(line, this);

                    if (note != null && !NotesMap.ContainsKey(note.Id))
                    {
                        Notes.Add(note);
                        NotesMap[note.Id] = note;
                    }
                }
            }

            Notes.Sort((a, b) =>
            {
                var diff = a.Time - b.Time;
                return(diff != 0 ? diff : a.Id - b.Id);
            });

            Events.Sort((a, b) => a.Time - b.Time);

            for (int i = 0; i < Notes.Count; ++i)
            {
                Notes[i].Index = i;
                Notes[i].PostInitialize();
            }
        }
コード例 #2
0
 /// <summary>
 /// 当前场景的逻辑层准备就绪时调用一次,主线程。
 /// Unity的Scene载入时才会触发这个函数,在同一个Scene里 重新载入歌曲和谱面 不会再次调用这个函数
 /// 可以保证此时 Stage、StageMusic、PoolManager 等类已经 Awake,详情查看 Edit -> Project Setting -> Script Execution Order
 /// </summary>
 public static void StageAwake()
 {
     NotesMap.init();
 }