2 using System.Collections.Generic;
\r
4 using System.Runtime.InteropServices;
\r
5 using System.Diagnostics;
\r
6 using System.Drawing;
\r
7 using SlimDX.DirectInput;
\r
12 internal class CStageタイトル : CStage
\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
27 public override void On活性化()
\r
29 Trace.TraceInformation( "タイトルステージを活性化します。" );
\r
33 for ( int i = 0; i < 4; i++ )
\r
35 this.ctキー反復用[ i ] = new CCounter( 0, 0, 0, CDTXMania.app.Timer );
\r
37 this.ct上移動用 = new CCounter();
\r
38 this.ct下移動用 = new CCounter();
\r
39 this.ctカーソルフラッシュ用 = new CCounter();
\r
44 Trace.TraceInformation( "タイトルステージの活性化を完了しました。" );
\r
48 public override void On非活性化()
\r
50 Trace.TraceInformation( "タイトルステージを非活性化します。" );
\r
54 for ( int i = 0; i < 4; i++ )
\r
56 this.ctキー反復用[ i ] = null;
\r
60 this.ctカーソルフラッシュ用 = null;
\r
64 Trace.TraceInformation( "タイトルステージの非活性化を完了しました。" );
\r
69 public override void OnManagedリソースの作成()
\r
71 if ( !base.b活性化してない )
\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
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
82 // メニュー項目に対応したテクスチャ画像を生成しつつ、テクスチャ画像の最大横幅を取得しておく
\r
84 for ( int i = 0; i < menuStr.Length; i++ )
\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
91 maxX = txMenuItem[ i ].szテクスチャサイズ.Width;
\r
94 // センタリング表示するために、X座標のオフセット値を算出・格納する
\r
95 for ( int i = 0; i < menuStr.Length; i++ )
\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
103 MENU_X = ( SampleFramework.GameWindowSize.Width - maxX ) / 2;
\r
106 base.OnManagedリソースの作成();
\r
111 public override void OnManagedリソースの解放()
\r
113 if ( !base.b活性化してない )
\r
115 for ( int i = 0; i < txMenuItem.Length; i++ )
\r
117 if ( txMenuItem[ i ] != null )
\r
119 TextureFactory.tテクスチャの解放( ref txMenuItem[ i ] );
\r
122 TextureFactory.tテクスチャの解放( ref this.tx背景 );
\r
123 TextureFactory.tテクスチャの解放( ref this.txメニュー );
\r
124 base.OnManagedリソースの解放();
\r
127 public override int On進行描画()
\r
129 if ( !base.b活性化してない )
\r
131 #region [ 初めての進行描画 ]
\r
132 //---------------------
\r
133 if ( base.b初めての進行描画 )
\r
135 if ( CDTXMania.app.r直前のステージ == CDTXMania.app.stage起動 )
\r
137 this.actFIfromSetup.tフェードイン開始();
\r
138 base.eフェーズID = CStage.Eフェーズ.タイトル_起動画面からのフェードイン;
\r
142 this.actFI.tフェードイン開始();
\r
143 base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;
\r
145 this.ctカーソルフラッシュ用.t開始( 0, 700, 5, CDTXMania.app.Timer );
\r
146 this.ctカーソルフラッシュ用.n現在の値 = 100;
\r
147 base.b初めての進行描画 = false;
\r
149 //---------------------
\r
154 #region [ カーソル上移動 ]
\r
155 //---------------------
\r
156 if ( this.ct上移動用.b進行中 )
\r
159 if ( this.ct上移動用.b終了値に達した )
\r
164 //---------------------
\r
166 #region [ カーソル下移動 ]
\r
167 //---------------------
\r
168 if ( this.ct下移動用.b進行中 )
\r
171 if ( this.ct下移動用.b終了値に達した )
\r
176 //---------------------
\r
178 #region [ カーソルフラッシュ ]
\r
179 //---------------------
\r
180 this.ctカーソルフラッシュ用.t進行Loop();
\r
181 //---------------------
\r
185 if ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 // 通常状態、かつ
\r
186 && CDTXMania.app.act現在入力を占有中のプラグイン == null ) // プラグインの入力占有がない
\r
188 if ( CDTXMania.app.Input管理.Keyboard.bキーが押された( (int) Key.Escape ) )
\r
189 return (int) E戻り値.EXIT;
\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
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
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
203 if ( ( this.n現在のカーソル行 == (int) E戻り値.GAMESTART - 1 ) && CDTXMania.app.Skin.soundゲーム開始音.b読み込み成功 )
\r
205 CDTXMania.app.Skin.soundゲーム開始音.t再生する();
\r
209 CDTXMania.app.Skin.sound決定音.t再生する();
\r
211 if ( this.n現在のカーソル行 == (int) E戻り値.EXIT - 1 )
\r
213 return (int) E戻り値.EXIT;
\r
215 this.actFO.tフェードアウト開始();
\r
216 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\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
226 if ( this.tx背景 != null )
\r
227 this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );
\r
229 #region [ メニュー枠描画 ]
\r
230 if ( this.txメニュー != null )
\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
237 y += (int) ( (double) MENU_ITEM_H / 2 * ( Math.Cos( Math.PI * ( ( (double) this.ct上移動用.n現在の値 ) / 100.0 ) ) + 1.0 ) );
\r
239 else if ( this.ct下移動用.b進行中 )
\r
241 y -= (int) ( (double) MENU_ITEM_H / 2 * ( Math.Cos( Math.PI * ( ( (double) this.ct下移動用.n現在の値 ) / 100.0 ) ) + 1.0 ) );
\r
243 if ( this.ctカーソルフラッシュ用.n現在の値 <= 100 )
\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
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
260 #region [ メニュー項目描画 ]
\r
261 // if ( this.txメニュー != null )
\r
264 for ( int i = 0; i < txMenuItem.Length; i++ )
\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
271 #region [ フェーズ移行処理 ]
\r
272 CStage.Eフェーズ eフェーズid = base.eフェーズID;
\r
275 case CStage.Eフェーズ.共通_フェードイン:
\r
276 if ( this.actFI.On進行描画() != 0 )
\r
278 CDTXMania.app.Skin.soundタイトル音.t再生する();
\r
279 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
283 case CStage.Eフェーズ.共通_フェードアウト:
\r
284 if ( this.actFO.On進行描画() == 0 )
\r
288 base.eフェーズID = CStage.Eフェーズ.共通_終了状態;
\r
289 switch ( this.n現在のカーソル行 )
\r
291 case (int) E戻り値.GAMESTART - 1:
\r
292 return (int) E戻り値.GAMESTART;
\r
294 case (int) E戻り値.CONFIG - 1:
\r
295 return (int) E戻り値.CONFIG;
\r
297 case (int) E戻り値.EXIT - 1:
\r
298 return (int) E戻り値.EXIT;
\r
299 //return ( this.n現在のカーソル行 + 1 );
\r
303 case CStage.Eフェーズ.タイトル_起動画面からのフェードイン:
\r
304 if ( this.actFIfromSetup.On進行描画() != 0 )
\r
306 CDTXMania.app.Skin.soundタイトル音.t再生する();
\r
307 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
327 #region [ private ]
\r
328 //-----------------
\r
329 [StructLayout( LayoutKind.Sequential )]
\r
330 private struct STキー反復用カウンタ
\r
332 public CCounter Up;
\r
333 public CCounter Down;
\r
336 public CCounter this[ int index ]
\r
354 throw new IndexOutOfRangeException();
\r
376 throw new IndexOutOfRangeException();
\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
396 private CPrivateFastFont prvFont;
\r
397 private CTexture[] txMenuItem;
\r
398 private struct STMenuItem
\r
400 public int offsetX;
\r
401 public CTexture txMenuItem;
\r
403 private STMenuItem[] stMenuItem;
\r
405 private void tカーソルを下へ移動する()
\r
407 if ( this.n現在のカーソル行 != (int) E戻り値.EXIT - 1 )
\r
409 CDTXMania.app.Skin.soundカーソル移動音.t再生する();
\r
411 this.ct下移動用.t開始( 0, 100, 1, CDTXMania.app.Timer );
\r
412 if ( this.ct上移動用.b進行中 )
\r
414 this.ct下移動用.n現在の値 = 100 - this.ct上移動用.n現在の値;
\r
419 private void tカーソルを上へ移動する()
\r
421 if ( this.n現在のカーソル行 != (int) E戻り値.GAMESTART - 1 )
\r
423 CDTXMania.app.Skin.soundカーソル移動音.t再生する();
\r
425 this.ct上移動用.t開始( 0, 100, 1, CDTXMania.app.Timer );
\r
426 if ( this.ct下移動用.b進行中 )
\r
428 this.ct上移動用.n現在の値 = 100 - this.ct下移動用.n現在の値;
\r
433 //-----------------
\r