Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
 /// <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);
 }
Exemplo n.º 4
0
 /// <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);
 }
Exemplo n.º 5
0
 public void OnUpdateNoteLocation() => UpdateNoteLocation?.Invoke(this);