OSDN Git Service

#31602 描画遅延対策として、判定ラインの表示を上下させる機能を試作した。
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 04.コンフィグ / CStageコンフィグ.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Globalization;\r
5 using System.Runtime.InteropServices;\r
6 using System.Drawing;\r
7 using System.Diagnostics;\r
8 using FDK;\r
9 \r
10 namespace DTXMania\r
11 {\r
12         internal class CStageコンフィグ : CStage\r
13         {\r
14                 // プロパティ\r
15 \r
16                 //public CActDFPFont actFont { get; private set; }\r
17 \r
18 \r
19                 // コンストラクタ\r
20 \r
21                 public CStageコンフィグ()\r
22                 {\r
23                         //CActDFPFont font;\r
24                         base.eステージID = CStage.Eステージ.コンフィグ;\r
25                         base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
26                         //this.actFont = font = new CActDFPFont();\r
27                         //base.list子Activities.Add( font );\r
28                         base.list子Activities.Add( this.actFIFO = new CActFIFOWhite() );\r
29                         base.list子Activities.Add( this.actList = new CActConfigList() );\r
30                         base.list子Activities.Add( this.actKeyAssign = new CActConfigKeyAssign() );\r
31                         base.list子Activities.Add( this.actオプションパネル = new CActオプションパネル() );\r
32                         base.b活性化してない = true;\r
33                 }\r
34                 \r
35                 \r
36                 // メソッド\r
37 \r
38                 public void tアサイン完了通知()                                                                                                                 // CONFIGにのみ存在\r
39                 {                                                                                                                                                                               //\r
40                         this.eItemPanelモード = EItemPanelモード.パッド一覧;                                                         //\r
41                 }                                                                                                                                                                               //\r
42                 public void tパッド選択通知( EKeyConfigPart part, EKeyConfigPad pad )                                                    //\r
43                 {                                                                                                                                                                               //\r
44                         this.actKeyAssign.t開始( part, pad, this.actList.ib現在の選択項目.str項目名 );              //\r
45                         this.eItemPanelモード = EItemPanelモード.キーコード一覧;                                                   //\r
46                 }                                                                                                                                                                               //\r
47                 public void t項目変更通知()                                                                                                                               // OPTIONと共通\r
48                 {                                                                                                                                                                               //\r
49                         this.t説明文パネルに現在選択されている項目の説明を描画する();                                         //\r
50                 }                                                                                                                                                                               //\r
51 \r
52                 \r
53                 // CStage 実装\r
54 \r
55                 public override void On活性化()\r
56                 {\r
57                         Trace.TraceInformation( "コンフィグステージを活性化します。" );\r
58                         Trace.Indent();\r
59                         try\r
60                         {\r
61                                 this.n現在のメニュー番号 = 0;                                                                                                  //\r
62                                 this.ftフォント = new Font( "MS PGothic", 26f / 2 * Scale.Y, FontStyle.Bold, GraphicsUnit.Pixel );                  //\r
63                                 for ( int i = 0; i < 4; i++ )                                                                                                   //\r
64                                 {                                                                                                                                                               //\r
65                                         this.ctキー反復用[ i ] = new CCounter( 0, 0, 0, CDTXMania.Timer );                 //\r
66                                 }                                                                                                                                                               //\r
67                                 this.bメニューにフォーカス中 = true;                                                                                 // ここまでOPTIONと共通\r
68                                 this.eItemPanelモード = EItemPanelモード.パッド一覧;\r
69 \r
70                                 fDisplayLagTimeBaseMs.Drums = (float) CDTXMania.ConfigIni.nJudgeLinePosOffset.Drums / ( CDTXMania.ConfigIni.n譜面スクロール速度.Drums + 1 );\r
71                                 fDisplayLagTimeBaseMs.Guitar = (float) CDTXMania.ConfigIni.nJudgeLinePosOffset.Guitar / ( CDTXMania.ConfigIni.n譜面スクロール速度.Guitar + 1 );\r
72                                 fDisplayLagTimeBaseMs.Bass = (float) CDTXMania.ConfigIni.nJudgeLinePosOffset.Bass / ( CDTXMania.ConfigIni.n譜面スクロール速度.Bass + 1 );\r
73                         }\r
74                         finally\r
75                         {\r
76                                 Trace.TraceInformation( "コンフィグステージの活性化を完了しました。" );\r
77                                 Trace.Unindent();\r
78                         }\r
79                         base.On活性化();             // 2011.3.14 yyagi: On活性化()をtryの中から外に移動\r
80                 }\r
81                 public override void On非活性化()\r
82                 {\r
83                         Trace.TraceInformation( "コンフィグステージを非活性化します。" );\r
84                         Trace.Indent();\r
85                         try\r
86                         {\r
87                                 CDTXMania.ConfigIni.t書き出し( CDTXMania.strEXEのあるフォルダ + "Config.ini" );      // CONFIGだけ\r
88                                 if( this.ftフォント != null )                                                                                                       // 以下OPTIONと共通\r
89                                 {\r
90                                         this.ftフォント.Dispose();\r
91                                         this.ftフォント = null;\r
92                                 }\r
93                                 for( int i = 0; i < 4; i++ )\r
94                                 {\r
95                                         this.ctキー反復用[ i ] = null;\r
96                                 }\r
97 \r
98                                 CDTXMania.ConfigIni.nJudgeLinePosOffset.Drums =  (int) ( fDisplayLagTimeBaseMs.Drums  * ( CDTXMania.ConfigIni.n譜面スクロール速度.Drums + 1 ) );\r
99                                 CDTXMania.ConfigIni.nJudgeLinePosOffset.Guitar = (int) ( fDisplayLagTimeBaseMs.Guitar * ( CDTXMania.ConfigIni.n譜面スクロール速度.Guitar + 1 ) );\r
100                                 CDTXMania.ConfigIni.nJudgeLinePosOffset.Bass =   (int) ( fDisplayLagTimeBaseMs.Bass   * ( CDTXMania.ConfigIni.n譜面スクロール速度.Bass + 1 ) );\r
101 \r
102                                 base.On非活性化();\r
103                         }\r
104                         catch ( UnauthorizedAccessException e )\r
105                         {\r
106                                 Trace.TraceError( e.Message + "ファイルが読み取り専用になっていないか、管理者権限がないと書き込めなくなっていないか等を確認して下さい" );\r
107                         }\r
108                         catch ( Exception e )\r
109                         {\r
110                                 Trace.TraceError( e.Message );\r
111                         }\r
112                         finally\r
113                         {\r
114                                 Trace.TraceInformation( "コンフィグステージの非活性化を完了しました。" );\r
115                                 Trace.Unindent();\r
116                         }\r
117                 }\r
118                 public override void OnManagedリソースの作成()                                                                                   // OPTIONと画像以外共通\r
119                 {\r
120                         if( !base.b活性化してない )\r
121                         {\r
122                                 this.tx背景 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenConfig background.jpg" ), false );\r
123                                 this.tx上部パネル = CDTXMania.tテクスチャの生成Af( CSkin.Path( @"Graphics\ScreenConfig header panel.png" ), true );\r
124                                 this.tx下部パネル = CDTXMania.tテクスチャの生成Af( CSkin.Path( @"Graphics\ScreenConfig footer panel.png" ), true );\r
125                                 this.txMenuカーソル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenConfig menu cursor.png" ), false );\r
126 \r
127                                 prvFont = new CPrivateFastFont( CSkin.Path( @"Graphics\fonts\mplus-1p-heavy.ttf" ), (int) ( 18 * Scale.Y ) );\r
128                                 string[] strMenuItem = { "System", "Drums", "Guitar", "Bass", "Exit" };\r
129                                 txMenuItemLeft = new CTexture[ strMenuItem.Length, 2 ];\r
130                                 for ( int i = 0; i < strMenuItem.Length; i++ )\r
131                                 {\r
132                                         Bitmap bmpStr;\r
133                                         bmpStr = prvFont.DrawPrivateFont( strMenuItem[ i ], Color.White, Color.Black );\r
134                                         txMenuItemLeft[ i, 0 ] = CDTXMania.tテクスチャの生成( bmpStr, false );\r
135                                         bmpStr.Dispose();\r
136                                         bmpStr = prvFont.DrawPrivateFont( strMenuItem[ i ], Color.White, Color.Black, Color.Yellow, Color.OrangeRed );\r
137                                         txMenuItemLeft[ i, 1 ] = CDTXMania.tテクスチャの生成( bmpStr, false );\r
138                                         bmpStr.Dispose();\r
139                                 }\r
140                                 if( this.bメニューにフォーカス中 )\r
141                                 {\r
142                                         this.t説明文パネルに現在選択されているメニューの説明を描画する();\r
143                                 }\r
144                                 else\r
145                                 {\r
146                                         this.t説明文パネルに現在選択されている項目の説明を描画する();\r
147                                 }\r
148                                 base.OnManagedリソースの作成();\r
149                         }\r
150                 }\r
151                 public override void OnManagedリソースの解放()                                                                                   // OPTIONと同じ(COnfig.iniの書き出しタイミングのみ異なるが、無視して良い)\r
152                 {\r
153                         if( !base.b活性化してない )\r
154                         {\r
155                                 CDTXMania.tテクスチャの解放( ref this.tx背景 );\r
156                                 CDTXMania.tテクスチャの解放( ref this.tx上部パネル );\r
157                                 CDTXMania.tテクスチャの解放( ref this.tx下部パネル );\r
158                                 CDTXMania.tテクスチャの解放( ref this.txMenuカーソル );\r
159                                 CDTXMania.tテクスチャの解放( ref this.tx説明文パネル );\r
160                                 prvFont.Dispose();\r
161                                 for ( int i = 0; i < txMenuItemLeft.GetLength( 0 ); i++ )\r
162                                 {\r
163                                         txMenuItemLeft[ i, 0 ].Dispose();\r
164                                         txMenuItemLeft[ i, 0 ] = null;\r
165                                         txMenuItemLeft[ i, 1 ].Dispose();\r
166                                         txMenuItemLeft[ i, 1 ] = null;\r
167                                 }\r
168                                 txMenuItemLeft = null;\r
169                                 base.OnManagedリソースの解放();\r
170                         }\r
171                 }\r
172                 public override int On進行描画()\r
173                 {\r
174                         if( base.b活性化してない )\r
175                                 return 0;\r
176 \r
177                         if( base.b初めての進行描画 )\r
178                         {\r
179                                 base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;\r
180                                 this.actFIFO.tフェードイン開始();\r
181                                 base.b初めての進行描画 = false;\r
182                         }\r
183 \r
184                         // 描画\r
185 \r
186                         #region [ 背景 ]\r
187                         //---------------------\r
188                         if( this.tx背景 != null )\r
189                                 this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );\r
190                         //---------------------\r
191                         #endregion\r
192                         #region [ メニューカーソル ]\r
193                         //---------------------\r
194                         if ( this.txMenuカーソル != null )\r
195                         {\r
196                                 Rectangle rectangle;\r
197                                 this.txMenuカーソル.n透明度 = this.bメニューにフォーカス中 ? 0xff : 0x80;\r
198                                 int x = (int) ( 0x37 * Scale.X );\r
199                                 int y = (int) ( ( 0x61 + ( this.n現在のメニュー番号 * 0x19 ) ) * Scale.Y );\r
200                                 int num3 = (int) ( 170 * Scale.X );\r
201                                 this.txMenuカーソル.t2D描画( CDTXMania.app.Device, x, y, new Rectangle( 0, 0, (int) ( 0x10 * Scale.X ), (int) ( 0x20 * Scale.Y ) ) );\r
202                                 this.txMenuカーソル.t2D描画( CDTXMania.app.Device, ( x + num3 ) - 0x10 * Scale.X, y, new Rectangle( (int) ( 0x10 * Scale.X ), 0, (int) ( 0x10 * Scale.X ), (int) ( 0x20 * Scale.Y ) ) );\r
203                                 x += (int) ( 0x10 * Scale.X );\r
204                                 for ( num3 -= (int) ( 0x20 * Scale.X ); num3 > 0; num3 -= rectangle.Width )\r
205                                 {\r
206                                         rectangle = new Rectangle( (int) ( 8 * Scale.X ), 0, (int) ( 0x10 * Scale.X ), (int) ( 0x20 * Scale.Y ) );\r
207                                         if ( num3 < (int) ( 0x10 * Scale.X ) )\r
208                                         {\r
209                                                 rectangle.Width -= (int) ( 0x10 * Scale.X ) - num3;\r
210                                         }\r
211                                         this.txMenuカーソル.t2D描画( CDTXMania.app.Device, x, y, rectangle );\r
212                                         x += rectangle.Width;\r
213                                 }\r
214                         }\r
215                         //---------------------\r
216                         #endregion\r
217                         #region [ メニュー ]\r
218                         //---------------------\r
219                         int menuY = (int) ( 100 * Scale.Y ) - 20;\r
220                         int stepY = (int) ( 25 * Scale.Y );\r
221                         for ( int i = 0; i < txMenuItemLeft.GetLength( 0 ); i++ )\r
222                         {\r
223                                 //Bitmap bmpStr = (this.n現在のメニュー番号 == i) ?\r
224                                 //      prvFont.DrawPrivateFont( strMenuItem[ i ], Color.White, Color.Black, Color.Yellow, Color.OrangeRed ) :\r
225                                 //      prvFont.DrawPrivateFont( strMenuItem[ i ], Color.White, Color.Black );\r
226                                 //txMenuItemLeft = CDTXMania.tテクスチャの生成( bmpStr, false );\r
227                                 int flag = ( this.n現在のメニュー番号 == i ) ? 1 : 0;\r
228                                 int num4 = txMenuItemLeft[ i, flag ].sz画像サイズ.Width;\r
229                                 txMenuItemLeft[ i, flag ].t2D描画( CDTXMania.app.Device, 0x8a * Scale.X - ( num4 / 2 ), menuY ); //55\r
230                                 //txMenuItem.Dispose();\r
231                                 menuY += stepY;\r
232                         }\r
233                         //---------------------\r
234                         #endregion\r
235                         #region [ 説明文パネル ]\r
236                         //---------------------\r
237                         if ( this.tx説明文パネル != null )\r
238                                 this.tx説明文パネル.t2D描画( CDTXMania.app.Device, 0x1d * Scale.X, 0xf8 * Scale.Y );\r
239                         //---------------------\r
240                         #endregion\r
241                         #region [ アイテム ]\r
242                         //---------------------\r
243                         switch( this.eItemPanelモード )\r
244                         {\r
245                                 case EItemPanelモード.パッド一覧:\r
246                                         this.actList.t進行描画( !this.bメニューにフォーカス中 );\r
247                                         break;\r
248 \r
249                                 case EItemPanelモード.キーコード一覧:\r
250                                         this.actKeyAssign.On進行描画();\r
251                                         break;\r
252                         }\r
253                         //---------------------\r
254                         #endregion\r
255                         #region [ 上部パネル ]\r
256                         //---------------------\r
257                         if( this.tx上部パネル != null )\r
258                                 this.tx上部パネル.t2D描画( CDTXMania.app.Device, 0, 0 );\r
259                         //---------------------\r
260                         #endregion\r
261                         #region [ 下部パネル ]\r
262                         //---------------------\r
263                         if( this.tx下部パネル != null )\r
264                                 this.tx下部パネル.t2D描画( CDTXMania.app.Device, 0, SampleFramework.GameWindowSize.Height - this.tx下部パネル.sz画像サイズ.Height );\r
265                         //---------------------\r
266                         #endregion\r
267                         #region [ オプションパネル ]\r
268                         //---------------------\r
269                         this.actオプションパネル.On進行描画();\r
270                         //---------------------\r
271                         #endregion\r
272                         #region [ フェードイン・アウト ]\r
273                         //---------------------\r
274                         switch( base.eフェーズID )\r
275                         {\r
276                                 case CStage.Eフェーズ.共通_フェードイン:\r
277                                         if( this.actFIFO.On進行描画() != 0 )\r
278                                         {\r
279                                                 CDTXMania.Skin.bgmコンフィグ画面.t再生する();\r
280                                                 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
281                                         }\r
282                                         break;\r
283 \r
284                                 case CStage.Eフェーズ.共通_フェードアウト:\r
285                                         if( this.actFIFO.On進行描画() == 0 )\r
286                                         {\r
287                                                 break;\r
288                                         }\r
289                                         return 1;\r
290                         }\r
291                         //---------------------\r
292                         #endregion\r
293 \r
294                         #region [ Enumerating Songs ]\r
295                         // CActEnumSongs側で表示する\r
296                         #endregion\r
297 \r
298                         // キー入力\r
299                         #region [ キー入力 ]\r
300                         if ( ( base.eフェーズID != CStage.Eフェーズ.共通_通常状態 )\r
301                                 || this.actKeyAssign.bキー入力待ちの最中である\r
302                                 || CDTXMania.act現在入力を占有中のプラグイン != null )\r
303                                 return 0;\r
304 \r
305                         // 曲データの一覧取得中は、キー入力を無効化する\r
306                         if ( !CDTXMania.EnumSongs.IsEnumerating || CDTXMania.actEnumSongs.bコマンドでの曲データ取得 != true )\r
307                         {\r
308                                 if ( ( CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape ) || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.FT ) ) || CDTXMania.Pad.b押されたGB( Eパッド.FT ) )\r
309                                 {\r
310                                         CDTXMania.Skin.sound取消音.t再生する();\r
311                                         if ( !this.bメニューにフォーカス中 )\r
312                                         {\r
313                                                 if ( this.eItemPanelモード == EItemPanelモード.キーコード一覧 )\r
314                                                 {\r
315                                                         CDTXMania.stageコンフィグ.tアサイン完了通知();\r
316                                                         return 0;\r
317                                                 }\r
318                                                 if ( !this.actList.bIsKeyAssignSelected && !this.actList.bIsFocusingParameter ) // #24525 2011.3.15 yyagi, #32059 2013.9.17 yyagi\r
319                                                 {\r
320                                                         this.bメニューにフォーカス中 = true;\r
321                                                 }\r
322                                                 this.t説明文パネルに現在選択されているメニューの説明を描画する();\r
323                                                 this.actList.tEsc押下();                                                              // #24525 2011.3.15 yyagi ESC押下時の右メニュー描画用\r
324                                         }\r
325                                         else\r
326                                         {\r
327                                                 this.actFIFO.tフェードアウト開始();\r
328                                                 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
329                                         }\r
330                                 }\r
331                                 #region [ ← ]\r
332                                 else if ( CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.LeftArrow ) )     // 左カーソルキー\r
333                                 {\r
334                                         if ( !this.bメニューにフォーカス中 )\r
335                                         {\r
336                                                 if ( this.eItemPanelモード == EItemPanelモード.キーコード一覧 )\r
337                                                 {\r
338                                                         //キーコンフィグ画面中は、[←]押下に反応させない\r
339                                                         return 0;\r
340                                                 }\r
341                                                 if ( this.actList.bIsFocusingParameter )\r
342                                                 {\r
343                                                         // パラメータを増減している最中も、[←]押下に反応させない\r
344                                                         return 0;\r
345                                                 }\r
346                                                 if ( !this.actList.bIsKeyAssignSelected && !this.actList.bIsFocusingParameter ) // #24525 2011.3.15 yyagi, #32059 2013.9.17 yyagi\r
347                                                 {\r
348                                                         this.bメニューにフォーカス中 = true;\r
349                                                 }\r
350                                                 CDTXMania.Skin.sound取消音.t再生する();\r
351                                                 this.t説明文パネルに現在選択されているメニューの説明を描画する();\r
352                                                 this.actList.tEsc押下();                                                              // #24525 2011.3.15 yyagi ESC押下時の右メニュー描画用\r
353                                         }\r
354                                 }\r
355                                 #endregion\r
356                                 else if ( ( CDTXMania.Pad.b押されたDGB( Eパッド.CY ) || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.RD ) ) || ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LC ) || ( CDTXMania.ConfigIni.bEnterがキー割り当てのどこにも使用されていない && CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Return ) ) ) )\r
357                                 {\r
358                                         #region [ EXIT ]\r
359                                         if ( this.n現在のメニュー番号 == 4 )\r
360                                         {\r
361                                                 CDTXMania.Skin.sound決定音.t再生する();\r
362                                                 this.actFIFO.tフェードアウト開始();\r
363                                                 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
364                                         }\r
365                                         #endregion\r
366                                         else if ( this.bメニューにフォーカス中 )\r
367                                         {\r
368                                                 CDTXMania.Skin.sound決定音.t再生する();\r
369                                                 this.bメニューにフォーカス中 = false;\r
370                                                 this.t説明文パネルに現在選択されている項目の説明を描画する();\r
371                                         }\r
372                                         else\r
373                                         {\r
374                                                 switch ( this.eItemPanelモード )\r
375                                                 {\r
376                                                         case EItemPanelモード.パッド一覧:\r
377                                                                 bool bIsKeyAssignSelectedBeforeHitEnter = this.actList.bIsKeyAssignSelected;    // #24525 2011.3.15 yyagi\r
378                                                                 this.actList.tEnter押下();\r
379                                                                 if ( this.actList.b現在選択されている項目はReturnToMenuである )\r
380                                                                 {\r
381                                                                         this.t説明文パネルに現在選択されているメニューの説明を描画する();\r
382                                                                         if ( bIsKeyAssignSelectedBeforeHitEnter == false )                                                      // #24525 2011.3.15 yyagi\r
383                                                                         {\r
384                                                                                 this.bメニューにフォーカス中 = true;\r
385                                                                         }\r
386                                                                 }\r
387                                                                 break;\r
388 \r
389                                                         case EItemPanelモード.キーコード一覧:\r
390                                                                 this.actKeyAssign.tEnter押下();\r
391                                                                 break;\r
392                                                 }\r
393                                         }\r
394                                 }\r
395                                 #region [ → ]\r
396                                 else if ( CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.RightArrow ) )    // 右カーソルキー\r
397                                 {\r
398                                         #region [ EXIT ]\r
399                                         if ( this.n現在のメニュー番号 == 4 )\r
400                                         {\r
401                                                 // 何もしない\r
402                                         }\r
403                                         #endregion\r
404                                         else if ( this.bメニューにフォーカス中 )\r
405                                         {\r
406                                                 CDTXMania.Skin.sound決定音.t再生する();\r
407                                                 this.bメニューにフォーカス中 = false;\r
408                                                 this.t説明文パネルに現在選択されている項目の説明を描画する();\r
409                                         }\r
410                                 }\r
411                                 #endregion\r
412                                 this.ctキー反復用.Up.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.UpArrow ), new CCounter.DGキー処理( this.tカーソルを上へ移動する ) );\r
413                                 this.ctキー反復用.R.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.HH ), new CCounter.DGキー処理( this.tカーソルを上へ移動する ) );\r
414                                 if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.SD ) )\r
415                                 {\r
416                                         this.tカーソルを上へ移動する();\r
417                                 }\r
418                                 this.ctキー反復用.Down.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.DownArrow ), new CCounter.DGキー処理( this.tカーソルを下へ移動する ) );\r
419                                 this.ctキー反復用.B.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.BD ), new CCounter.DGキー処理( this.tカーソルを下へ移動する ) );\r
420                                 if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LT ) )\r
421                                 {\r
422                                         this.tカーソルを下へ移動する();\r
423                                 }\r
424                         }\r
425                         #endregion\r
426                         return 0;\r
427                 }\r
428 \r
429 \r
430                 // その他\r
431 \r
432                 #region [ private ]\r
433                 //-----------------\r
434                 private enum EItemPanelモード\r
435                 {\r
436                         パッド一覧,\r
437                         キーコード一覧\r
438                 }\r
439 \r
440                 [StructLayout( LayoutKind.Sequential )]\r
441                 private struct STキー反復用カウンタ\r
442                 {\r
443                         public CCounter Up;\r
444                         public CCounter Down;\r
445                         public CCounter R;\r
446                         public CCounter B;\r
447                         public CCounter this[ int index ]\r
448                         {\r
449                                 get\r
450                                 {\r
451                                         switch( index )\r
452                                         {\r
453                                                 case 0:\r
454                                                         return this.Up;\r
455 \r
456                                                 case 1:\r
457                                                         return this.Down;\r
458 \r
459                                                 case 2:\r
460                                                         return this.R;\r
461 \r
462                                                 case 3:\r
463                                                         return this.B;\r
464                                         }\r
465                                         throw new IndexOutOfRangeException();\r
466                                 }\r
467                                 set\r
468                                 {\r
469                                         switch( index )\r
470                                         {\r
471                                                 case 0:\r
472                                                         this.Up = value;\r
473                                                         return;\r
474 \r
475                                                 case 1:\r
476                                                         this.Down = value;\r
477                                                         return;\r
478 \r
479                                                 case 2:\r
480                                                         this.R = value;\r
481                                                         return;\r
482 \r
483                                                 case 3:\r
484                                                         this.B = value;\r
485                                                         return;\r
486                                         }\r
487                                         throw new IndexOutOfRangeException();\r
488                                 }\r
489                         }\r
490                 }\r
491 \r
492                 private CActFIFOWhite actFIFO;\r
493                 private CActConfigKeyAssign actKeyAssign;\r
494                 private CActConfigList actList;\r
495                 private CActオプションパネル actオプションパネル;\r
496                 private bool bメニューにフォーカス中;\r
497                 private STキー反復用カウンタ ctキー反復用;\r
498                 private const int DESC_H = 0x80;\r
499                 private const int DESC_W = 220;\r
500                 private EItemPanelモード eItemPanelモード;\r
501                 private Font ftフォント;\r
502                 private int n現在のメニュー番号;\r
503                 private CTexture txMenuカーソル;\r
504                 private CTextureAf tx下部パネル;\r
505                 private CTextureAf tx上部パネル;\r
506                 private CTexture tx説明文パネル;\r
507                 private CTexture tx背景;\r
508                 private CPrivateFastFont prvFont;\r
509                 private CTexture[ , ] txMenuItemLeft;\r
510                 private STDGBVALUE<float> fDisplayLagTimeBaseMs;\r
511 \r
512                 private void tカーソルを下へ移動する()\r
513                 {\r
514                         if( !this.bメニューにフォーカス中 )\r
515                         {\r
516                                 switch( this.eItemPanelモード )\r
517                                 {\r
518                                         case EItemPanelモード.パッド一覧:\r
519                                                 this.actList.t次に移動();\r
520                                                 return;\r
521 \r
522                                         case EItemPanelモード.キーコード一覧:\r
523                                                 this.actKeyAssign.t次に移動();\r
524                                                 return;\r
525                                 }\r
526                         }\r
527                         else\r
528                         {\r
529                                 CDTXMania.Skin.soundカーソル移動音.t再生する();\r
530                                 this.n現在のメニュー番号 = ( this.n現在のメニュー番号 + 1 ) % 5;\r
531                                 switch( this.n現在のメニュー番号 )\r
532                                 {\r
533                                         case 0:\r
534                                                 this.actList.t項目リストの設定_System();\r
535                                                 break;\r
536 \r
537                                         //case 1:\r
538                                         //    this.actList.t項目リストの設定・KeyAssignDrums();\r
539                                         //    break;\r
540 \r
541                                         //case 2:\r
542                                         //    this.actList.t項目リストの設定・KeyAssignGuitar();\r
543                                         //    break;\r
544 \r
545                                         //case 3:\r
546                                         //    this.actList.t項目リストの設定・KeyAssignBass();\r
547                                         //    break;\r
548 \r
549                                         case 1:\r
550                                                 this.actList.t項目リストの設定_Drums();\r
551                                                 break;\r
552 \r
553                                         case 2:\r
554                                                 this.actList.t項目リストの設定_Guitar();\r
555                                                 break;\r
556 \r
557                                         case 3:\r
558                                                 this.actList.t項目リストの設定_Bass();\r
559                                                 break;\r
560 \r
561                                         case 4:\r
562                                                 this.actList.t項目リストの設定_Exit();\r
563                                                 break;\r
564                                 }\r
565                                 this.t説明文パネルに現在選択されているメニューの説明を描画する();\r
566                         }\r
567                 }\r
568                 private void tカーソルを上へ移動する()\r
569                 {\r
570                         if( !this.bメニューにフォーカス中 )\r
571                         {\r
572                                 switch( this.eItemPanelモード )\r
573                                 {\r
574                                         case EItemPanelモード.パッド一覧:\r
575                                                 this.actList.t前に移動();\r
576                                                 return;\r
577 \r
578                                         case EItemPanelモード.キーコード一覧:\r
579                                                 this.actKeyAssign.t前に移動();\r
580                                                 return;\r
581                                 }\r
582                         }\r
583                         else\r
584                         {\r
585                                 CDTXMania.Skin.soundカーソル移動音.t再生する();\r
586                                 this.n現在のメニュー番号 = ( ( this.n現在のメニュー番号 - 1 ) + 5 ) % 5;\r
587                                 switch( this.n現在のメニュー番号 )\r
588                                 {\r
589                                         case 0:\r
590                                                 this.actList.t項目リストの設定_System();\r
591                                                 break;\r
592 \r
593                                         //case 1:\r
594                                         //    this.actList.t項目リストの設定・KeyAssignDrums();\r
595                                         //    break;\r
596 \r
597                                         //case 2:\r
598                                         //    this.actList.t項目リストの設定・KeyAssignGuitar();\r
599                                         //    break;\r
600 \r
601                                         //case 3:\r
602                                         //    this.actList.t項目リストの設定・KeyAssignBass();\r
603                                         //    break;\r
604                                         case 1:\r
605                                                 this.actList.t項目リストの設定_Drums();\r
606                                                 break;\r
607 \r
608                                         case 2:\r
609                                                 this.actList.t項目リストの設定_Guitar();\r
610                                                 break;\r
611 \r
612                                         case 3:\r
613                                                 this.actList.t項目リストの設定_Bass();\r
614                                                 break;\r
615 \r
616                                         case 4:\r
617                                                 this.actList.t項目リストの設定_Exit();\r
618                                                 break;\r
619                                 }\r
620                                 this.t説明文パネルに現在選択されているメニューの説明を描画する();\r
621                         }\r
622                 }\r
623                 private void t説明文パネルに現在選択されているメニューの説明を描画する()\r
624                 {\r
625                         try\r
626                         {\r
627                                 var image = new Bitmap( (int) ( 220 * 2 * Scale.X ), (int) ( 192 * 2 * Scale.Y ) );             // 説明文領域サイズの縦横 2 倍。(描画時に 0.5 倍で表示する。)\r
628                                 var graphics = Graphics.FromImage( image );\r
629                                 graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;\r
630                                 \r
631                                 string[,] str = new string[ 2, 2 ];\r
632                                 switch( this.n現在のメニュー番号 )\r
633                                 {\r
634                                         case 0:\r
635                                                 str[ 0, 0 ] = "システムに関係する項目を設定します。";\r
636                                                 str[ 0, 1 ] = "";\r
637                                                 str[ 1, 0 ] = "Settings for an overall systems.";\r
638                                                 break;\r
639 \r
640                                         //case 1:\r
641                                         //    str[0, 0] = "ドラムのキー入力に関する項目を設";\r
642                                         //    str[0, 1] = "定します。";\r
643                                         //    str[1, 0] = "Settings for the drums key/pad inputs.";\r
644                                         //    str[1, 1] = "";\r
645                                         //    break;\r
646 \r
647                                         //case 2:\r
648                                         //    str[0, 0] = "ギターのキー入力に関する項目を設";\r
649                                         //    str[0, 1] = "定します。";\r
650                                         //    str[1, 0] = "Settings for the guitar key/pad inputs.";\r
651                                         //    str[1, 1] = "";\r
652                                         //    break;\r
653 \r
654                                         //case 3:\r
655                                         //    str[0, 0] = "ベースのキー入力に関する項目を設";\r
656                                         //    str[0, 1] = "定します。";\r
657                                         //    str[1, 0] = "Settings for the bass key/pad inputs.";\r
658                                         //    str[1, 1] = "";\r
659                                         //    break;\r
660                                         case 1:\r
661                                                 str[ 0, 0 ] = "ドラムの演奏に関する項目を設定します。";\r
662                                                 str[ 0, 1 ] = "";\r
663                                                 str[ 1, 0 ] = "Settings to play the drums.";\r
664                                                 str[ 1, 1 ] = "";\r
665                                                 break;\r
666 \r
667                                         case 2:\r
668                                                 str[ 0, 0 ] = "ギターの演奏に関する項目を設定します。";\r
669                                                 str[ 0, 1 ] = "";\r
670                                                 str[ 1, 0 ] = "Settings to play the guitar.";\r
671                                                 str[ 1, 1 ] = "";\r
672                                                 break;\r
673 \r
674                                         case 3:\r
675                                                 str[ 0, 0 ] = "ベースの演奏に関する項目を設定します。";\r
676                                                 str[ 0, 1 ] = "";\r
677                                                 str[ 1, 0 ] = "Settings to play the bass.";\r
678                                                 str[ 1, 1 ] = "";\r
679                                                 break;\r
680 \r
681                                         case 4:\r
682                                                 str[ 0, 0 ] = "設定を保存し、コンフィグ画面を終了します。";\r
683                                                 str[ 0, 1 ] = "";\r
684                                                 str[ 1, 0 ] = "Save the settings and exit from\nCONFIGURATION menu.";\r
685                                                 str[ 1, 1 ] = "";\r
686                                                 break;\r
687                                 }\r
688 \r
689                                 int c = ( CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja" ) ? 0 : 1;\r
690                                 for ( int i = 0; i < 2; i++ )\r
691                                 {\r
692                                         graphics.DrawString( str[ c, i ], this.ftフォント, Brushes.White, new PointF( 4f * Scale.X, ( i * 30 ) * Scale.Y ) );\r
693                                 }\r
694                                 graphics.Dispose();\r
695                                 if ( this.tx説明文パネル != null )\r
696                                 {\r
697                                         this.tx説明文パネル.Dispose();\r
698                                 }\r
699                                 this.tx説明文パネル = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );\r
700                                 // this.tx説明文パネル.vc拡大縮小倍率.X = 0.5f;\r
701                                 // this.tx説明文パネル.vc拡大縮小倍率.Y = 0.5f;\r
702                                 image.Dispose();\r
703                         }\r
704                         catch ( CTextureCreateFailedException )\r
705                         {\r
706                                 Trace.TraceError( "説明文テクスチャの作成に失敗しました。" );\r
707                                 this.tx説明文パネル = null;\r
708                         }\r
709                 }\r
710                 private void t説明文パネルに現在選択されている項目の説明を描画する()\r
711                 {\r
712                         try\r
713                         {\r
714                                 var image = new Bitmap( (int) ( 220 * Scale.X ), (int) ( 192 * Scale.Y ) );             // 説明文領域サイズの縦横 2 倍。(描画時に 0.5 倍で表示する・・・のは中止。処理速度向上のため。)\r
715                                 var graphics = Graphics.FromImage( image );\r
716                                 graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;\r
717 \r
718                                 CItemBase item = this.actList.ib現在の選択項目;\r
719                                 if ( ( item.str説明文 != null ) && ( item.str説明文.Length > 0 ) )\r
720                                 {\r
721                                         //int num = 0;\r
722                                         //foreach( string str in item.str説明文.Split( new char[] { '\n' } ) )\r
723                                         //{\r
724                                         //    graphics.DrawString( str, this.ftフォント, Brushes.White, new PointF( 4f * Scale.X, (float) num * Scale.Y ) );\r
725                                         //    num += 30;\r
726                                         //}\r
727                                         graphics.DrawString( item.str説明文, this.ftフォント, Brushes.White, new RectangleF( 4f * Scale.X, (float) 0 * Scale.Y, 630, 430 ) );\r
728                                 }\r
729                                 graphics.Dispose();\r
730                                 if( this.tx説明文パネル != null )\r
731                                 {\r
732                                         this.tx説明文パネル.Dispose();\r
733                                 }\r
734                                 this.tx説明文パネル = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );\r
735                                 //this.tx説明文パネル.vc拡大縮小倍率.X = 0.5f;\r
736                                 //this.tx説明文パネル.vc拡大縮小倍率.Y = 0.5f;\r
737                                 image.Dispose();\r
738                         }\r
739                         catch( CTextureCreateFailedException )\r
740                         {\r
741                                 Trace.TraceError( "説明文パネルテクスチャの作成に失敗しました。" );\r
742                                 this.tx説明文パネル = null;\r
743                         }\r
744                 }\r
745                 //-----------------\r
746                 #endregion\r
747         }\r
748 }\r