OSDN Git Service

550ece37e5353cd0f5a51d86c58b52fa54f1187f
[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 \r
16                 public CStageタイトル()\r
17                 {\r
18                         base.eステージID = CStage.Eステージ.タイトル;\r
19                         base.b活性化してない = true;\r
20                         base.list子Activities.Add( this.actFIfromSetup = new CActFIFOWhite() );\r
21                         base.list子Activities.Add( this.actFI = new CActFIFOWhite() );\r
22                         base.list子Activities.Add( this.actFO = new CActFIFOWhite() );\r
23                 }\r
24 \r
25 \r
26                 // CStage 実装\r
27 \r
28                 public override void On活性化()\r
29                 {\r
30                         Trace.TraceInformation( "タイトルステージを活性化します。" );\r
31                         Trace.Indent();\r
32                         try\r
33                         {\r
34                                 for( int i = 0; i < 4; i++ )\r
35                                 {\r
36                                         this.ctキー反復用[ i ] = new CCounter( 0, 0, 0, CDTXMania.Timer );\r
37                                 }\r
38                                 this.ct上移動用 = new CCounter();\r
39                                 this.ct下移動用 = new CCounter();\r
40                                 this.ctカーソルフラッシュ用 = new CCounter();\r
41                                 base.On活性化();\r
42                         }\r
43                         finally\r
44                         {\r
45                                 Trace.TraceInformation( "タイトルステージの活性化を完了しました。" );\r
46                                 Trace.Unindent();\r
47                         }\r
48                 }\r
49                 public override void On非活性化()\r
50                 {\r
51                         Trace.TraceInformation( "タイトルステージを非活性化します。" );\r
52                         Trace.Indent();\r
53                         try\r
54                         {\r
55                                 for( int i = 0; i < 4; i++ )\r
56                                 {\r
57                                         this.ctキー反復用[ i ] = null;\r
58                                 }\r
59                                 this.ct上移動用 = null;\r
60                                 this.ct下移動用 = null;\r
61                                 this.ctカーソルフラッシュ用 = null;\r
62                         }\r
63                         finally\r
64                         {\r
65                                 Trace.TraceInformation( "タイトルステージの非活性化を完了しました。" );\r
66                                 Trace.Unindent();\r
67                         }\r
68                         base.On非活性化();\r
69                 }\r
70                 public override void OnManagedリソースの作成()\r
71                 {\r
72                         if( !base.b活性化してない )\r
73                         {\r
74                                 this.tx背景 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenTitle background.jpg" ), false );\r
75                                 this.txメニュー = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenTitle menu.png" ), false );\r
76                                 base.OnManagedリソースの作成();\r
77                         }\r
78                 }\r
79                 public override void OnManagedリソースの解放()\r
80                 {\r
81                         if( !base.b活性化してない )\r
82                         {\r
83                                 CDTXMania.tテクスチャの解放( ref this.tx背景 );\r
84                                 CDTXMania.tテクスチャの解放( ref this.txメニュー );\r
85                                 base.OnManagedリソースの解放();\r
86                         }\r
87                 }\r
88                 public override int On進行描画()\r
89                 {\r
90                         if( !base.b活性化してない )\r
91                         {\r
92                                 #region [ 初めての進行描画 ]\r
93                                 //---------------------\r
94                                 if( base.b初めての進行描画 )\r
95                                 {\r
96                                         if( CDTXMania.r直前のステージ == CDTXMania.stage起動 )\r
97                                         {\r
98                                                 this.actFIfromSetup.tフェードイン開始();\r
99                                                 base.eフェーズID = CStage.Eフェーズ.タイトル_起動画面からのフェードイン;\r
100                                         }\r
101                                         else\r
102                                         {\r
103                                                 this.actFI.tフェードイン開始();\r
104                                                 base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;\r
105                                         }\r
106                                         this.ctカーソルフラッシュ用.t開始( 0, 700, 5, CDTXMania.Timer );\r
107                                         this.ctカーソルフラッシュ用.n現在の値 = 100;\r
108                                         base.b初めての進行描画 = false;\r
109                                 }\r
110                                 //---------------------\r
111                                 #endregion\r
112 \r
113                                 // 進行\r
114 \r
115                                 #region [ カーソル上移動 ]\r
116                                 //---------------------\r
117                                 if( this.ct上移動用.b進行中 )\r
118                                 {\r
119                                         this.ct上移動用.t進行();\r
120                                         if( this.ct上移動用.b終了値に達した )\r
121                                         {\r
122                                                 this.ct上移動用.t停止();\r
123                                         }\r
124                                 }\r
125                                 //---------------------\r
126                                 #endregion\r
127                                 #region [ カーソル下移動 ]\r
128                                 //---------------------\r
129                                 if( this.ct下移動用.b進行中 )\r
130                                 {\r
131                                         this.ct下移動用.t進行();\r
132                                         if( this.ct下移動用.b終了値に達した )\r
133                                         {\r
134                                                 this.ct下移動用.t停止();\r
135                                         }\r
136                                 }\r
137                                 //---------------------\r
138                                 #endregion\r
139                                 #region [ カーソルフラッシュ ]\r
140                                 //---------------------\r
141                                 this.ctカーソルフラッシュ用.t進行Loop();\r
142                                 //---------------------\r
143                                 #endregion\r
144 \r
145                                 // キー入力\r
146 \r
147                                 if( base.eフェーズID == CStage.Eフェーズ.共通_通常状態            // 通常状態、かつ\r
148                                         && CDTXMania.act現在入力を占有中のプラグイン == null )    // プラグインの入力占有がない\r
149                                 {\r
150                                         if( CDTXMania.Input管理.Keyboard.bキーが押された( (int) Key.Escape ) )\r
151                                                 return 4;\r
152 \r
153                                         this.ctキー反復用.Up.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( 0x84 ), new CCounter.DGキー処理( this.tカーソルを上へ移動する ) );\r
154                                         this.ctキー反復用.R.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.HH ), new CCounter.DGキー処理( this.tカーソルを上へ移動する ) );\r
155                                         if( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.SD ) )\r
156                                                 this.tカーソルを上へ移動する();\r
157 \r
158                                         this.ctキー反復用.Down.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( 50 ), new CCounter.DGキー処理( this.tカーソルを下へ移動する ) );\r
159                                         this.ctキー反復用.B.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.BD ), new CCounter.DGキー処理( this.tカーソルを下へ移動する ) );\r
160                                         if( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LT ) )\r
161                                                 this.tカーソルを下へ移動する();\r
162 \r
163                                         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
164                                         {\r
165                                                 if( ( this.n現在のカーソル行 == 0 ) && CDTXMania.Skin.soundゲーム開始音.b読み込み成功 )\r
166                                                 {\r
167                                                         CDTXMania.Skin.soundゲーム開始音.t再生する();\r
168                                                 }\r
169                                                 else\r
170                                                 {\r
171                                                         CDTXMania.Skin.sound決定音.t再生する();\r
172                                                 }\r
173                                                 if( this.n現在のカーソル行 == 3 )\r
174                                                 {\r
175                                                         return 4;\r
176                                                 }\r
177                                                 this.actFO.tフェードアウト開始();\r
178                                                 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
179                                         }\r
180                                 }\r
181 \r
182                                 // 描画\r
183 \r
184                                 if( this.tx背景 != null )\r
185                                         this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );\r
186 \r
187                                 if( this.txメニュー != null )\r
188                                 {\r
189                                         int x = 0xce;\r
190                                         int y = 0xcb + ( this.n現在のカーソル行 * 0x27 );\r
191                                         if( this.ct上移動用.b進行中 )\r
192                                         {\r
193                                                 y += (int) ( 19.5 * ( Math.Cos( 3.1415926535897931 * ( ( (double) this.ct上移動用.n現在の値 ) / 100.0 ) ) + 1.0 ) );\r
194                                         }\r
195                                         else if( this.ct下移動用.b進行中 )\r
196                                         {\r
197                                                 y -= (int) ( 19.5 * ( Math.Cos( 3.1415926535897931 * ( ( (double) this.ct下移動用.n現在の値 ) / 100.0 ) ) + 1.0 ) );\r
198                                         }\r
199                                         if( this.ctカーソルフラッシュ用.n現在の値 <= 100 )\r
200                                         {\r
201                                                 float num3 = (float) ( 1.0 + ( ( ( (double) this.ctカーソルフラッシュ用.n現在の値 ) / 100.0 ) * 0.5 ) );\r
202                                                 this.txメニュー.vc拡大縮小倍率.X = num3;\r
203                                                 this.txメニュー.vc拡大縮小倍率.Y = num3;\r
204                                                 this.txメニュー.n透明度 = (int) ( 255.0 * ( 1.0 - ( ( (double) this.ctカーソルフラッシュ用.n現在の値 ) / 100.0 ) ) );\r
205                                                 int num4 = x + ( (int) ( ( 227.0 * ( 1.0 - num3 ) ) / 2.0 ) );\r
206                                                 int num5 = y + ( (int) ( ( 39.0 * ( 1.0 - num3 ) ) / 2.0 ) );\r
207                                                 this.txメニュー.t2D描画( CDTXMania.app.Device, num4, num5, new Rectangle( 0, 0xc3, 0xe3, 0x27 ) );\r
208                                         }\r
209                                         this.txメニュー.vc拡大縮小倍率.X = 1f;\r
210                                         this.txメニュー.vc拡大縮小倍率.Y = 1f;\r
211                                         this.txメニュー.n透明度 = 0xff;\r
212                                         this.txメニュー.t2D描画( CDTXMania.app.Device, x, y, new Rectangle( 0, 0x9c, 0xe3, 0x27 ) );\r
213                                 }\r
214                                 if( this.txメニュー != null )\r
215                                 {\r
216                                         this.txメニュー.t2D描画( CDTXMania.app.Device, 0xce, 0xcb, new Rectangle( 0, 0, 0xe3, 0x9c ) );\r
217                                 }\r
218                                 CStage.Eフェーズ eフェーズid = base.eフェーズID;\r
219                                 switch( eフェーズid )\r
220                                 {\r
221                                         case CStage.Eフェーズ.共通_フェードイン:\r
222                                                 if( this.actFI.On進行描画() != 0 )\r
223                                                 {\r
224                                                         CDTXMania.Skin.soundタイトル音.t再生する();\r
225                                                         base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
226                                                 }\r
227                                                 break;\r
228 \r
229                                         case CStage.Eフェーズ.共通_フェードアウト:\r
230                                                 if( this.actFO.On進行描画() == 0 )\r
231                                                 {\r
232                                                         break;\r
233                                                 }\r
234                                                 base.eフェーズID = CStage.Eフェーズ.共通_終了状態;\r
235                                                 return ( this.n現在のカーソル行 + 1 );\r
236 \r
237                                         case CStage.Eフェーズ.タイトル_起動画面からのフェードイン:\r
238                                                 if( this.actFIfromSetup.On進行描画() != 0 )\r
239                                                 {\r
240                                                         CDTXMania.Skin.soundタイトル音.t再生する();\r
241                                                         base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
242                                                 }\r
243                                                 break;\r
244                                 }\r
245                         }\r
246                         return 0;\r
247                 }\r
248                 public enum E戻り値\r
249                 {\r
250                         継続,\r
251                         GAMESTART,\r
252                         OPTION,\r
253                         CONFIG,\r
254                         EXIT\r
255                 }\r
256 \r
257 \r
258                 // その他\r
259 \r
260                 #region [ private ]\r
261                 //-----------------\r
262                 [StructLayout( LayoutKind.Sequential )]\r
263                 private struct STキー反復用カウンタ\r
264                 {\r
265                         public CCounter Up;\r
266                         public CCounter Down;\r
267                         public CCounter R;\r
268                         public CCounter B;\r
269                         public CCounter this[ int index ]\r
270                         {\r
271                                 get\r
272                                 {\r
273                                         switch( index )\r
274                                         {\r
275                                                 case 0:\r
276                                                         return this.Up;\r
277 \r
278                                                 case 1:\r
279                                                         return this.Down;\r
280 \r
281                                                 case 2:\r
282                                                         return this.R;\r
283 \r
284                                                 case 3:\r
285                                                         return this.B;\r
286                                         }\r
287                                         throw new IndexOutOfRangeException();\r
288                                 }\r
289                                 set\r
290                                 {\r
291                                         switch( index )\r
292                                         {\r
293                                                 case 0:\r
294                                                         this.Up = value;\r
295                                                         return;\r
296 \r
297                                                 case 1:\r
298                                                         this.Down = value;\r
299                                                         return;\r
300 \r
301                                                 case 2:\r
302                                                         this.R = value;\r
303                                                         return;\r
304 \r
305                                                 case 3:\r
306                                                         this.B = value;\r
307                                                         return;\r
308                                         }\r
309                                         throw new IndexOutOfRangeException();\r
310                                 }\r
311                         }\r
312                 }\r
313 \r
314                 private CActFIFOWhite actFI;\r
315                 private CActFIFOWhite actFIfromSetup;\r
316                 private CActFIFOWhite actFO;\r
317                 private CCounter ctカーソルフラッシュ用;\r
318                 private STキー反復用カウンタ ctキー反復用;\r
319                 private CCounter ct下移動用;\r
320                 private CCounter ct上移動用;\r
321                 private const int MENU_H = 0x27;\r
322                 private const int MENU_W = 0xe3;\r
323                 private const int MENU_X = 0xce;\r
324                 private const int MENU_Y = 0xcb;\r
325                 private int n現在のカーソル行;\r
326                 private CTexture txメニュー;\r
327                 private CTexture tx背景;\r
328         \r
329                 private void tカーソルを下へ移動する()\r
330                 {\r
331                         if( this.n現在のカーソル行 != 3 )\r
332                         {\r
333                                 CDTXMania.Skin.soundカーソル移動音.t再生する();\r
334                                 this.n現在のカーソル行++;\r
335                                 this.ct下移動用.t開始( 0, 100, 1, CDTXMania.Timer );\r
336                                 if( this.ct上移動用.b進行中 )\r
337                                 {\r
338                                         this.ct下移動用.n現在の値 = 100 - this.ct上移動用.n現在の値;\r
339                                         this.ct上移動用.t停止();\r
340                                 }\r
341                         }\r
342                 }\r
343                 private void tカーソルを上へ移動する()\r
344                 {\r
345                         if( this.n現在のカーソル行 != 0 )\r
346                         {\r
347                                 CDTXMania.Skin.soundカーソル移動音.t再生する();\r
348                                 this.n現在のカーソル行--;\r
349                                 this.ct上移動用.t開始( 0, 100, 1, CDTXMania.Timer );\r
350                                 if( this.ct下移動用.b進行中 )\r
351                                 {\r
352                                         this.ct上移動用.n現在の値 = 100 - this.ct下移動用.n現在の値;\r
353                                         this.ct下移動用.t停止();\r
354                                 }\r
355                         }\r
356                 }\r
357                 //-----------------\r
358                 #endregion\r
359         }\r
360 }\r