public void InsertScoreBackwardWithNote(NoteBook noteBook, ScoreBook scoreBook, Score score, int beatNumer, int beatDenom, int barCount) { int initialScoreTick = score.StartTick; InsertScoreBackward(scoreBook, score, beatNumer, beatDenom, barCount); //score以降に含まれるすべてのノーツに対して位置をずらす int deltaTick = barCount * ScoreInfo.MaxBeatDiv * beatNumer / beatDenom; noteBook.RelocateNoteTickAfterScoreTick(initialScoreTick, deltaTick); UpdateNoteLocation?.Invoke(this); }
public void InsertScoreBackwardWithNote(NoteBook noteBook, ScoreBook database, Score baseScore, ScoreBook newScores) { int initialScoreTick = baseScore.StartTick; InsertScoreBackward(database, baseScore, newScores); //score以降に含まれるすべてのノーツに対して位置をずらす int deltaTick = 0; newScores.ForEach(x => deltaTick += ScoreInfo.MaxBeatDiv * x.BeatNumer / x.BeatDenom); noteBook.RelocateNoteTickAfterScoreTick(initialScoreTick, deltaTick); UpdateNoteLocation?.Invoke(this); }
/// <summary> /// LaneBookにScoreBookのScoreを追加します /// </summary> /// <param name="scoreBook"></param> public void SetScoreToLane(ScoreBook scoreBook) { if (!this.Any()) { Add(new ScoreLane()); } foreach (Score score in scoreBook) { // newScore全体が1つのレーンの最大サイズで収まるか判定 if (score.BarSize <= ScoreInfo.LaneMaxBar) { //現在のリストにあるレーンの末尾にまだnewScoreを入れる余裕があるか判定 if (this.Last().CurrentBarSize + score.BarSize > ScoreInfo.LaneMaxBar) { //余裕がないときは新たな空レーンを追加 Add(new ScoreLane()); } //レーン末尾にnewScoreを格納 this.Last().AddScore(score); } // newScoreの全体は1つのレーンには収まらないけど、1拍分なら収まる場合 else if (score.BarSize / score.BeatNumer <= ScoreInfo.LaneMaxBar) { var numerCountPerLane = (int)(ScoreInfo.LaneMaxBar / (score.BarSize / score.BeatNumer)); for (int i = 0; i < score.BeatNumer / (float)numerCountPerLane; ++i) { //新たにレーンを追加 if (this.Last().CurrentBarSize > 0) { Add(new ScoreLane()); } //末尾のレーンに新たなScoreを範囲を指定して格納 this.Last().AddScore( score, new Range( i * numerCountPerLane + 1, Math.Min(score.BeatNumer, (i + 1) * numerCountPerLane))); } } // newScoreの1拍分すら1つのレーンに収まらない場合 else { System.Diagnostics.Debug.Assert(false, "小節の描画がおかしくなるぞ!"); // UNDONE: どうする // 現段階で設定できる倍率(0.5, 1, 2, 4)だと、n分のm拍子に対してnが4以上の小節であれば // ここに入ることは無いので、エディタから設定できる拍子をnが4以上に設定することでここの実装をしなくてもよいことにした // (実装が面倒臭いため) } } UpdateNoteLocation?.Invoke(this); }
/// <summary> /// begin以降のレーンを詰める /// </summary> /// <param name="begin"></param> public void FillLane(ScoreLane begin) { //lanesの末尾1つ前のレーンまで処理対象 for (ScoreLane itrLane = begin; Next(itrLane) != null; itrLane = Next(itrLane)) { //nextLaneに何かScoreが入っていて、そのnextLaneの最初のScoreをitrLaneに詰める余裕がある場合のみ処理を行う for (ScoreLane nextLane = Next(itrLane); nextLane != null && nextLane.Any() && itrLane.CurrentBarSize + nextLane.FirstScore.BarSize <= ScoreInfo.LaneMaxBar; nextLane = Next(itrLane) ) { //itrLaneとnextLaneの間でScoreを詰める itrLane.AddScore(nextLane.FirstScore); nextLane.DeleteScore(nextLane.FirstScore); //詰めた結果nextLaneが空になったらnextLaneを削除 if (!nextLane.Any()) { Remove(nextLane); } } } UpdateNoteLocation?.Invoke(this); }
public void OnUpdateNoteLocation() => UpdateNoteLocation?.Invoke(this);