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 InsertScoreForwardWithNote(NoteBook noteBook, ScoreBook database, Score baseScore, ScoreBook newScores) { if (database.Next(baseScore) == null) { SetScore(database, newScores); } else { InsertScoreBackwardWithNote(noteBook, database, database.Next(baseScore), newScores); } }
public void InsertScoreForwardWithNote(NoteBook noteBook, ScoreBook scoreBook, Score score, int beatNumer, int beatDenom, int barCount) { if (scoreBook.Next(score) == null) { SetScore(scoreBook, beatNumer, beatDenom, barCount); } else { InsertScoreBackwardWithNote(noteBook, scoreBook, scoreBook.Next(score), beatNumer, beatDenom, barCount); } }
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); }
public void InsertScoreBackward(ScoreBook scoreBook, Score score, int beatNumer, int beatDenom, int barCount) { //新たに追加する譜面たちをリストでまとめる //これはLaneBookではないのでRefreshIndex()が行われない ScoreBook newScores = new ScoreBook(); for (int i = 0; i < barCount; ++i) { newScores.Add(new Score(beatNumer, beatDenom)); } InsertScoreBackward(scoreBook, score, newScores); }
/// <summary> /// LaneBookとScoreBookにScoreを追加します /// </summary> /// <param name="scoreBook"></param> /// <param name="beatNumer"></param> /// <param name="beatDenom"></param> /// <param name="barCount"></param> public void SetScore(ScoreBook scoreBook, int beatNumer, int beatDenom, int barCount) { //新たに追加する譜面たちをリストでまとめる //これはLaneBookではないのでRefreshIndex()が行われない ScoreBook newScores = new ScoreBook(); for (int i = 0; i < barCount; ++i) { newScores.Add(new Score(beatNumer, beatDenom)); } //まとめた譜面たちをscoreBookに入れる SetScore(scoreBook, newScores); }
/// <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); }
public void InsertScoreBackward(ScoreBook database, Score baseScore, ScoreBook newScores) { database?.InsertRange(baseScore.Index, newScores); //scoreを初めて含むレーンを取得 ScoreLane lane = Find(x => x.Contains(baseScore)); List <ScoreLane> newLanes = new List <ScoreLane>(); foreach (Score newScore in newScores) { //newScoreが1つのレーンの最大サイズで収まるか判定 if (newScore.BarSize <= ScoreInfo.LaneMaxBar) { //そもそも現在のレーンリストが空の時は新レーンを1つ補充 if (!newLanes.Any()) { newLanes.Add(new ScoreLane()); } //現在のリストにあるレーンの末尾にまだnewScoreを入れる余裕があるか判定 if (newLanes.Last().CurrentBarSize + newScore.BarSize > ScoreInfo.LaneMaxBar) { //余裕がないときは新たな空レーンを追加 newLanes.Add(new ScoreLane()); } //レーン末尾にnewScoreを格納 newLanes.Last().AddScore(newScore, new Range(1, newScore.BeatNumer)); } //収まらなかった場合 else { //なんやかんやで分割して複数レーンに格納する for (int i = 0; i < newScore.BarSize / ScoreInfo.LaneMaxBar; ++i) { //新たにレーンを追加 newLanes.Add(new ScoreLane()); //末尾のレーンに新たなScoreを範囲を指定して格納 newLanes.Last().AddScore( newScore, new Range( (int)(i * newScore.BeatDenom * ScoreInfo.LaneMaxBar + 1), Math.Min(newScore.BeatNumer, (int)((i + 1) * newScore.BeatDenom * ScoreInfo.LaneMaxBar)))); } } } //scoreとその1つ前のScoreでレーンを分割 DivideLane(baseScore); // InsertRange(lane.Index, newLanes); // FillLane(); }
/// <summary> /// scoreを始めとしてcount個のScoreを削除 /// </summary> /// <param name="model"></param> /// <param name="score"></param> /// <param name="count"></param> public void DeleteScore(ScoreBook scoreBook, Score score, int count) { Score itrScore; int itrCount; //scoreからcount個Scoreを削除 for (itrScore = score, itrCount = count; itrScore != null && itrCount > 0; itrScore = scoreBook.Next(itrScore), --itrCount) { //選択されたScoreが初めて含まれるレーンを特定 ScoreLane laneBegin = Find(x => x.Contains(itrScore)); int linkCount = itrScore.LinkCount; System.Diagnostics.Debug.Assert(linkCount > 0, "linkCount is zero"); for (int i = 0; i < linkCount; ++i) { laneBegin.DeleteScore(itrScore); if (!laneBegin.Any()) { ScoreLane blankLane = laneBegin; laneBegin = Next(laneBegin); Remove(blankLane); } else { laneBegin = Next(laneBegin); } } #if DEBUG System.Diagnostics.Debug.WriteLine("LinkCount : " + linkCount.ToString()); #endif } //scoreBookから該当範囲のScoreを削除 scoreBook.Delete(score.Index, count); //レーンを詰める FillLane(); //詰み対策(雑) if (!this.Any()) { SetScore(scoreBook, 4, 4, 1); } }
public void SetScore(ScoreBook database, ScoreBook newScores) { database?.Append(newScores); SetScoreToLane(newScores); }
public void Clear(ScoreBook scoreBook) { Clear(); scoreBook.ForEach(x => x.LinkCount = 0); }