/// <summary> /// インスタンスを生成します。 /// </summary> /// <param name="nextTetrimino">次のテトリミノ</param> public NextFieldViewModel(IReadOnlyReactiveProperty <TetriminoKind> nextTetrimino) { //--- 描画するセルを準備 this.Cells = new CellViewModel[This.RowCount, This.ColumnCount]; foreach (var item in this.Cells.WithIndex()) { this.Cells[item.X, item.Y] = new CellViewModel(); } //--- ブロックに関する変更を処理 nextTetrimino .Select(x => Tetrimino.Create(x).Blocks.ToDictionary2(y => y.Position.Row, y => y.Position.Column)) .Subscribe(x => { //--- ViewPort のオフセット調整 //--- ちゃんと書くのがだいぶ面倒臭くなったから無理やりやる var offset = new Position((-6 - x.Count) / 2, 2); //--- 適用 foreach (var item in this.Cells.WithIndex()) { var color = x.GetValueOrDefault(item.X + offset.Row) ?.GetValueOrDefault(item.Y + offset.Column) ?.Color ?? this.BackgroundColor; item.Element.Color.Value = color; } }); }