2 using System.Collections.Generic;
3 using System.Diagnostics;
13 class ヒットランク : Activity
17 // すべてのヒットランク画像を子リストに追加。
18 foreach( var kvp in this._ヒットランク画像 )
19 this.子リスト.Add( kvp.Value );
22 public void 表示開始( 表示レーン種別 laneType, ヒットランク種別 hitRankType )
26 if( laneType == 表示レーン種別.Unknown )
29 // レーンに対応する進行描画コンテキストを更新し、表示を開始するためのパラメータを設定する。
30 if( this._表示レーンto進行描画コンテキスト.ContainsKey( laneType ) ) // すでにあったら、
31 this._表示レーンto進行描画コンテキスト.Remove( laneType ); // 削除してから、
33 this._表示レーンto進行描画コンテキスト.Add( // 追加。
36 ヒットランク種別 = hitRankType,
37 進行カウンタ = new FDK.カウンタ.Counter( 最初の値: 0, 最後の値: 300, 値をひとつ増加させるのにかける時間ms: 1 ), // カウント開始(=表示開始)
47 public void 表示開始( チップ種別 chipType, ヒットランク種別 hitRankType )
51 var laneType = App.ユーザ管理.選択されているユーザ.オプション設定.ドラムとチップと入力の対応表[ chipType ].表示レーン種別;
53 if( laneType != 表示レーン種別.Unknown )
54 this.表示開始( laneType, hitRankType );
58 protected override void On活性化( グラフィックデバイス gd )
60 // すべての表示レーンについて、進行描画コンテキストを生成する。
61 this._表示レーンto進行描画コンテキスト = new Dictionary<表示レーン種別, 進行描画コンテキスト>();
62 foreach( 表示レーン種別 laneType in Enum.GetValues(typeof( 表示レーン種別 ) ) )
63 this._表示レーンto進行描画コンテキスト.Add( laneType, new 進行描画コンテキスト() );
66 protected override void On非活性化( グラフィックデバイス gd )
68 this._表示レーンto進行描画コンテキスト.Clear();
75 foreach( 表示レーン種別 lane in Enum.GetValues( typeof( 表示レーン種別 ) ) )
77 var context = this._表示レーンto進行描画コンテキスト[ lane ];
79 if( context.進行カウンタ.停止中である )
80 continue; // カウンタが停止中 → このレーンについては何もしない。
82 if( context.進行カウンタ.終了値に達した )
84 #region " 進行カウンタが終了値に達したら停止 → 表示完了。"
86 context.進行カウンタ.一時停止する();
92 if( context.ヒットランク種別 != ヒットランク種別.MISS )
94 #region " (A) Perfect, Great, Good, Poor, Auto のアニメーション進行。"
96 if( context.進行カウンタ.現在値 < 50 )
99 context.X方向拡大率 = 1.0f + ( 1.0f * ( 1.0f - ( context.進行カウンタ.現在値 / 50.0f ) ) );
100 context.Y方向拡大率 = context.進行カウンタ.現在値 / 50.0f;
103 context.透明度0to1 = 1.0f;
105 else if( context.進行カウンタ.現在値 < 130 )
108 context.X方向拡大率 = 1.0f;
109 context.Y方向拡大率 = 1.0f;
111 context.相対Y座標 = ( ( context.進行カウンタ.現在値 % 6 ) == 0 ) ? ( App.乱数.Next( 6 ) - 3 ) : context.相対Y座標;
112 context.透明度0to1 = 1.0f;
114 else if( context.進行カウンタ.現在値 < 240 )
117 context.X方向拡大率 = 1.0f;
118 context.Y方向拡大率 = 1.0f;
121 context.透明度0to1 = 1.0f;
126 context.X方向拡大率 = 1.0f;
127 context.Y方向拡大率 = 1.0f - ( ( 1.0f * ( context.進行カウンタ.現在値 - 240 ) ) / 60.0f );
130 context.透明度0to1 = 1.0f;
137 #region " (B) Miss のアニメーション進行だけ他とは違ってたり。"
139 if( context.進行カウンタ.現在値 < 50 )
142 context.X方向拡大率 = 1.0f;
143 context.Y方向拡大率 = context.進行カウンタ.現在値 / 50.0f;
146 context.透明度0to1 = 1.0f;
148 else if( context.進行カウンタ.現在値 < 200 )
151 context.X方向拡大率 = 1.0f;
152 context.Y方向拡大率 = 1.0f;
155 context.透明度0to1 = 1.0f;
160 context.X方向拡大率 = 1.0f - ( ( context.進行カウンタ.現在値 - 200 ) / 100.0f );
161 context.Y方向拡大率 = 1.0f - ( ( context.進行カウンタ.現在値 - 200 ) / 100.0f );
164 context.透明度0to1 = 1.0f;
174 public void 描画する( グラフィックデバイス gd, float レーンフレームの左端 )
176 lock( this._スレッド間同期 )
178 foreach( 表示レーン種別 lane in Enum.GetValues( typeof( 表示レーン種別 ) ) )
180 var context = this._表示レーンto進行描画コンテキスト[ lane ];
182 if( context.進行カウンタ.停止中である )
183 continue; // カウンタが停止中 → このレーンについては何もしない。
185 var 判定文字列の画像 = this._ヒットランク画像[ context.ヒットランク種別 ];
190 new Vector2( context.相対X座標, context.相対Y座標 )
191 + new Vector2( レーンフレームの左端 + レーンフレーム.レーンto横中央相対位置[ lane ], this._表示レーンtoレーン表示縦中央位置[ lane ] )
193 -( ( 判定文字列の画像.サイズ.Width * context.X方向拡大率 ) / 2f ),
194 -( ( 判定文字列の画像.サイズ.Height * context.Y方向拡大率 ) / 2f ) );
200 不透明度0to1: context.透明度0to1,
201 X方向拡大率: context.X方向拡大率,
202 Y方向拡大率: context.Y方向拡大率 );
209 /// ヒット判定レーンには、それぞれに1つずつの進行描画コンテキストを用意する。
211 private class 進行描画コンテキスト
214 /// ヒット判定文字列のアニメ進行用カウンタ。
215 /// このカウンタが動作中のときのみ、ヒット判定文字列が描画される。
217 public Counter 進行カウンタ;
221 /// 進行カウンタが動作中のときのみ有効。
223 public ヒットランク種別 ヒットランク種別;
232 public float 透明度0to1;
241 this.進行カウンタ = new Counter();
242 this.ヒットランク種別 = ヒットランク種別.AUTO;
255 private Dictionary<表示レーン種別, 進行描画コンテキスト> _表示レーンto進行描画コンテキスト = null;
257 private readonly Dictionary<ヒットランク種別, 画像> _ヒットランク画像 = new Dictionary<ヒットランク種別, 画像>() {
258 { ヒットランク種別.PERFECT, new 画像( @"$(System)images\Judge Perfect.png" ) },
259 { ヒットランク種別.GREAT, new 画像( @"$(System)images\Judge Great.png" ) },
260 { ヒットランク種別.GOOD, new 画像( @"$(System)images\Judge Good.png" ) },
261 { ヒットランク種別.POOR, new 画像( @"$(System)images\Judge Poor.png" ) },
262 { ヒットランク種別.MISS, new 画像( @"$(System)images\Judge Miss.png" ) },
263 { ヒットランク種別.AUTO, new 画像( @"$(System)images\Judge Auto.png" ) },
266 private readonly Dictionary<表示レーン種別, float> _表示レーンtoレーン表示縦中央位置 = new Dictionary<表示レーン種別, float>() {
267 { 表示レーン種別.Unknown, 0f },
268 { 表示レーン種別.LeftCrash, 469f },
269 { 表示レーン種別.HiHat, 562f },
270 { 表示レーン種別.Snare, 641f },
271 { 表示レーン種別.Tom1, 495f },
272 { 表示レーン種別.Bass, 716f },
273 { 表示レーン種別.Tom2, 558f },
274 { 表示レーン種別.Tom3, 798f },
275 { 表示レーン種別.RightCrash, 633f },
278 private readonly object _スレッド間同期 = new object();