2 using System.Collections.Generic;
\r
4 using System.Globalization;
\r
5 using System.Runtime.InteropServices;
\r
6 using System.Drawing;
\r
7 using System.Diagnostics;
\r
12 internal class CStageコンフィグ : CStage
\r
16 public CActDFPFont actFont { get; private set; }
\r
21 public CStageコンフィグ()
\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
38 public void tアサイン完了通知()
\r
40 this.eItemPanelモード = EItemPanelモード.パッド一覧;
\r
42 public void tパッド選択通知( E楽器パート part, Eパッド pad )
\r
44 this.actKeyAssign.t開始( part, pad, this.actList.ib現在の選択項目.str項目名 );
\r
45 this.eItemPanelモード = EItemPanelモード.キーコード一覧;
\r
47 public void t項目変更通知()
\r
49 this.t説明文パネルに現在選択されている項目の説明を描画する();
\r
55 public override void On活性化()
\r
57 Trace.TraceInformation( "コンフィグステージを活性化します。" );
\r
61 this.n現在のメニュー番号 = 0;
\r
62 this.ftフォント = new Font( "MS PGothic", 26f, GraphicsUnit.Pixel );
\r
63 for( int i = 0; i < 4; i++ )
\r
65 this.ctキー反復用[ i ] = new CCounter( 0, 0, 0, CDTXMania.Timer );
\r
67 this.bメニューにフォーカス中 = true;
\r
68 this.eItemPanelモード = EItemPanelモード.パッド一覧;
\r
73 Trace.TraceInformation( "コンフィグステージの活性化を完了しました。" );
\r
77 public override void On非活性化()
\r
79 Trace.TraceInformation( "コンフィグステージを非活性化します。" );
\r
83 CDTXMania.ConfigIni.t書き出し( CDTXMania.strEXEのあるフォルダ + "Config.ini" );
\r
84 if( this.ftフォント != null )
\r
86 this.ftフォント.Dispose();
\r
89 for( int i = 0; i < 4; i++ )
\r
91 this.ctキー反復用[ i ] = null;
\r
97 Trace.TraceInformation( "コンフィグステージの非活性化を完了しました。" );
\r
101 public override void OnManagedリソースの作成()
\r
103 if( !base.b活性化してない )
\r
105 this.tx背景 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenConfig background.jpg" ), false );
\r
106 this.tx上部パネル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenConfig header panel.png" ), true );
\r
107 this.tx下部パネル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenConfig footer panel.png" ), true );
\r
108 this.txMenuカーソル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenConfig menu cursor.png" ), false );
\r
109 if( this.bメニューにフォーカス中 )
\r
111 this.t説明文パネルに現在選択されているメニューの説明を描画する();
\r
115 this.t説明文パネルに現在選択されている項目の説明を描画する();
\r
117 base.OnManagedリソースの作成();
\r
120 public override void OnManagedリソースの解放()
\r
122 if( !base.b活性化してない )
\r
124 CDTXMania.tテクスチャの解放( ref this.tx背景 );
\r
125 CDTXMania.tテクスチャの解放( ref this.tx上部パネル );
\r
126 CDTXMania.tテクスチャの解放( ref this.tx下部パネル );
\r
127 CDTXMania.tテクスチャの解放( ref this.txMenuカーソル );
\r
128 CDTXMania.tテクスチャの解放( ref this.tx説明文パネル );
\r
129 base.OnManagedリソースの解放();
\r
132 public override int On進行描画()
\r
134 if( base.b活性化してない )
\r
137 if( base.b初めての進行描画 )
\r
139 base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;
\r
140 this.actFIFO.tフェードイン開始();
\r
141 base.b初めての進行描画 = false;
\r
147 //---------------------
\r
148 if( this.tx背景 != null )
\r
149 this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );
\r
150 //---------------------
\r
152 #region [ メニューカーソル ]
\r
153 //---------------------
\r
154 if( this.txMenuカーソル != null )
\r
156 Rectangle rectangle;
\r
157 this.txMenuカーソル.n透明度 = this.bメニューにフォーカス中 ? 0xff : 0x80;
\r
159 int y = 0x61 + ( this.n現在のメニュー番号 * 0x19 );
\r
161 this.txMenuカーソル.t2D描画( CDTXMania.app.Device, x, y, new Rectangle( 0, 0, 0x10, 0x20 ) );
\r
162 this.txMenuカーソル.t2D描画( CDTXMania.app.Device, ( x + num3 ) - 0x10, y, new Rectangle( 10, 0, 0x10, 0x20 ) );
\r
164 for( num3 -= 0x20; num3 > 0; num3 -= rectangle.Width )
\r
166 rectangle = new Rectangle( 8, 0, 0x10, 0x20 );
\r
169 rectangle.Width -= 0x10 - num3;
\r
171 this.txMenuカーソル.t2D描画( CDTXMania.app.Device, x, y, rectangle );
\r
172 x += rectangle.Width;
\r
175 //---------------------
\r
178 //---------------------
\r
179 string str = "System";
\r
180 int num4 = this.actFont.n文字列長dot( str );
\r
181 bool flag = this.n現在のメニュー番号 == 0;
\r
182 this.actFont.t文字列描画( 0x8a - ( num4 / 2 ), 100, str, flag );
\r
183 str = "Drums Keys";
\r
184 num4 = this.actFont.n文字列長dot( str );
\r
185 flag = this.n現在のメニュー番号 == 1;
\r
186 this.actFont.t文字列描画( 0x8a - ( num4 / 2 ), 0x7d, str, flag );
\r
187 str = "Guitar Keys";
\r
188 num4 = this.actFont.n文字列長dot( str );
\r
189 flag = this.n現在のメニュー番号 == 2;
\r
190 this.actFont.t文字列描画( 0x8a - ( num4 / 2 ), 150, str, flag );
\r
192 num4 = this.actFont.n文字列長dot( str );
\r
193 flag = this.n現在のメニュー番号 == 3;
\r
194 this.actFont.t文字列描画( 0x8a - ( num4 / 2 ), 0xaf, str, flag );
\r
196 num4 = this.actFont.n文字列長dot( str );
\r
197 flag = this.n現在のメニュー番号 == 4;
\r
198 this.actFont.t文字列描画( 0x8a - ( num4 / 2 ), 200, str, flag );
\r
199 //---------------------
\r
202 //---------------------
\r
203 if( this.tx説明文パネル != null )
\r
204 this.tx説明文パネル.t2D描画( CDTXMania.app.Device, 0x1d, 0xf8 );
\r
205 //---------------------
\r
208 //---------------------
\r
209 switch( this.eItemPanelモード )
\r
211 case EItemPanelモード.パッド一覧:
\r
212 this.actList.t進行描画( !this.bメニューにフォーカス中 );
\r
215 case EItemPanelモード.キーコード一覧:
\r
216 this.actKeyAssign.On進行描画();
\r
219 //---------------------
\r
222 //---------------------
\r
223 if( this.tx上部パネル != null )
\r
224 this.tx上部パネル.t2D描画( CDTXMania.app.Device, 0, 0 );
\r
225 //---------------------
\r
228 //---------------------
\r
229 if( this.tx下部パネル != null )
\r
230 this.tx下部パネル.t2D描画( CDTXMania.app.Device, 0, 480 - this.tx下部パネル.szテクスチャサイズ.Height );
\r
231 //---------------------
\r
233 #region [ オプションパネル ]
\r
234 //---------------------
\r
235 this.actオプションパネル.On進行描画();
\r
236 //---------------------
\r
238 #region [ フェードイン・アウト ]
\r
239 //---------------------
\r
240 switch( base.eフェーズID )
\r
242 case CStage.Eフェーズ.共通_フェードイン:
\r
243 if( this.actFIFO.On進行描画() != 0 )
\r
245 CDTXMania.Skin.bgmコンフィグ画面.t再生する();
\r
246 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
250 case CStage.Eフェーズ.共通_フェードアウト:
\r
251 if( this.actFIFO.On進行描画() == 0 )
\r
257 //---------------------
\r
262 if( ( base.eフェーズID != CStage.Eフェーズ.共通_通常状態 )
\r
263 || this.actKeyAssign.bキー入力待ちの最中である
\r
264 || CDTXMania.act現在入力を占有中のプラグイン != null )
\r
267 if( ( CDTXMania.Input管理.Keyboard.bキーが押された( 0x35 ) || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.FT ) ) || CDTXMania.Pad.b押されたGB( Eパッド.FT ) )
\r
269 CDTXMania.Skin.sound取消音.t再生する();
\r
270 if( !this.bメニューにフォーカス中 )
\r
272 if( this.eItemPanelモード == EItemPanelモード.キーコード一覧 )
\r
274 CDTXMania.stageコンフィグ.tアサイン完了通知();
\r
277 this.bメニューにフォーカス中 = true;
\r
278 this.t説明文パネルに現在選択されているメニューの説明を描画する();
\r
282 this.actFIFO.tフェードアウト開始();
\r
283 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
286 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キーが押された( 0x75 ) ) ) )
\r
288 if( this.n現在のメニュー番号 == 4 )
\r
290 CDTXMania.Skin.sound決定音.t再生する();
\r
291 this.actFIFO.tフェードアウト開始();
\r
292 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
294 else if( this.bメニューにフォーカス中 )
\r
296 CDTXMania.Skin.sound決定音.t再生する();
\r
297 this.bメニューにフォーカス中 = false;
\r
298 this.t説明文パネルに現在選択されている項目の説明を描画する();
\r
302 switch( this.eItemPanelモード )
\r
304 case EItemPanelモード.パッド一覧:
\r
305 this.actList.tEnter押下();
\r
306 if( this.actList.b現在選択されている項目はReturnToMenuである )
\r
308 this.bメニューにフォーカス中 = true;
\r
309 this.t説明文パネルに現在選択されているメニューの説明を描画する();
\r
313 case EItemPanelモード.キーコード一覧:
\r
314 this.actKeyAssign.tEnter押下();
\r
320 this.ctキー反復用.Up.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( 0x84 ), new CCounter.DGキー処理( this.tカーソルを上へ移動する ) );
\r
321 this.ctキー反復用.R.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.HH ), new CCounter.DGキー処理( this.tカーソルを上へ移動する ) );
\r
322 if( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.SD ) )
\r
324 this.tカーソルを上へ移動する();
\r
326 this.ctキー反復用.Down.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( 50 ), new CCounter.DGキー処理( this.tカーソルを下へ移動する ) );
\r
327 this.ctキー反復用.B.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.BD ), new CCounter.DGキー処理( this.tカーソルを下へ移動する ) );
\r
328 if( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LT ) )
\r
330 this.tカーソルを下へ移動する();
\r
338 #region [ private ]
\r
339 //-----------------
\r
340 private enum EItemPanelモード
\r
346 [StructLayout( LayoutKind.Sequential )]
\r
347 private struct STキー反復用カウンタ
\r
349 public CCounter Up;
\r
350 public CCounter Down;
\r
353 public CCounter this[ int index ]
\r
371 throw new IndexOutOfRangeException();
\r
393 throw new IndexOutOfRangeException();
\r
398 private CActFIFOWhite actFIFO;
\r
399 private CActConfigKeyAssign actKeyAssign;
\r
400 private CActConfigList actList;
\r
401 private CActオプションパネル actオプションパネル;
\r
402 private bool bメニューにフォーカス中;
\r
403 private STキー反復用カウンタ ctキー反復用;
\r
404 private const int DESC_H = 0x80;
\r
405 private const int DESC_W = 220;
\r
406 private EItemPanelモード eItemPanelモード;
\r
407 private Font ftフォント;
\r
408 private int n現在のメニュー番号;
\r
409 private CTexture txMenuカーソル;
\r
410 private CTexture tx下部パネル;
\r
411 private CTexture tx上部パネル;
\r
412 private CTexture tx説明文パネル;
\r
413 private CTexture tx背景;
\r
415 private void tカーソルを下へ移動する()
\r
417 if( !this.bメニューにフォーカス中 )
\r
419 switch( this.eItemPanelモード )
\r
421 case EItemPanelモード.パッド一覧:
\r
422 this.actList.t次に移動();
\r
425 case EItemPanelモード.キーコード一覧:
\r
426 this.actKeyAssign.t次に移動();
\r
432 CDTXMania.Skin.soundカーソル移動音.t再生する();
\r
433 this.n現在のメニュー番号 = ( this.n現在のメニュー番号 + 1 ) % 5;
\r
434 switch( this.n現在のメニュー番号 )
\r
437 this.actList.t項目リストの設定・System();
\r
441 this.actList.t項目リストの設定・KeyAssignDrums();
\r
445 this.actList.t項目リストの設定・KeyAssignGuitar();
\r
449 this.actList.t項目リストの設定・KeyAssignBass();
\r
453 this.actList.t項目リストの設定・Exit();
\r
456 this.t説明文パネルに現在選択されているメニューの説明を描画する();
\r
459 private void tカーソルを上へ移動する()
\r
461 if( !this.bメニューにフォーカス中 )
\r
463 switch( this.eItemPanelモード )
\r
465 case EItemPanelモード.パッド一覧:
\r
466 this.actList.t前に移動();
\r
469 case EItemPanelモード.キーコード一覧:
\r
470 this.actKeyAssign.t前に移動();
\r
476 CDTXMania.Skin.soundカーソル移動音.t再生する();
\r
477 this.n現在のメニュー番号 = ( ( this.n現在のメニュー番号 - 1 ) + 5 ) % 5;
\r
478 switch( this.n現在のメニュー番号 )
\r
481 this.actList.t項目リストの設定・System();
\r
485 this.actList.t項目リストの設定・KeyAssignDrums();
\r
489 this.actList.t項目リストの設定・KeyAssignGuitar();
\r
493 this.actList.t項目リストの設定・KeyAssignBass();
\r
497 this.actList.t項目リストの設定・Exit();
\r
500 this.t説明文パネルに現在選択されているメニューの説明を描画する();
\r
503 private void t説明文パネルに現在選択されているメニューの説明を描画する()
\r
507 Bitmap image = new Bitmap( 440, 0x100 );
\r
508 Graphics graphics = Graphics.FromImage( image );
\r
509 string[,] str = new string[2, 2];
\r
510 switch( this.n現在のメニュー番号 )
\r
513 str[0, 0] = "システムに関係する項目を設定しま";
\r
515 str[1, 0] = "Settings for an overall systems.";
\r
519 str[0, 0] = "ドラムのキー入力に関する項目を設";
\r
520 str[0, 1] = "定します。";
\r
521 str[1, 0] = "Settings for the drums key/pad inputs.";
\r
526 str[0, 0] = "ギターのキー入力に関する項目を設";
\r
527 str[0, 1] = "定します。";
\r
528 str[1, 0] = "Settings for the guitar key/pad inputs.";
\r
533 str[0, 0] = "ベースのキー入力に関する項目を設";
\r
534 str[0, 1] = "定します。";
\r
535 str[1, 0] = "Settings for the bass key/pad inputs.";
\r
540 str[0, 0] = "設定を保存し、コンフィグ画面を終了";
\r
541 str[0, 1] = "します。";
\r
542 str[1, 0] = "Save the settings and exit from";
\r
543 str[1, 1] = "CONFIGURATION menu.";
\r
546 int c = (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ? 0 : 1;
\r
547 for (int i = 0; i < 2; i++)
\r
549 graphics.DrawString(str[c, i], this.ftフォント, Brushes.White, new PointF(4f, (i * 30)));
\r
551 graphics.Dispose();
\r
552 if( this.tx説明文パネル != null )
\r
554 this.tx説明文パネル.Dispose();
\r
556 this.tx説明文パネル = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );
\r
557 this.tx説明文パネル.vc拡大縮小倍率.X = 0.5f;
\r
558 this.tx説明文パネル.vc拡大縮小倍率.Y = 0.5f;
\r
561 catch( CTextureCreateFailedException )
\r
563 Trace.TraceError( "説明文テクスチャの作成に失敗しました。" );
\r
564 this.tx説明文パネル = null;
\r
567 private void t説明文パネルに現在選択されている項目の説明を描画する()
\r
571 Bitmap image = new Bitmap( 440, 0x100 );
\r
572 Graphics graphics = Graphics.FromImage( image );
\r
573 CItemBase base2 = this.actList.ib現在の選択項目;
\r
574 if( ( base2.str説明文 != null ) && ( base2.str説明文.Length > 0 ) )
\r
577 foreach( string str in base2.str説明文.Split( new char[] { '\n' } ) )
\r
579 graphics.DrawString( str, this.ftフォント, Brushes.White, new PointF( 4f, (float) num ) );
\r
583 graphics.Dispose();
\r
584 if( this.tx説明文パネル != null )
\r
586 this.tx説明文パネル.Dispose();
\r
588 this.tx説明文パネル = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );
\r
589 this.tx説明文パネル.vc拡大縮小倍率.X = 0.5f;
\r
590 this.tx説明文パネル.vc拡大縮小倍率.Y = 0.5f;
\r
593 catch( CTextureCreateFailedException )
\r
595 Trace.TraceError( "説明文パネルテクスチャの作成に失敗しました。" );
\r
596 this.tx説明文パネル = null;
\r
599 //-----------------
\r