OSDN Git Service

#36043 CDTXMania 内の app 以外の static メンバをインスタンスメンバにし、appを介してアクセスするように変更。CChipのメンバの多くをpr...
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 02.タイトル / CStageタイトル.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Runtime.InteropServices;\r
5 using System.Diagnostics;\r
6 using System.Drawing;\r
7 using SlimDX.DirectInput;\r
8 using FDK;\r
9 \r
10 namespace DTXMania\r
11 {\r
12         internal class CStageタイトル : CStage\r
13         {\r
14                 // コンストラクタ\r
15                 public CStageタイトル()\r
16                 {\r
17                         base.eステージID = CStage.Eステージ.タイトル;\r
18                         base.b活性化してない = true;\r
19                         base.list子Activities.Add( this.actFIfromSetup = new CActFIFOWhite() );\r
20                         base.list子Activities.Add( this.actFI = new CActFIFOWhite() );\r
21                         base.list子Activities.Add( this.actFO = new CActFIFOWhite() );\r
22                 }\r
23 \r
24 \r
25                 // CStage 実装\r
26 \r
27                 public override void On活性化()\r
28                 {\r
29                         Trace.TraceInformation( "タイトルステージを活性化します。" );\r
30                         Trace.Indent();\r
31                         try\r
32                         {\r
33                                 for ( int i = 0; i < 4; i++ )\r
34                                 {\r
35                                         this.ctキー反復用[ i ] = new CCounter( 0, 0, 0, CDTXMania.app.Timer );\r
36                                 }\r
37                                 this.ct上移動用 = new CCounter();\r
38                                 this.ct下移動用 = new CCounter();\r
39                                 this.ctカーソルフラッシュ用 = new CCounter();\r
40                                 base.On活性化();\r
41                         }\r
42                         finally\r
43                         {\r
44                                 Trace.TraceInformation( "タイトルステージの活性化を完了しました。" );\r
45                                 Trace.Unindent();\r
46                         }\r
47                 }\r
48                 public override void On非活性化()\r
49                 {\r
50                         Trace.TraceInformation( "タイトルステージを非活性化します。" );\r
51                         Trace.Indent();\r
52                         try\r
53                         {\r
54                                 for ( int i = 0; i < 4; i++ )\r
55                                 {\r
56                                         this.ctキー反復用[ i ] = null;\r
57                                 }\r
58                                 this.ct上移動用 = null;\r
59                                 this.ct下移動用 = null;\r
60                                 this.ctカーソルフラッシュ用 = null;\r
61                         }\r
62                         finally\r
63                         {\r
64                                 Trace.TraceInformation( "タイトルステージの非活性化を完了しました。" );\r
65                                 Trace.Unindent();\r
66                         }\r
67                         base.On非活性化();\r
68                 }\r
69                 public override void OnManagedリソースの作成()\r
70                 {\r
71                         if ( !base.b活性化してない )\r
72                         {\r
73                                 this.tx背景 = TextureFactory.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenTitle background.jpg" ), false );\r
74                                 this.txメニュー = TextureFactory.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenTitle menu.png" ), false );\r
75 \r
76                                 prvFont = new CPrivateFastFont( CSkin.Path( @"Graphics\fonts\mplus-1p-heavy.ttf" ), 36 );\r
77                                 //prvFont = new CPrivateFont( new FontFamily("MS UI Gothic"), 36, FontStyle.Bold );\r
78                                 string[] menuStr = { "START", "CONFIGURATION", "EXIT" };\r
79                                 this.txMenuItem = new CTexture[ menuStr.Length ];\r
80                                 this.stMenuItem = new STMenuItem[ menuStr.Length ];\r
81 \r
82                                 // メニュー項目に対応したテクスチャ画像を生成しつつ、テクスチャ画像の最大横幅を取得しておく\r
83                                 int maxX = 0;\r
84                                 for ( int i = 0; i < menuStr.Length; i++ )\r
85                                 {\r
86                                         txMenuItem[ i ] = TextureFactory.tテクスチャの生成( prvFont.DrawPrivateFont( menuStr[ i ], Color.White, Color.Black ), false );\r
87                                         //                                      txMenuItem[ i ] = prvFont.DrawPrivateFont( menuStr[ i ], Color.White, Color.Black, Color.Yellow, Color.OrangeRed );     // グラデーションもなかなかいける。\r
88                                         //                                      txMenuItem[ i ] = prvFont.DrawPrivateFont( menuStr[ i ], Color.White );\r
89                                         if ( maxX < txMenuItem[ i ].szテクスチャサイズ.Width )\r
90                                         {\r
91                                                 maxX = txMenuItem[ i ].szテクスチャサイズ.Width;\r
92                                         }\r
93                                 }\r
94                                 // センタリング表示するために、X座標のオフセット値を算出・格納する\r
95                                 for ( int i = 0; i < menuStr.Length; i++ )\r
96                                 {\r
97                                         stMenuItem[ i ] = new STMenuItem();\r
98                                         stMenuItem[ i ].txMenuItem = txMenuItem[ i ];\r
99                                         stMenuItem[ i ].offsetX = ( maxX - txMenuItem[ i ].szテクスチャサイズ.Width ) / 2;\r
100                                 }\r
101                                 prvFont.Dispose();\r
102 \r
103                                 MENU_X = ( SampleFramework.GameWindowSize.Width - maxX ) / 2;\r
104                                 MENU_Y = 600;\r
105 \r
106                                 base.OnManagedリソースの作成();\r
107                         }\r
108                 }\r
109 \r
110 \r
111                 public override void OnManagedリソースの解放()\r
112                 {\r
113                         if ( !base.b活性化してない )\r
114                         {\r
115                                 for ( int i = 0; i < txMenuItem.Length; i++ )\r
116                                 {\r
117                                         if ( txMenuItem[ i ] != null )\r
118                                         {\r
119                                                 TextureFactory.tテクスチャの解放( ref txMenuItem[ i ] );\r
120                                         }\r
121                                 }\r
122                                 TextureFactory.tテクスチャの解放( ref this.tx背景 );\r
123                                 TextureFactory.tテクスチャの解放( ref this.txメニュー );\r
124                                 base.OnManagedリソースの解放();\r
125                         }\r
126                 }\r
127                 public override int On進行描画()\r
128                 {\r
129                         if ( !base.b活性化してない )\r
130                         {\r
131                                 #region [ 初めての進行描画 ]\r
132                                 //---------------------\r
133                                 if ( base.b初めての進行描画 )\r
134                                 {\r
135                                         if ( CDTXMania.app.r直前のステージ == CDTXMania.app.stage起動 )\r
136                                         {\r
137                                                 this.actFIfromSetup.tフェードイン開始();\r
138                                                 base.eフェーズID = CStage.Eフェーズ.タイトル_起動画面からのフェードイン;\r
139                                         }\r
140                                         else\r
141                                         {\r
142                                                 this.actFI.tフェードイン開始();\r
143                                                 base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;\r
144                                         }\r
145                                         this.ctカーソルフラッシュ用.t開始( 0, 700, 5, CDTXMania.app.Timer );\r
146                                         this.ctカーソルフラッシュ用.n現在の値 = 100;\r
147                                         base.b初めての進行描画 = false;\r
148                                 }\r
149                                 //---------------------\r
150                                 #endregion\r
151 \r
152                                 // 進行\r
153 \r
154                                 #region [ カーソル上移動 ]\r
155                                 //---------------------\r
156                                 if ( this.ct上移動用.b進行中 )\r
157                                 {\r
158                                         this.ct上移動用.t進行();\r
159                                         if ( this.ct上移動用.b終了値に達した )\r
160                                         {\r
161                                                 this.ct上移動用.t停止();\r
162                                         }\r
163                                 }\r
164                                 //---------------------\r
165                                 #endregion\r
166                                 #region [ カーソル下移動 ]\r
167                                 //---------------------\r
168                                 if ( this.ct下移動用.b進行中 )\r
169                                 {\r
170                                         this.ct下移動用.t進行();\r
171                                         if ( this.ct下移動用.b終了値に達した )\r
172                                         {\r
173                                                 this.ct下移動用.t停止();\r
174                                         }\r
175                                 }\r
176                                 //---------------------\r
177                                 #endregion\r
178                                 #region [ カーソルフラッシュ ]\r
179                                 //---------------------\r
180                                 this.ctカーソルフラッシュ用.t進行Loop();\r
181                                 //---------------------\r
182                                 #endregion\r
183 \r
184                                 #region [ キー入力 ]\r
185                                 if ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態           // 通常状態、かつ\r
186                                         && CDTXMania.app.act現在入力を占有中のプラグイン == null )        // プラグインの入力占有がない\r
187                                 {\r
188                                         if ( CDTXMania.app.Input管理.Keyboard.bキーが押された( (int) Key.Escape ) )\r
189                                                 return (int) E戻り値.EXIT;\r
190 \r
191                                         this.ctキー反復用.Up.tキー反復( CDTXMania.app.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.UpArrow ), new CCounter.DGキー処理( this.tカーソルを上へ移動する ) );\r
192                                         this.ctキー反復用.R.tキー反復( CDTXMania.app.Pad.b押されているGB( Eパッド.HH ), new CCounter.DGキー処理( this.tカーソルを上へ移動する ) );\r
193                                         if ( CDTXMania.app.Pad.b押された( E楽器パート.DRUMS, Eパッド.SD ) )\r
194                                                 this.tカーソルを上へ移動する();\r
195 \r
196                                         this.ctキー反復用.Down.tキー反復( CDTXMania.app.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.DownArrow ), new CCounter.DGキー処理( this.tカーソルを下へ移動する ) );\r
197                                         this.ctキー反復用.B.tキー反復( CDTXMania.app.Pad.b押されているGB( Eパッド.BD ), new CCounter.DGキー処理( this.tカーソルを下へ移動する ) );\r
198                                         if ( CDTXMania.app.Pad.b押された( E楽器パート.DRUMS, Eパッド.LT ) )\r
199                                                 this.tカーソルを下へ移動する();\r
200 \r
201                                         if ( ( CDTXMania.app.Pad.b押されたDGB( Eパッド.CY ) || CDTXMania.app.Pad.b押された( E楽器パート.DRUMS, Eパッド.RD ) ) || ( CDTXMania.app.Pad.b押された( E楽器パート.DRUMS, Eパッド.LC ) || ( CDTXMania.app.ConfigIni.bEnterがキー割り当てのどこにも使用されていない && CDTXMania.app.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Return ) ) ) )\r
202                                         {\r
203                                                 if ( ( this.n現在のカーソル行 == (int) E戻り値.GAMESTART - 1 ) && CDTXMania.app.Skin.soundゲーム開始音.b読み込み成功 )\r
204                                                 {\r
205                                                         CDTXMania.app.Skin.soundゲーム開始音.t再生する();\r
206                                                 }\r
207                                                 else\r
208                                                 {\r
209                                                         CDTXMania.app.Skin.sound決定音.t再生する();\r
210                                                 }\r
211                                                 if ( this.n現在のカーソル行 == (int) E戻り値.EXIT - 1 )\r
212                                                 {\r
213                                                         return (int) E戻り値.EXIT;\r
214                                                 }\r
215                                                 this.actFO.tフェードアウト開始();\r
216                                                 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
217                                         }\r
218                                         //                                      if ( CDTXMania.app.Input管理.Keyboard.bキーが押された( (int) Key.Space ) )\r
219                                         //                                              Trace.TraceInformation( "DTXMania Title: SPACE key registered. " + CDTXMania.app.ct.nシステム時刻 );\r
220                                 }\r
221                                 #endregion\r
222 \r
223                                 // 描画\r
224 \r
225                                 #region [ 背景描画 ]\r
226                                 if ( this.tx背景 != null )\r
227                                         this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );\r
228                                 #endregion\r
229                                 #region [ メニュー枠描画 ]\r
230                                 if ( this.txメニュー != null )\r
231                                 {\r
232                                         int MENU_ITEM_H = txMenuItem[ 0 ].szテクスチャサイズ.Height;\r
233                                         int x = ( 1920 - txメニュー.szテクスチャサイズ.Width ) / 2; // MENU_X;\r
234                                         int y = MENU_Y + ( ( MENU_ITEM_H - MENU_H ) / 2 ) + ( this.n現在のカーソル行 * MENU_ITEM_H );\r
235                                         if ( this.ct上移動用.b進行中 )\r
236                                         {\r
237                                                 y += (int) ( (double) MENU_ITEM_H / 2 * ( Math.Cos( Math.PI * ( ( (double) this.ct上移動用.n現在の値 ) / 100.0 ) ) + 1.0 ) );\r
238                                         }\r
239                                         else if ( this.ct下移動用.b進行中 )\r
240                                         {\r
241                                                 y -= (int) ( (double) MENU_ITEM_H / 2 * ( Math.Cos( Math.PI * ( ( (double) this.ct下移動用.n現在の値 ) / 100.0 ) ) + 1.0 ) );\r
242                                         }\r
243                                         if ( this.ctカーソルフラッシュ用.n現在の値 <= 100 )\r
244                                         {\r
245                                                 float nMag = (float) ( 1.0 + ( ( ( (double) this.ctカーソルフラッシュ用.n現在の値 ) / 100.0 ) * 0.5 ) );\r
246                                                 this.txメニュー.vc拡大縮小倍率.X = nMag;\r
247                                                 this.txメニュー.vc拡大縮小倍率.Y = nMag;\r
248                                                 this.txメニュー.n透明度 = (int) ( 255.0 * ( 1.0 - ( ( (double) this.ctカーソルフラッシュ用.n現在の値 ) / 100.0 ) ) );\r
249                                                 int x_magnified = x + ( (int) ( ( MENU_W * ( 1.0 - nMag ) ) / 2.0 ) );\r
250                                                 int y_magnified = y + ( (int) ( ( MENU_H * ( 1.0 - nMag ) ) / 2.0 ) );\r
251                                                 this.txメニュー.t2D描画( CDTXMania.app.Device, x_magnified, y_magnified, new Rectangle( 0, MENU_H * 1, MENU_W, MENU_H ) );\r
252                                         }\r
253                                         this.txメニュー.vc拡大縮小倍率.X = 1f;\r
254                                         this.txメニュー.vc拡大縮小倍率.Y = 1f;\r
255                                         this.txメニュー.n透明度 = 0xff;\r
256                                         this.txメニュー.t2D描画( CDTXMania.app.Device, x, y, new Rectangle( 0, MENU_H * 0, MENU_W, MENU_H ) );\r
257                                 }\r
258                                 #endregion\r
259 \r
260                                 #region [ メニュー項目描画 ]\r
261                                 // if ( this.txメニュー != null )\r
262                                 {\r
263                                         int offsetY = 0;\r
264                                         for ( int i = 0; i < txMenuItem.Length; i++ )\r
265                                         {\r
266                                                 this.txMenuItem[ i ].t2D描画( CDTXMania.app.Device, MENU_X + this.stMenuItem[ i ].offsetX, MENU_Y + offsetY );\r
267                                                 offsetY += this.txMenuItem[ i ].sz画像サイズ.Height;\r
268                                         }\r
269                                 }\r
270                                 #endregion\r
271                                 #region [ フェーズ移行処理 ]\r
272                                 CStage.Eフェーズ eフェーズid = base.eフェーズID;\r
273                                 switch ( eフェーズid )\r
274                                 {\r
275                                         case CStage.Eフェーズ.共通_フェードイン:\r
276                                                 if ( this.actFI.On進行描画() != 0 )\r
277                                                 {\r
278                                                         CDTXMania.app.Skin.soundタイトル音.t再生する();\r
279                                                         base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
280                                                 }\r
281                                                 break;\r
282 \r
283                                         case CStage.Eフェーズ.共通_フェードアウト:\r
284                                                 if ( this.actFO.On進行描画() == 0 )\r
285                                                 {\r
286                                                         break;\r
287                                                 }\r
288                                                 base.eフェーズID = CStage.Eフェーズ.共通_終了状態;\r
289                                                 switch ( this.n現在のカーソル行 )\r
290                                                 {\r
291                                                         case (int) E戻り値.GAMESTART - 1:\r
292                                                                 return (int) E戻り値.GAMESTART;\r
293 \r
294                                                         case (int) E戻り値.CONFIG - 1:\r
295                                                                 return (int) E戻り値.CONFIG;\r
296 \r
297                                                         case (int) E戻り値.EXIT - 1:\r
298                                                                 return (int) E戻り値.EXIT;\r
299                                                         //return ( this.n現在のカーソル行 + 1 );\r
300                                                 }\r
301                                                 break;\r
302 \r
303                                         case CStage.Eフェーズ.タイトル_起動画面からのフェードイン:\r
304                                                 if ( this.actFIfromSetup.On進行描画() != 0 )\r
305                                                 {\r
306                                                         CDTXMania.app.Skin.soundタイトル音.t再生する();\r
307                                                         base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
308                                                 }\r
309                                                 break;\r
310                                 }\r
311                                 #endregion\r
312                         }\r
313                         return 0;\r
314                 }\r
315                 public enum E戻り値\r
316                 {\r
317                         継続 = 0,\r
318                         GAMESTART,\r
319                         //                      OPTION,\r
320                         CONFIG,\r
321                         EXIT\r
322                 }\r
323 \r
324 \r
325                 // その他\r
326 \r
327                 #region [ private ]\r
328                 //-----------------\r
329                 [StructLayout( LayoutKind.Sequential )]\r
330                 private struct STキー反復用カウンタ\r
331                 {\r
332                         public CCounter Up;\r
333                         public CCounter Down;\r
334                         public CCounter R;\r
335                         public CCounter B;\r
336                         public CCounter this[ int index ]\r
337                         {\r
338                                 get\r
339                                 {\r
340                                         switch ( index )\r
341                                         {\r
342                                                 case 0:\r
343                                                         return this.Up;\r
344 \r
345                                                 case 1:\r
346                                                         return this.Down;\r
347 \r
348                                                 case 2:\r
349                                                         return this.R;\r
350 \r
351                                                 case 3:\r
352                                                         return this.B;\r
353                                         }\r
354                                         throw new IndexOutOfRangeException();\r
355                                 }\r
356                                 set\r
357                                 {\r
358                                         switch ( index )\r
359                                         {\r
360                                                 case 0:\r
361                                                         this.Up = value;\r
362                                                         return;\r
363 \r
364                                                 case 1:\r
365                                                         this.Down = value;\r
366                                                         return;\r
367 \r
368                                                 case 2:\r
369                                                         this.R = value;\r
370                                                         return;\r
371 \r
372                                                 case 3:\r
373                                                         this.B = value;\r
374                                                         return;\r
375                                         }\r
376                                         throw new IndexOutOfRangeException();\r
377                                 }\r
378                         }\r
379                 }\r
380 \r
381                 private CActFIFOWhite actFI;\r
382                 private CActFIFOWhite actFIfromSetup;\r
383                 private CActFIFOWhite actFO;\r
384                 private CCounter ctカーソルフラッシュ用;\r
385                 private STキー反復用カウンタ ctキー反復用;\r
386                 private CCounter ct下移動用;\r
387                 private CCounter ct上移動用;\r
388                 private int MENU_H = (int) ( 39 * 2.25 );\r
389                 private int MENU_W = (int) ( 227 * 3 );\r
390                 private int MENU_X = 800;       //206;\r
391                 private int MENU_Y = 500;       //203;\r
392                 private int n現在のカーソル行;\r
393                 private CTexture txメニュー;\r
394                 private CTexture tx背景;\r
395 \r
396                 private CPrivateFastFont prvFont;\r
397                 private CTexture[] txMenuItem;\r
398                 private struct STMenuItem\r
399                 {\r
400                         public int offsetX;\r
401                         public CTexture txMenuItem;\r
402                 }\r
403                 private STMenuItem[] stMenuItem;\r
404 \r
405                 private void tカーソルを下へ移動する()\r
406                 {\r
407                         if ( this.n現在のカーソル行 != (int) E戻り値.EXIT - 1 )\r
408                         {\r
409                                 CDTXMania.app.Skin.soundカーソル移動音.t再生する();\r
410                                 this.n現在のカーソル行++;\r
411                                 this.ct下移動用.t開始( 0, 100, 1, CDTXMania.app.Timer );\r
412                                 if ( this.ct上移動用.b進行中 )\r
413                                 {\r
414                                         this.ct下移動用.n現在の値 = 100 - this.ct上移動用.n現在の値;\r
415                                         this.ct上移動用.t停止();\r
416                                 }\r
417                         }\r
418                 }\r
419                 private void tカーソルを上へ移動する()\r
420                 {\r
421                         if ( this.n現在のカーソル行 != (int) E戻り値.GAMESTART - 1 )\r
422                         {\r
423                                 CDTXMania.app.Skin.soundカーソル移動音.t再生する();\r
424                                 this.n現在のカーソル行--;\r
425                                 this.ct上移動用.t開始( 0, 100, 1, CDTXMania.app.Timer );\r
426                                 if ( this.ct下移動用.b進行中 )\r
427                                 {\r
428                                         this.ct上移動用.n現在の値 = 100 - this.ct下移動用.n現在の値;\r
429                                         this.ct下移動用.t停止();\r
430                                 }\r
431                         }\r
432                 }\r
433                 //-----------------\r
434                 #endregion\r
435         }\r
436 }\r