OSDN Git Service

4d9074159f4b7e744d3faf165ebe2720fe9cebca
[strokestylet/CsWin10Desktop3.git] / StrokeStyleT / ステージ / 演奏 / コンボ.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.Linq;
5 using System.Threading;
6 using FDK.メディア;
7
8 namespace SST.ステージ.演奏
9 {
10         class コンボ : FDK.Activity
11         {
12                 public FDK.同期.RWLock<int> COMBO値 { get; }
13
14                 public コンボ()
15                 {
16                         this.スレッド間同期 = new ReaderWriterLockSlim( LockRecursionPolicy.SupportsRecursion );
17                         this.COMBO値 = new FDK.同期.RWLock<int>( this.スレッド間同期, 0 );
18
19                         this.子リスト.Add( this._単位付き数値 = new コンボジャンプ() );
20                 }
21
22                 protected override void On活性化( デバイスリソース dr )
23                 {
24                         this._現在のモード = EMode.非表示中;
25                         this.COMBO値.Value = 0;
26                         this._前回のCOMBO値 = 0;
27                         this._コンボが切れたときのCOMBO値 = 0;
28                         this._コンボが切れた時刻 = FDK.カウンタ.QPCTimer.未使用;
29                 }
30
31                 protected override void On非活性化( デバイスリソース dr )
32                 {
33                 }
34
35                 public void 進行描画する( デバイスリソース dr )
36                 {
37                         int COMBO値 = this.COMBO値.Value;
38
39                         // 進行。
40
41                         EEvent 今回の状態遷移イベント;
42
43                         #region " 前回と今回の COMBO 値から、今回の状態遷移イベントを決定する。"
44                         //-----------------
45                         int 前回の値 = this._前回のCOMBO値;
46                         int 今回の値 = COMBO値;
47
48                         if( 今回の値 < _表示可能な最小コンボ数 )
49                         {
50                                 今回の状態遷移イベント = EEvent.非表示;
51                         }
52                         else if( 前回の値 == 今回の値 )
53                         {
54                                 今回の状態遷移イベント = EEvent.同一数値;
55                         }
56                         else if( 前回の値 < 今回の値 )
57                         {
58                                 今回の状態遷移イベント = EEvent.数値更新;
59                         }
60                         else
61                         {
62                                 今回の状態遷移イベント = EEvent.ミス;
63                         }
64                         //-----------------
65                         #endregion
66
67                         this._前回のCOMBO値 = COMBO値;
68
69                         Retry:  // モードが変化した場合はここからリトライする。(次のターンに回すと、間にPresentを挟んで表示がチラつくから。)
70
71                         switch( this._現在のモード )
72                         {
73                                 case EMode.非表示中:
74                                         #region " 数値が更新されたら 進行表示中モードへ。"
75                                         //-----------------
76                                         if( 今回の状態遷移イベント == EEvent.数値更新 )
77                                         {
78                                                 this._現在のモード = EMode.表示中;
79                                                 goto Retry;
80                                         }
81                                         this._単位付き数値.表示する.Value = false;
82                                         //-----------------
83                                         #endregion
84                                         break;
85
86                                 case EMode.表示中:
87                                         #region " 遷移イベントが非表示・ミスのときは 残像表示中 モードへ。"
88                                         //-----------------
89                                         if( ( 今回の状態遷移イベント == EEvent.非表示 ) ||
90                                                 ( 今回の状態遷移イベント == EEvent.ミス ) )
91                                         {
92                                                 this._現在のモード = EMode.残像表示中;
93                                                 this._コンボが切れたときのCOMBO値 = 前回の値;
94                                                 this._コンボが切れた時刻 = FDK.カウンタ.QPCTimer.生カウント;
95                                                 goto Retry;
96                                         }
97                                         this._単位付き数値.数値.Value = 今回の値;
98                                         this._単位付き数値.表示する.Value = true;
99                                         //-----------------
100                                         #endregion
101                                         break;
102
103                                 case EMode.残像表示中:
104                                         #region " 数値が更新された場合は 進行表示中 モードへ、残像表示時間が切れたときは 非表示 モードへ。"
105                                         //-----------------
106                                         if( 今回の状態遷移イベント == EEvent.数値更新 )
107                                         {
108                                                 this._現在のモード = EMode.表示中;
109                                                 goto Retry;
110                                         }
111                                         else if( FDK.カウンタ.QPCTimer.生カウント相対値を秒へ変換して返す( FDK.カウンタ.QPCTimer.生カウント - this._コンボが切れた時刻 ) > 1.0 )     // 1.0秒経った
112                                         {
113                                                 this._現在のモード = EMode.非表示中;
114                                                 goto Retry;
115                                         }
116                                         this._単位付き数値.数値.Value = this._コンボが切れたときのCOMBO値;
117                                         this._単位付き数値.表示する.Value = true;
118                                         //-----------------
119                                         #endregion
120                                         break;
121                         }
122
123                         // 描画。
124
125                         float 中央Xdpx = 1920f / 2f;
126                         //switch( Global.Users.Config.ComboPosition )                   → コンボのX位置の調整はあとまわし。
127                         //{
128                         //      case Eコンボ表示位置.LEFT: n中央X = 300; break;
129                         //      case Eコンボ表示位置.CENTER: n中央X = 440; break;
130                         //      case Eコンボ表示位置.RIGHT: n中央X = 680; break;
131                         //}
132                         float 下辺Ydpx = 130f; // Y座標は固定位置
133
134                         this._単位付き数値.進行描画する( dr, 中央Xdpx, 下辺Ydpx, _ドラムコンボの文字間隔 );
135                 }
136
137                 protected enum EEvent
138                 {
139                         非表示,
140                         数値更新,
141                         同一数値,
142                         ミス
143                 }
144
145                 protected enum EMode
146                 {
147                         非表示中,
148                         表示中,
149                         残像表示中
150                 }
151
152                 private const float _ドラムコンボの文字間隔 = 2f;
153
154                 private const int _表示可能な最小コンボ数 = 11;
155
156                 private EMode _現在のモード;
157
158                 private int _前回のCOMBO値 = 0;
159
160                 private long _コンボが切れた時刻 = FDK.カウンタ.QPCTimer.未使用;
161
162                 private int _コンボが切れたときのCOMBO値 = 0;
163
164                 private コンボジャンプ _単位付き数値 = null;
165
166                 private ReaderWriterLockSlim スレッド間同期 = null;
167         }
168 }