2 using System.Collections.Generic;
3 using System.Diagnostics;
5 using System.Threading;
10 class コンボ : FDK.Activity
12 public FDK.同期.RWLock<int> COMBO値 { get; }
16 this.スレッド間同期 = new ReaderWriterLockSlim( LockRecursionPolicy.SupportsRecursion );
17 this.COMBO値 = new FDK.同期.RWLock<int>( this.スレッド間同期, 0 );
19 this.子リスト.Add( this._単位付き数値 = new コンボジャンプ() );
22 protected override void On活性化( デバイスリソース dr )
24 this._現在のモード = EMode.非表示中;
25 this.COMBO値.Value = 0;
27 this._コンボが切れたときのCOMBO値 = 0;
28 this._コンボが切れた時刻 = FDK.カウンタ.QPCTimer.未使用;
31 protected override void On非活性化( デバイスリソース dr )
35 public void 進行描画する( デバイスリソース dr )
37 int COMBO値 = this.COMBO値.Value;
43 #region " 前回と今回の COMBO 値から、今回の状態遷移イベントを決定する。"
45 int 前回の値 = this._前回のCOMBO値;
48 if( 今回の値 < _表示可能な最小コンボ数 )
50 今回の状態遷移イベント = EEvent.非表示;
52 else if( 前回の値 == 今回の値 )
54 今回の状態遷移イベント = EEvent.同一数値;
56 else if( 前回の値 < 今回の値 )
58 今回の状態遷移イベント = EEvent.数値更新;
62 今回の状態遷移イベント = EEvent.ミス;
67 this._前回のCOMBO値 = COMBO値;
69 Retry: // モードが変化した場合はここからリトライする。(次のターンに回すと、間にPresentを挟んで表示がチラつくから。)
71 switch( this._現在のモード )
74 #region " 数値が更新されたら 進行表示中モードへ。"
76 if( 今回の状態遷移イベント == EEvent.数値更新 )
78 this._現在のモード = EMode.表示中;
81 this._単位付き数値.表示する.Value = false;
87 #region " 遷移イベントが非表示・ミスのときは 残像表示中 モードへ。"
89 if( ( 今回の状態遷移イベント == EEvent.非表示 ) ||
90 ( 今回の状態遷移イベント == EEvent.ミス ) )
92 this._現在のモード = EMode.残像表示中;
93 this._コンボが切れたときのCOMBO値 = 前回の値;
94 this._コンボが切れた時刻 = FDK.カウンタ.QPCTimer.生カウント;
97 this._単位付き数値.数値.Value = 今回の値;
98 this._単位付き数値.表示する.Value = true;
104 #region " 数値が更新された場合は 進行表示中 モードへ、残像表示時間が切れたときは 非表示 モードへ。"
106 if( 今回の状態遷移イベント == EEvent.数値更新 )
108 this._現在のモード = EMode.表示中;
111 else if( FDK.カウンタ.QPCTimer.生カウント相対値を秒へ変換して返す( FDK.カウンタ.QPCTimer.生カウント - this._コンボが切れた時刻 ) > 1.0 ) // 1.0秒経った
113 this._現在のモード = EMode.非表示中;
116 this._単位付き数値.数値.Value = this._コンボが切れたときのCOMBO値;
117 this._単位付き数値.表示する.Value = true;
125 float 中央Xdpx = 1920f / 2f;
126 //switch( Global.Users.Config.ComboPosition ) → コンボのX位置の調整はあとまわし。
128 // case Eコンボ表示位置.LEFT: n中央X = 300; break;
129 // case Eコンボ表示位置.CENTER: n中央X = 440; break;
130 // case Eコンボ表示位置.RIGHT: n中央X = 680; break;
132 float 下辺Ydpx = 130f; // Y座標は固定位置
134 this._単位付き数値.進行描画する( dr, 中央Xdpx, 下辺Ydpx, _ドラムコンボの文字間隔 );
137 protected enum EEvent
152 private const float _ドラムコンボの文字間隔 = 2f;
154 private const int _表示可能な最小コンボ数 = 11;
156 private EMode _現在のモード;
158 private int _前回のCOMBO値 = 0;
160 private long _コンボが切れた時刻 = FDK.カウンタ.QPCTimer.未使用;
162 private int _コンボが切れたときのCOMBO値 = 0;
164 private コンボジャンプ _単位付き数値 = null;
166 private ReaderWriterLockSlim スレッド間同期 = null;