+++ /dev/null
-using System;\r
-using System.Collections.Generic;\r
-using System.Text;\r
-using System.Runtime.InteropServices;\r
-using System.Diagnostics;\r
-using System.Drawing;\r
-using FDK;\r
-\r
-using SlimDXKey = SlimDX.DirectInput.Key;\r
-\r
-namespace DTXMania\r
-{\r
- internal class CStageタイトル : CStage\r
- {\r
- // コンストラクタ\r
-\r
- public CStageタイトル()\r
- {\r
- base.eステージID = CStage.Eステージ.タイトル;\r
- base.b活性化してない = true;\r
- base.list子Activities.Add(this.actFIfromSetup = new CActFIFOWhite());\r
- base.list子Activities.Add(this.actFI = new CActFIFOWhite());\r
- base.list子Activities.Add(this.actFO = new CActFIFOWhite());\r
- }\r
-\r
-\r
- // CStage 実装\r
-\r
- public override void On活性化()\r
- {\r
- Trace.TraceInformation("タイトルステージを活性化します。");\r
- Trace.Indent();\r
- try\r
- {\r
- for (int i = 0; i < 4; i++)\r
- {\r
- this.ctキー反復用[i] = new CCounter(0, 0, 0, CDTXMania.Instance.Timer);\r
- }\r
- this.ct上移動用 = new CCounter();\r
- this.ct下移動用 = new CCounter();\r
- this.ctカーソルフラッシュ用 = new CCounter();\r
- base.On活性化();\r
- }\r
- finally\r
- {\r
- Trace.TraceInformation("タイトルステージの活性化を完了しました。");\r
- Trace.Unindent();\r
- }\r
- }\r
- public override void On非活性化()\r
- {\r
- Trace.TraceInformation("タイトルステージを非活性化します。");\r
- Trace.Indent();\r
- try\r
- {\r
- for (int i = 0; i < 4; i++)\r
- {\r
- this.ctキー反復用[i] = null;\r
- }\r
- this.ct上移動用 = null;\r
- this.ct下移動用 = null;\r
- this.ctカーソルフラッシュ用 = null;\r
- }\r
- finally\r
- {\r
- Trace.TraceInformation("タイトルステージの非活性化を完了しました。");\r
- Trace.Unindent();\r
- }\r
- base.On非活性化();\r
- }\r
- public override void OnManagedリソースの作成()\r
- {\r
- if (!base.b活性化してない)\r
- {\r
- this.tx背景 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenTitle background.jpg"), false);\r
- this.txメニュー = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenTitle menu.png"), false);\r
-\r
- prvFont = new CPrivateFastFont(CSkin.Path(@"Graphics\fonts\mplus-1p-heavy.ttf"), 36);\r
- //prvFont = new CPrivateFont( new FontFamily("MS UI Gothic"), 36, FontStyle.Bold );\r
-\r
- string strTitleStart = CDTXMania.Instance.Resources.Label( "strTitleStart" );\r
- string strTitleConfig = CDTXMania.Instance.Resources.Label( "strTitleConfiguration" );\r
- string strTitleExit = CDTXMania.Instance.Resources.Label( "strTitleExit" );\r
- string[] menuStr = { strTitleStart, strTitleConfig, strTitleExit };\r
- this.txMenuItem = new CTexture[menuStr.Length];\r
- this.stMenuItem = new STMenuItem[menuStr.Length];\r
-\r
- // メニュー項目に対応したテクスチャ画像を生成しつつ、テクスチャ画像の最大横幅を取得しておく\r
- int maxX = 0;\r
- for (int i = 0; i < menuStr.Length; i++)\r
- {\r
- txMenuItem[i] = TextureFactory.tテクスチャの生成(prvFont.DrawPrivateFont(menuStr[i], Color.White, Color.Black), false);\r
- // txMenuItem[ i ] = prvFont.DrawPrivateFont( menuStr[ i ], Color.White, Color.Black, Color.Yellow, Color.OrangeRed ); // グラデーションもなかなかいける。\r
- // txMenuItem[ i ] = prvFont.DrawPrivateFont( menuStr[ i ], Color.White );\r
- if (maxX < txMenuItem[i].szテクスチャサイズ.Width)\r
- {\r
- maxX = txMenuItem[i].szテクスチャサイズ.Width;\r
- }\r
- }\r
- // センタリング表示するために、X座標のオフセット値を算出・格納する\r
- for (int i = 0; i < menuStr.Length; i++)\r
- {\r
- stMenuItem[i] = new STMenuItem();\r
- stMenuItem[i].txMenuItem = txMenuItem[i];\r
- stMenuItem[i].offsetX = (maxX - txMenuItem[i].szテクスチャサイズ.Width) / 2;\r
- }\r
- prvFont.Dispose();\r
-\r
- MENU_X = (SampleFramework.GameWindowSize.Width - maxX) / 2;\r
- MENU_Y = 600;\r
-\r
- base.OnManagedリソースの作成();\r
- }\r
- }\r
-\r
-\r
- public override void OnManagedリソースの解放()\r
- {\r
- if (!base.b活性化してない)\r
- {\r
- for (int i = 0; i < txMenuItem.Length; i++)\r
- {\r
- if (txMenuItem[i] != null)\r
- {\r
- TextureFactory.tテクスチャの解放(ref txMenuItem[i]);\r
- }\r
- }\r
- TextureFactory.tテクスチャの解放(ref this.tx背景);\r
- TextureFactory.tテクスチャの解放(ref this.txメニュー);\r
- base.OnManagedリソースの解放();\r
- }\r
- }\r
- public override int On進行描画()\r
- {\r
- if (!base.b活性化してない)\r
- {\r
- #region [ 初めての進行描画 ]\r
- //---------------------\r
- if (base.b初めての進行描画)\r
- {\r
- if (CDTXMania.Instance.r直前のステージ == CDTXMania.Instance.stage起動)\r
- {\r
- this.actFIfromSetup.tフェードイン開始();\r
- base.eフェーズID = CStage.Eフェーズ.タイトル_起動画面からのフェードイン;\r
- }\r
- else\r
- {\r
- this.actFI.tフェードイン開始();\r
- base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;\r
- }\r
- this.ctカーソルフラッシュ用.t開始(0, 700, 5, CDTXMania.Instance.Timer);\r
- this.ctカーソルフラッシュ用.n現在の値 = 100;\r
- base.b初めての進行描画 = false;\r
- }\r
- //---------------------\r
- #endregion\r
-\r
- // 進行\r
-\r
- #region [ カーソル上移動 ]\r
- //---------------------\r
- if (this.ct上移動用.b進行中)\r
- {\r
- this.ct上移動用.t進行();\r
- if (this.ct上移動用.b終了値に達した)\r
- {\r
- this.ct上移動用.t停止();\r
- }\r
- }\r
- //---------------------\r
- #endregion\r
- #region [ カーソル下移動 ]\r
- //---------------------\r
- if (this.ct下移動用.b進行中)\r
- {\r
- this.ct下移動用.t進行();\r
- if (this.ct下移動用.b終了値に達した)\r
- {\r
- this.ct下移動用.t停止();\r
- }\r
- }\r
- //---------------------\r
- #endregion\r
- #region [ カーソルフラッシュ ]\r
- //---------------------\r
- this.ctカーソルフラッシュ用.t進行Loop();\r
- //---------------------\r
- #endregion\r
-\r
- #region [ キー入力 ]\r
- if( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 // 通常状態、かつ\r
- && CDTXMania.Instance.act現在入力を占有中のプラグイン == null ) // プラグインの入力占有がない\r
- {\r
- if( CDTXMania.Instance.Input管理.Keyboard.bキーが押された( (int) SlimDXKey.Escape ) )\r
- return (int) E戻り値.EXIT;\r
-\r
- this.ctキー反復用.Up.tキー反復(\r
- CDTXMania.Instance.Input管理.Keyboard.bキーが押されている( (int) SlimDXKey.UpArrow ),\r
- new CCounter.DGキー処理( this.tカーソルを上へ移動する ) );\r
-\r
- this.ctキー反復用.R.tキー反復(\r
- CDTXMania.Instance.Pad.b押されている( EPad.GtR ) || CDTXMania.Instance.Pad.b押されている( EPad.BsR ),\r
- new CCounter.DGキー処理( this.tカーソルを上へ移動する ) );\r
-\r
- if( CDTXMania.Instance.Pad.b押された( EPad.SD ) )\r
- this.tカーソルを上へ移動する();\r
-\r
- this.ctキー反復用.Down.tキー反復(\r
- CDTXMania.Instance.Input管理.Keyboard.bキーが押されている( (int) SlimDXKey.DownArrow ),\r
- new CCounter.DGキー処理( this.tカーソルを下へ移動する ) );\r
-\r
- this.ctキー反復用.B.tキー反復(\r
- CDTXMania.Instance.Pad.b押されている( EPad.GtB ) || CDTXMania.Instance.Pad.b押されている( EPad.BsB ),\r
- new CCounter.DGキー処理( this.tカーソルを下へ移動する ) );\r
-\r
- if( CDTXMania.Instance.Pad.b押された( EPad.LT ) )\r
- this.tカーソルを下へ移動する();\r
-\r
- if( ( CDTXMania.Instance.Pad.bDecidePadIsPressedDGB() ||\r
- ( CDTXMania.Instance.ConfigIni.bEnterがキー割り当てのどこにも使用されていない &&\r
- CDTXMania.Instance.Input管理.Keyboard.bキーが押された( (int) SlimDXKey.Return ) ) ) )\r
- {\r
- if( ( this.n現在のカーソル行 == (int) E戻り値.GAMESTART - 1 ) && CDTXMania.Instance.Skin.soundゲーム開始音.b読み込み成功 )\r
- {\r
- CDTXMania.Instance.Skin.soundゲーム開始音.t再生する();\r
- }\r
- else\r
- {\r
- CDTXMania.Instance.Skin.sound決定音.t再生する();\r
- }\r
- if( this.n現在のカーソル行 == (int) E戻り値.EXIT - 1 )\r
- {\r
- return (int) E戻り値.EXIT;\r
- }\r
- this.actFO.tフェードアウト開始();\r
- base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
- }\r
- //if ( CDTXMania.Instance.Input管理.Keyboard.bキーが押された( (int) SlimDXKey.Space ) )\r
- // Trace.TraceInformation( "DTXMania Title: SPACE key registered. " + CDTXMania.Instance.ct.nシステム時刻 );\r
- }\r
- #endregion\r
-\r
- // 描画\r
-\r
- #region [ 背景描画 ]\r
- if (this.tx背景 != null)\r
- this.tx背景.t2D描画(CDTXMania.Instance.Device, 0, 0);\r
- #endregion\r
- #region [ メニュー枠描画 ]\r
- if (this.txメニュー != null)\r
- {\r
- int MENU_ITEM_H = txMenuItem[0].szテクスチャサイズ.Height;\r
- int x = (1920 - txメニュー.szテクスチャサイズ.Width) / 2; // MENU_X;\r
- int y = MENU_Y + ((MENU_ITEM_H - MENU_H) / 2) + (this.n現在のカーソル行 * MENU_ITEM_H);\r
- if (this.ct上移動用.b進行中)\r
- {\r
- y += (int)((double)MENU_ITEM_H / 2 * (Math.Cos(Math.PI * (((double)this.ct上移動用.n現在の値) / 100.0)) + 1.0));\r
- }\r
- else if (this.ct下移動用.b進行中)\r
- {\r
- y -= (int)((double)MENU_ITEM_H / 2 * (Math.Cos(Math.PI * (((double)this.ct下移動用.n現在の値) / 100.0)) + 1.0));\r
- }\r
- if (this.ctカーソルフラッシュ用.n現在の値 <= 100)\r
- {\r
- float nMag = (float)(1.0 + ((((double)this.ctカーソルフラッシュ用.n現在の値) / 100.0) * 0.5));\r
- this.txメニュー.vc拡大縮小倍率.X = nMag;\r
- this.txメニュー.vc拡大縮小倍率.Y = nMag;\r
- this.txメニュー.n透明度 = (int)(255.0 * (1.0 - (((double)this.ctカーソルフラッシュ用.n現在の値) / 100.0)));\r
- int x_magnified = x + ((int)((MENU_W * (1.0 - nMag)) / 2.0));\r
- int y_magnified = y + ((int)((MENU_H * (1.0 - nMag)) / 2.0));\r
- this.txメニュー.t2D描画(CDTXMania.Instance.Device, x_magnified, y_magnified, new Rectangle(0, MENU_H * 1, MENU_W, MENU_H));\r
- }\r
- this.txメニュー.vc拡大縮小倍率.X = 1f;\r
- this.txメニュー.vc拡大縮小倍率.Y = 1f;\r
- this.txメニュー.n透明度 = 0xff;\r
- this.txメニュー.t2D描画(CDTXMania.Instance.Device, x, y, new Rectangle(0, MENU_H * 0, MENU_W, MENU_H));\r
- }\r
- #endregion\r
-\r
- #region [ メニュー項目描画 ]\r
- // if ( this.txメニュー != null )\r
- {\r
- int offsetY = 0;\r
- for (int i = 0; i < txMenuItem.Length; i++)\r
- {\r
- this.txMenuItem[i].t2D描画(CDTXMania.Instance.Device, MENU_X + this.stMenuItem[i].offsetX, MENU_Y + offsetY);\r
- offsetY += this.txMenuItem[i].sz画像サイズ.Height;\r
- }\r
- }\r
- #endregion\r
- #region [ フェーズ移行処理 ]\r
- CStage.Eフェーズ eフェーズid = base.eフェーズID;\r
- switch (eフェーズid)\r
- {\r
- case CStage.Eフェーズ.共通_フェードイン:\r
- if (this.actFI.On進行描画() != 0)\r
- {\r
- CDTXMania.Instance.Skin.soundタイトル音.t再生する();\r
- base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
- }\r
- break;\r
-\r
- case CStage.Eフェーズ.共通_フェードアウト:\r
- if (this.actFO.On進行描画() == 0)\r
- {\r
- break;\r
- }\r
- base.eフェーズID = CStage.Eフェーズ.共通_終了状態;\r
- switch (this.n現在のカーソル行)\r
- {\r
- case (int)E戻り値.GAMESTART - 1:\r
- return (int)E戻り値.GAMESTART;\r
-\r
- case (int)E戻り値.CONFIG - 1:\r
- return (int)E戻り値.CONFIG;\r
-\r
- case (int)E戻り値.EXIT - 1:\r
- return (int)E戻り値.EXIT;\r
- //return ( this.n現在のカーソル行 + 1 );\r
- }\r
- break;\r
-\r
- case CStage.Eフェーズ.タイトル_起動画面からのフェードイン:\r
- if (this.actFIfromSetup.On進行描画() != 0)\r
- {\r
- CDTXMania.Instance.Skin.soundタイトル音.t再生する();\r
- base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
- }\r
- break;\r
- }\r
- #endregion\r
- }\r
- return 0;\r
- }\r
- public enum E戻り値\r
- {\r
- 継続 = 0,\r
- GAMESTART,\r
- // OPTION,\r
- CONFIG,\r
- EXIT\r
- }\r
-\r
-\r
- // その他\r
-\r
- #region [ private ]\r
- //-----------------\r
- [StructLayout(LayoutKind.Sequential)]\r
- private struct STキー反復用カウンタ\r
- {\r
- public CCounter Up;\r
- public CCounter Down;\r
- public CCounter R;\r
- public CCounter B;\r
- public CCounter this[int index]\r
- {\r
- get\r
- {\r
- switch (index)\r
- {\r
- case 0:\r
- return this.Up;\r
-\r
- case 1:\r
- return this.Down;\r
-\r
- case 2:\r
- return this.R;\r
-\r
- case 3:\r
- return this.B;\r
- }\r
- throw new IndexOutOfRangeException();\r
- }\r
- set\r
- {\r
- switch (index)\r
- {\r
- case 0:\r
- this.Up = value;\r
- return;\r
-\r
- case 1:\r
- this.Down = value;\r
- return;\r
-\r
- case 2:\r
- this.R = value;\r
- return;\r
-\r
- case 3:\r
- this.B = value;\r
- return;\r
- }\r
- throw new IndexOutOfRangeException();\r
- }\r
- }\r
- }\r
-\r
- private CActFIFOWhite actFI;\r
- private CActFIFOWhite actFIfromSetup;\r
- private CActFIFOWhite actFO;\r
- private CCounter ctカーソルフラッシュ用;\r
- private STキー反復用カウンタ ctキー反復用;\r
- private CCounter ct下移動用;\r
- private CCounter ct上移動用;\r
- private int MENU_H = (int)(39 * 2.25);\r
- private int MENU_W = (int)(227 * 3);\r
- private int MENU_X = 800; //206;\r
- private int MENU_Y = 500; //203;\r
- private int n現在のカーソル行;\r
- private CTexture txメニュー;\r
- private CTexture tx背景;\r
-\r
- private CPrivateFastFont prvFont;\r
- private CTexture[] txMenuItem;\r
- private struct STMenuItem\r
- {\r
- public int offsetX;\r
- public CTexture txMenuItem;\r
- }\r
- private STMenuItem[] stMenuItem;\r
-\r
- private void tカーソルを下へ移動する()\r
- {\r
- if (this.n現在のカーソル行 != (int)E戻り値.EXIT - 1)\r
- {\r
- CDTXMania.Instance.Skin.soundカーソル移動音.t再生する();\r
- this.n現在のカーソル行++;\r
- this.ct下移動用.t開始(0, 100, 1, CDTXMania.Instance.Timer);\r
- if (this.ct上移動用.b進行中)\r
- {\r
- this.ct下移動用.n現在の値 = 100 - this.ct上移動用.n現在の値;\r
- this.ct上移動用.t停止();\r
- }\r
- }\r
- }\r
- private void tカーソルを上へ移動する()\r
- {\r
- if (this.n現在のカーソル行 != (int)E戻り値.GAMESTART - 1)\r
- {\r
- CDTXMania.Instance.Skin.soundカーソル移動音.t再生する();\r
- this.n現在のカーソル行--;\r
- this.ct上移動用.t開始(0, 100, 1, CDTXMania.Instance.Timer);\r
- if (this.ct下移動用.b進行中)\r
- {\r
- this.ct上移動用.n現在の値 = 100 - this.ct下移動用.n現在の値;\r
- this.ct下移動用.t停止();\r
- }\r
- }\r
- }\r
- //-----------------\r
- #endregion\r
- }\r
-}\r