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
9 using System.Runtime.Serialization;
\r
10 using System.Threading;
\r
15 internal class CStageコンフィグ : CStage
\r
17 CActFIFOWhite actFIFO;
\r
18 CActConfigKeyAssign actKeyAssign;
\r
19 CActConfigList actList;
\r
20 CActオプションパネル actオプションパネル;
\r
22 STキー反復用カウンタ ctキー反復用;
\r
23 const int DESC_H = 0x80;
\r
24 const int DESC_W = 220;
\r
25 EItemPanelモード eItemPanelモード;
\r
28 CTexture txMenuカーソル;
\r
33 CPrivateFastFont prvFont;
\r
34 CTexture[,] txMenuItemLeft;
\r
35 STDGBSValue<float> fDisplayLagTimeBaseMs;
\r
43 [StructLayout(LayoutKind.Sequential)]
\r
47 public CCounter Down;
\r
50 public CCounter this[int index]
\r
68 throw new IndexOutOfRangeException();
\r
90 throw new IndexOutOfRangeException();
\r
95 public CStageコンフィグ()
\r
97 eステージID = CStage.Eステージ.コンフィグ;
\r
98 eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
99 list子Activities.Add(actFIFO = new CActFIFOWhite());
\r
100 list子Activities.Add(actList = new CActConfigList());
\r
101 list子Activities.Add(actKeyAssign = new CActConfigKeyAssign());
\r
102 list子Activities.Add(actオプションパネル =
\r
103 new CActオプションパネル(EOptionPanelDirection.Horizontal));
\r
107 public void tアサイン完了通知()
\r
109 this.eItemPanelモード = EItemPanelモード.パッド一覧;
\r
112 public void tパッド選択通知(EPad pad)
\r
114 this.actKeyAssign.t開始(pad, this.actList.ib現在の選択項目.label);
\r
115 this.eItemPanelモード = EItemPanelモード.キーコード一覧;
\r
118 public void t項目変更通知()
\r
120 this.t説明文パネルに現在選択されている項目の説明を描画する();
\r
124 public override void On活性化()
\r
128 Trace.TraceInformation("コンフィグステージを活性化します。");
\r
132 this.n現在のメニュー番号 = 0;
\r
133 this.ftフォント = new Font("MS PGothic", 26f / 2 * Scale.Y, FontStyle.Bold, GraphicsUnit.Pixel); //
\r
134 for (int i = 0; i < 4; i++)
\r
136 this.ctキー反復用[i] = new CCounter(0, 0, 0, CDTXMania.Instance.Timer);
\r
138 this.bメニューにフォーカス中 = true;
\r
140 this.eItemPanelモード = EItemPanelモード.パッド一覧;
\r
142 fDisplayLagTimeBaseMs = new STDGBSValue<float>();
\r
143 for (EPart i = EPart.Drums; i <= EPart.Bass; ++i)
\r
145 fDisplayLagTimeBaseMs[i] = CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset[i] /
\r
146 (CDTXMania.Instance.ConfigIni.nScrollSpeed[i] + 1);
\r
148 actオプションパネル.Pos = CDTXMania.Instance.Coordinates.OptionPanelSelect;
\r
152 Trace.TraceInformation("コンフィグステージの活性化を完了しました。");
\r
159 public override void On非活性化()
\r
163 Trace.TraceInformation("コンフィグステージを非活性化します。");
\r
167 CDTXMania.Instance.SaveConfig();
\r
168 TextureFactory.t安全にDisposeする(ref this.ftフォント);
\r
169 for (int i = 0; i < 4; i++)
\r
171 this.ctキー反復用[i] = null;
\r
174 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums.Value = (int)(fDisplayLagTimeBaseMs.Drums * (CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums + 1));
\r
175 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Guitar.Value = (int)(fDisplayLagTimeBaseMs.Guitar * (CDTXMania.Instance.ConfigIni.nScrollSpeed.Guitar + 1));
\r
176 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Bass.Value = (int)(fDisplayLagTimeBaseMs.Bass * (CDTXMania.Instance.ConfigIni.nScrollSpeed.Bass + 1));
\r
180 catch (UnauthorizedAccessException e)
\r
182 Trace.TraceError(e.Message + "ファイルが読み取り専用になっていないか、管理者権限がないと書き込めなくなっていないか等を確認して下さい");
\r
184 catch (Exception e)
\r
186 Trace.TraceError(e.Message);
\r
190 Trace.TraceInformation("コンフィグステージの非活性化を完了しました。");
\r
196 public override void OnManagedリソースの作成()
\r
200 this.tx背景 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenConfig background.jpg"), false);
\r
201 this.tx上部パネル = TextureFactory.tテクスチャの生成Af(CSkin.Path(@"Graphics\ScreenConfig header panel.png"), true);
\r
202 this.tx下部パネル = TextureFactory.tテクスチャの生成Af(CSkin.Path(@"Graphics\ScreenConfig footer panel.png"), true);
\r
203 this.txMenuカーソル = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenConfig menu cursor.png"), false);
\r
205 prvFont = new CPrivateFastFont(CSkin.Path(@"Graphics\fonts\mplus-1p-heavy.ttf"), (int)(18 * Scale.Y));
\r
206 string[] strMenuItem = { "System", "Drums", "Guitar", "Bass", "Exit" };
\r
207 txMenuItemLeft = new CTexture[strMenuItem.Length, 2];
\r
208 for (int i = 0; i < strMenuItem.Length; i++)
\r
211 bmpStr = prvFont.DrawPrivateFont(strMenuItem[i], Color.White, Color.Black);
\r
212 txMenuItemLeft[i, 0] = TextureFactory.tテクスチャの生成(bmpStr, false);
\r
214 bmpStr = prvFont.DrawPrivateFont(strMenuItem[i], Color.White, Color.Black, Color.Yellow, Color.OrangeRed);
\r
215 txMenuItemLeft[i, 1] = TextureFactory.tテクスチャの生成(bmpStr, false);
\r
218 if (this.bメニューにフォーカス中)
\r
220 this.t説明文パネルに現在選択されているメニューの説明を描画する();
\r
224 this.t説明文パネルに現在選択されている項目の説明を描画する();
\r
226 base.OnManagedリソースの作成();
\r
230 public override void OnManagedリソースの解放()
\r
234 TextureFactory.tテクスチャの解放(ref this.tx背景);
\r
235 TextureFactory.tテクスチャの解放(ref this.tx上部パネル);
\r
236 TextureFactory.tテクスチャの解放(ref this.tx下部パネル);
\r
237 TextureFactory.tテクスチャの解放(ref this.txMenuカーソル);
\r
238 TextureFactory.tテクスチャの解放(ref this.tx説明文パネル);
\r
240 for (int i = 0; i < txMenuItemLeft.GetLength(0); i++)
\r
242 TextureFactory.tテクスチャの解放(ref txMenuItemLeft[i, 0]);
\r
243 TextureFactory.tテクスチャの解放(ref txMenuItemLeft[i, 1]);
\r
245 txMenuItemLeft = null;
\r
246 base.OnManagedリソースの解放();
\r
250 public override int On進行描画()
\r
254 if (base.b初めての進行描画)
\r
256 base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;
\r
257 this.actFIFO.tフェードイン開始();
\r
258 base.b初めての進行描画 = false;
\r
262 if (this.tx背景 != null)
\r
264 this.tx背景.t2D描画(CDTXMania.Instance.Device, 0, 0);
\r
267 #region [ メニューカーソル ]
\r
268 if (this.txMenuカーソル != null)
\r
270 Rectangle rectangle;
\r
271 this.txMenuカーソル.n透明度 = this.bメニューにフォーカス中 ? 0xff : 0x80;
\r
272 int x = (int)(0x37 * Scale.X);
\r
273 int y = (int)((0x61 + (this.n現在のメニュー番号 * 0x19)) * Scale.Y);
\r
274 int num3 = (int)(170 * Scale.X);
\r
275 this.txMenuカーソル.t2D描画(CDTXMania.Instance.Device, x, y, new Rectangle(0, 0, (int)(0x10 * Scale.X), (int)(0x20 * Scale.Y)));
\r
276 this.txMenuカーソル.t2D描画(CDTXMania.Instance.Device, (x + num3) - 0x10 * Scale.X, y, new Rectangle((int)(0x10 * Scale.X), 0, (int)(0x10 * Scale.X), (int)(0x20 * Scale.Y)));
\r
277 x += (int)(0x10 * Scale.X);
\r
278 for (num3 -= (int)(0x20 * Scale.X); num3 > 0; num3 -= rectangle.Width)
\r
280 rectangle = new Rectangle((int)(8 * Scale.X), 0, (int)(0x10 * Scale.X), (int)(0x20 * Scale.Y));
\r
281 if (num3 < (int)(0x10 * Scale.X))
\r
283 rectangle.Width -= (int)(0x10 * Scale.X) - num3;
\r
285 this.txMenuカーソル.t2D描画(CDTXMania.Instance.Device, x, y, rectangle);
\r
286 x += rectangle.Width;
\r
292 int menuY = (int)(100 * Scale.Y) - 20;
\r
293 int stepY = (int)(25 * Scale.Y);
\r
294 for (int i = 0; i < txMenuItemLeft.GetLength(0); i++)
\r
296 //Bitmap bmpStr = (this.n現在のメニュー番号 == i) ?
\r
297 // prvFont.DrawPrivateFont( strMenuItem[ i ], Color.White, Color.Black, Color.Yellow, Color.OrangeRed ) :
\r
298 // prvFont.DrawPrivateFont( strMenuItem[ i ], Color.White, Color.Black );
\r
299 //txMenuItemLeft = TextureFactory.tテクスチャの生成( bmpStr, false );
\r
300 int flag = (this.n現在のメニュー番号 == i) ? 1 : 0;
\r
301 int num4 = txMenuItemLeft[i, flag].sz画像サイズ.Width;
\r
302 txMenuItemLeft[i, flag].t2D描画(CDTXMania.Instance.Device, 0x8a * Scale.X - (num4 / 2), menuY); //55
\r
303 //txMenuItem.Dispose();
\r
309 if (this.tx説明文パネル != null)
\r
311 this.tx説明文パネル.t2D描画(CDTXMania.Instance.Device, 0x1d * Scale.X, 0xf8 * Scale.Y);
\r
316 switch (this.eItemPanelモード)
\r
318 case EItemPanelモード.パッド一覧:
\r
319 this.actList.t進行描画(!this.bメニューにフォーカス中);
\r
322 case EItemPanelモード.キーコード一覧:
\r
323 this.actKeyAssign.On進行描画();
\r
329 if (this.tx上部パネル != null)
\r
331 this.tx上部パネル.t2D描画(CDTXMania.Instance.Device, 0, 0);
\r
336 if (this.tx下部パネル != null)
\r
338 this.tx下部パネル.t2D描画(CDTXMania.Instance.Device, 0, SampleFramework.GameWindowSize.Height - this.tx下部パネル.sz画像サイズ.Height);
\r
342 #region [ オプションパネル ]
\r
343 this.actオプションパネル.On進行描画();
\r
346 #region [ フェードイン・アウト ]
\r
347 switch (base.eフェーズID)
\r
349 case CStage.Eフェーズ.共通_フェードイン:
\r
350 if (this.actFIFO.On進行描画() != 0)
\r
352 CDTXMania.Instance.Skin.bgmコンフィグ画面.t再生する();
\r
353 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
357 case CStage.Eフェーズ.共通_フェードアウト:
\r
358 if (this.actFIFO.On進行描画() == 0)
\r
368 if ((base.eフェーズID != CStage.Eフェーズ.共通_通常状態)
\r
369 || this.actKeyAssign.bキー入力待ちの最中である
\r
370 || CDTXMania.Instance.act現在入力を占有中のプラグイン != null)
\r
375 // 曲データの一覧取得中は、キー入力を無効化する
\r
376 if (!CDTXMania.Instance.EnumSongs.IsEnumerating || !CDTXMania.Instance.actEnumSongs.bコマンドでの曲データ取得)
\r
378 if (CDTXMania.Instance.Input管理.Keyboard.bキーが押された((int)SlimDX.DirectInput.Key.Escape) || CDTXMania.Instance.Pad.bCancelPadIsPressedDGB())
\r
380 CDTXMania.Instance.Skin.sound取消音.t再生する();
\r
381 if (!this.bメニューにフォーカス中)
\r
383 if (this.eItemPanelモード == EItemPanelモード.キーコード一覧)
\r
385 CDTXMania.Instance.stageコンフィグ.tアサイン完了通知();
\r
388 if (this.actList.b楽器またはシステム用メニューである && !this.actList.bIsFocusingParameter) // #24525 2011.3.15 yyagi, #32059 2013.9.17 yyagi
\r
390 this.bメニューにフォーカス中 = true;
\r
392 this.t説明文パネルに現在選択されているメニューの説明を描画する();
\r
393 this.actList.tEsc押下(); // #24525 2011.3.15 yyagi ESC押下時の右メニュー描画用
\r
397 this.actFIFO.tフェードアウト開始();
\r
398 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
402 else if (CDTXMania.Instance.Input管理.Keyboard.bキーが押された((int)SlimDX.DirectInput.Key.LeftArrow)) // 左カーソルキー
\r
404 if (!this.bメニューにフォーカス中)
\r
406 if (this.eItemPanelモード == EItemPanelモード.キーコード一覧)
\r
408 // キーコンフィグ画面中は、[←]押下に反応させない
\r
411 if (this.actList.bIsFocusingParameter)
\r
413 // パラメータを増減している最中も、[←]押下に反応させない
\r
416 // #24525 2011.3.15 yyagi, #32059 2013.9.17 yyagi
\r
417 if (this.actList.b楽器またはシステム用メニューである && !this.actList.bIsFocusingParameter)
\r
419 this.bメニューにフォーカス中 = true;
\r
421 CDTXMania.Instance.Skin.sound取消音.t再生する();
\r
422 this.t説明文パネルに現在選択されているメニューの説明を描画する();
\r
423 // #24525 2011.3.15 yyagi ESC押下時の右メニュー描画用
\r
424 this.actList.tEsc押下();
\r
429 (CDTXMania.Instance.Pad.bDecidePadIsPressedDGB() ||
\r
430 (CDTXMania.Instance.ConfigIni.bEnterがキー割り当てのどこにも使用されていない &&
\r
431 CDTXMania.Instance.Input管理.Keyboard.bキーが押された((int)SlimDX.DirectInput.Key.Return))))
\r
434 if (this.n現在のメニュー番号 == 4)
\r
436 CDTXMania.Instance.Skin.sound決定音.t再生する();
\r
437 this.actFIFO.tフェードアウト開始();
\r
438 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
441 else if (this.bメニューにフォーカス中)
\r
443 CDTXMania.Instance.Skin.sound決定音.t再生する();
\r
444 this.bメニューにフォーカス中 = false;
\r
445 this.t説明文パネルに現在選択されている項目の説明を描画する();
\r
449 switch (this.eItemPanelモード)
\r
451 case EItemPanelモード.パッド一覧:
\r
452 if (this.actList.tEnter押下())
\r
454 bメニューにフォーカス中 = true;
\r
458 case EItemPanelモード.キーコード一覧:
\r
459 this.actKeyAssign.tEnter押下();
\r
465 else if (CDTXMania.Instance.Input管理.Keyboard.bキーが押された((int)SlimDX.DirectInput.Key.RightArrow)) // 右カーソルキー
\r
468 if (this.n現在のメニュー番号 == 4)
\r
473 else if (this.bメニューにフォーカス中)
\r
475 CDTXMania.Instance.Skin.sound決定音.t再生する();
\r
476 this.bメニューにフォーカス中 = false;
\r
477 this.t説明文パネルに現在選択されている項目の説明を描画する();
\r
481 this.ctキー反復用.Up.tキー反復(CDTXMania.Instance.Input管理.Keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.UpArrow), new CCounter.DGキー処理(this.tカーソルを上へ移動する));
\r
482 this.ctキー反復用.R.tキー反復(CDTXMania.Instance.Pad.b押されている(EPad.GtR) || CDTXMania.Instance.Pad.b押されている(EPad.BsR), new CCounter.DGキー処理(this.tカーソルを上へ移動する));
\r
483 if (CDTXMania.Instance.Pad.b押された(EPad.SD))
\r
485 this.tカーソルを上へ移動する();
\r
487 this.ctキー反復用.Down.tキー反復(CDTXMania.Instance.Input管理.Keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.DownArrow), new CCounter.DGキー処理(this.tカーソルを下へ移動する));
\r
488 this.ctキー反復用.B.tキー反復(CDTXMania.Instance.Pad.b押されている(EPad.GtB) || CDTXMania.Instance.Pad.b押されている(EPad.BsB), new CCounter.DGキー処理(this.tカーソルを下へ移動する));
\r
489 if (CDTXMania.Instance.Pad.b押された(EPad.LT))
\r
491 this.tカーソルを下へ移動する();
\r
500 private void tカーソルを下へ移動する()
\r
502 if (!this.bメニューにフォーカス中)
\r
504 switch (this.eItemPanelモード)
\r
506 case EItemPanelモード.パッド一覧:
\r
507 this.actList.OnNext();
\r
510 case EItemPanelモード.キーコード一覧:
\r
511 this.actKeyAssign.OnNext();
\r
517 CDTXMania.Instance.Skin.soundカーソル移動音.t再生する();
\r
518 this.n現在のメニュー番号 = (this.n現在のメニュー番号 + 1) % 5;
\r
519 switch (this.n現在のメニュー番号)
\r
522 this.actList.t項目リストの設定(CActConfigList.Eメニュー種別.System);
\r
526 this.actList.t項目リストの設定(CActConfigList.Eメニュー種別.Drums);
\r
530 this.actList.t項目リストの設定(CActConfigList.Eメニュー種別.Guitar);
\r
534 this.actList.t項目リストの設定(CActConfigList.Eメニュー種別.Bass);
\r
538 this.actList.t項目リストの設定_Exit();
\r
541 this.t説明文パネルに現在選択されているメニューの説明を描画する();
\r
545 private void tカーソルを上へ移動する()
\r
547 if (!this.bメニューにフォーカス中)
\r
549 switch (this.eItemPanelモード)
\r
551 case EItemPanelモード.パッド一覧:
\r
552 this.actList.OnPrevious();
\r
555 case EItemPanelモード.キーコード一覧:
\r
556 this.actKeyAssign.OnPrevious();
\r
562 CDTXMania.Instance.Skin.soundカーソル移動音.t再生する();
\r
563 this.n現在のメニュー番号 = ((this.n現在のメニュー番号 - 1) + 5) % 5;
\r
564 switch (this.n現在のメニュー番号)
\r
567 this.actList.t項目リストの設定(CActConfigList.Eメニュー種別.System);
\r
571 this.actList.t項目リストの設定(CActConfigList.Eメニュー種別.Drums);
\r
575 this.actList.t項目リストの設定(CActConfigList.Eメニュー種別.Guitar);
\r
579 this.actList.t項目リストの設定(CActConfigList.Eメニュー種別.Bass);
\r
583 this.actList.t項目リストの設定_Exit();
\r
586 this.t説明文パネルに現在選択されているメニューの説明を描画する();
\r
590 private void t説明文パネルに現在選択されているメニューの説明を描画する()
\r
592 using (Bitmap image = new Bitmap((int)(220 * 2 * Scale.X), (int)(192 * 2 * Scale.Y)))
\r
594 // 説明文領域サイズの縦横 2 倍。(描画時に 0.5 倍で表示する。)
\r
595 using (Graphics graphics = Graphics.FromImage(image))
\r
597 graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
\r
599 string[,] str = new string[2, 2];
\r
600 switch (this.n現在のメニュー番号)
\r
603 str[0, 0] = "システムに関係する項目を設定します。";
\r
605 str[1, 0] = "Settings for an overall systems.";
\r
609 // str[0, 0] = "ドラムのキー入力に関する項目を設";
\r
610 // str[0, 1] = "定します。";
\r
611 // str[1, 0] = "Settings for the drums key/pad inputs.";
\r
616 // str[0, 0] = "ギターのキー入力に関する項目を設";
\r
617 // str[0, 1] = "定します。";
\r
618 // str[1, 0] = "Settings for the guitar key/pad inputs.";
\r
623 // str[0, 0] = "ベースのキー入力に関する項目を設";
\r
624 // str[0, 1] = "定します。";
\r
625 // str[1, 0] = "Settings for the bass key/pad inputs.";
\r
629 str[0, 0] = "ドラムの演奏に関する項目を設定します。";
\r
631 str[1, 0] = "Settings to play the drums.";
\r
636 str[0, 0] = "ギターの演奏に関する項目を設定します。";
\r
638 str[1, 0] = "Settings to play the guitar.";
\r
643 str[0, 0] = "ベースの演奏に関する項目を設定します。";
\r
645 str[1, 0] = "Settings to play the bass.";
\r
650 str[0, 0] = "設定を保存し、コンフィグ画面を終了します。";
\r
652 str[1, 0] = "Save the settings and exit from\nCONFIGURATION menu.";
\r
657 int c = (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ? 0 : 1;
\r
658 for (int i = 0; i < 2; i++)
\r
660 graphics.DrawString(str[c, i], this.ftフォント, Brushes.White, new PointF(4f * Scale.X, (i * 30) * Scale.Y));
\r
663 if (this.tx説明文パネル != null)
\r
665 this.tx説明文パネル.Dispose();
\r
667 this.tx説明文パネル = new CTexture(CDTXMania.Instance.Device, image, CDTXMania.Instance.TextureFormat);
\r
668 // this.tx説明文パネル.vc拡大縮小倍率.X = 0.5f;
\r
669 // this.tx説明文パネル.vc拡大縮小倍率.Y = 0.5f;
\r
673 private void t説明文パネルに現在選択されている項目の説明を描画する()
\r
675 using (Bitmap image = new Bitmap((int)(220 * Scale.X), (int)(192 * Scale.Y)))
\r
677 // 説明文領域サイズの縦横 2 倍。(描画時に 0.5 倍で表示する・・・のは中止。処理速度向上のため。)
\r
678 using (Graphics graphics = Graphics.FromImage(image))
\r
680 graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
\r
681 COptionBase item = this.actList.ib現在の選択項目;
\r
682 if (!string.IsNullOrEmpty(item.explanation))
\r
684 graphics.DrawString(item.explanation, this.ftフォント, Brushes.White, new RectangleF(4f * Scale.X, (float)0 * Scale.Y, 630, 430));
\r
687 if (this.tx説明文パネル != null)
\r
689 this.tx説明文パネル.Dispose();
\r
691 this.tx説明文パネル = new CTexture(CDTXMania.Instance.Device, image, CDTXMania.Instance.TextureFormat);
\r
692 //this.tx説明文パネル.vc拡大縮小倍率.X = 0.5f;
\r
693 //this.tx説明文パネル.vc拡大縮小倍率.Y = 0.5f;
\r