OSDN Git Service

Branchで修正したバグをtrunkにも適用した。
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 06.曲読み込み / CStage曲読み込み.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Diagnostics;\r
5 using System.Drawing;\r
6 using System.IO;\r
7 using SlimDX;\r
8 using System.Drawing.Text;\r
9 using FDK;\r
10 \r
11 namespace DTXMania\r
12 {\r
13         internal class CStage曲読み込み : CStage\r
14         {\r
15                 // コンストラクタ\r
16 \r
17                 public CStage曲読み込み()\r
18                 {\r
19                         base.eステージID = CStage.Eステージ.曲読み込み;\r
20                         base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
21                         base.b活性化してない = true;\r
22 //                      base.list子Activities.Add( this.actFI = new CActFIFOBlack() ); // #27787 2012.3.10 yyagi 曲読み込み画面のフェードインの省略\r
23                         base.list子Activities.Add( this.actFO = new CActFIFOBlack() );\r
24                 }\r
25 \r
26 \r
27                 // CStage 実装\r
28 \r
29                 public override void On活性化()\r
30                 {\r
31                         Trace.TraceInformation( "曲読み込みステージを活性化します。" );\r
32                         Trace.Indent();\r
33                         try\r
34                         {\r
35                                 this.str曲タイトル = "";\r
36                                 this.strSTAGEFILE = "";\r
37                                 this.b音符を表示する = false;\r
38                                 this.n音符の表示位置X = 0x308;\r
39                                 this.ftタイトル表示用フォント = new Font( "MS PGothic", 48f, GraphicsUnit.Pixel );\r
40                                 this.nBGM再生開始時刻 = -1;\r
41                                 this.nBGMの総再生時間ms = 0;\r
42                                 if( this.sd読み込み音 != null )\r
43                                 {\r
44                                         CDTXMania.Sound管理.tサウンドを破棄する( this.sd読み込み音 );\r
45                                         this.sd読み込み音 = null;\r
46                                 }\r
47 \r
48                                 string strDTXファイルパス = ( CDTXMania.bコンパクトモード ) ?\r
49                                         CDTXMania.strコンパクトモードファイル : CDTXMania.stage選曲.r確定されたスコア.ファイル情報.ファイルの絶対パス;\r
50                                 \r
51                                 CDTX cdtx = new CDTX( strDTXファイルパス, true );\r
52                                 this.str曲タイトル = cdtx.TITLE;\r
53                                 if( ( ( cdtx.STAGEFILE != null ) && ( cdtx.STAGEFILE.Length > 0 ) ) && ( File.Exists( cdtx.strフォルダ名 + cdtx.STAGEFILE ) && !CDTXMania.ConfigIni.bストイックモード ) )\r
54                                 {\r
55                                         this.strSTAGEFILE = cdtx.strフォルダ名 + cdtx.STAGEFILE;\r
56                                         this.b音符を表示する = false;\r
57                                 }\r
58                                 else\r
59                                 {\r
60                                         this.strSTAGEFILE = CSkin.Path( @"Graphics\\ScreenNowLoading background.jpg" );\r
61                                         this.b音符を表示する = true;\r
62                                 }\r
63                                 if( ( ( cdtx.SOUND_NOWLOADING != null ) && ( cdtx.SOUND_NOWLOADING.Length > 0 ) ) && File.Exists( cdtx.strフォルダ名 + cdtx.SOUND_NOWLOADING ) )\r
64                                 {\r
65                                         string strNowLoadingサウンドファイルパス = cdtx.strフォルダ名 + cdtx.SOUND_NOWLOADING;\r
66                                         try\r
67                                         {\r
68                                                 this.sd読み込み音 = CDTXMania.Sound管理.tサウンドを生成する( strNowLoadingサウンドファイルパス );\r
69                                         }\r
70                                         catch\r
71                                         {\r
72                                                 Trace.TraceError( "#SOUND_NOWLOADING に指定されたサウンドファイルの読み込みに失敗しました。({0})", strNowLoadingサウンドファイルパス );\r
73                                         }\r
74                                 }\r
75                                 cdtx.On非活性化();\r
76                                 base.On活性化();\r
77                         }\r
78                         finally\r
79                         {\r
80                                 Trace.TraceInformation( "曲読み込みステージの活性化を完了しました。" );\r
81                                 Trace.Unindent();\r
82                         }\r
83                 }\r
84                 public override void On非活性化()\r
85                 {\r
86                         Trace.TraceInformation( "曲読み込みステージを非活性化します。" );\r
87                         Trace.Indent();\r
88                         try\r
89                         {\r
90                                 if( this.ftタイトル表示用フォント != null )\r
91                                 {\r
92                                         this.ftタイトル表示用フォント.Dispose();\r
93                                         this.ftタイトル表示用フォント = null;\r
94                                 }\r
95                                 base.On非活性化();\r
96                         }\r
97                         finally\r
98                         {\r
99                                 Trace.TraceInformation( "曲読み込みステージの非活性化を完了しました。" );\r
100                                 Trace.Unindent();\r
101                         }\r
102                 }\r
103                 public override void OnManagedリソースの作成()\r
104                 {\r
105                         if( !base.b活性化してない )\r
106                         {\r
107                                 this.tx音符 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\\ScreenNowLoading onpu.png" ), false );\r
108                                 this.tx背景 = CDTXMania.tテクスチャの生成( this.strSTAGEFILE, false );\r
109                                 if( this.b音符を表示する )\r
110                                 {\r
111                                         try\r
112                                         {\r
113                                                 if( ( this.str曲タイトル != null ) && ( this.str曲タイトル.Length > 0 ) )\r
114                                                 {\r
115                                                         Bitmap image = new Bitmap( 1, 1 );\r
116                                                         Graphics graphics = Graphics.FromImage( image );\r
117                                                         SizeF ef = graphics.MeasureString( this.str曲タイトル, this.ftタイトル表示用フォント );\r
118                                                         Size size = new Size( (int) Math.Ceiling( (double) ef.Width ), (int) Math.Ceiling( (double) ef.Height ) );\r
119                                                         graphics.Dispose();\r
120                                                         image.Dispose();\r
121                                                         image = new Bitmap( size.Width, size.Height );\r
122                                                         graphics = Graphics.FromImage( image );\r
123                                                         graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;\r
124                                                         graphics.DrawString( this.str曲タイトル, this.ftタイトル表示用フォント, Brushes.White, ( float ) 0f, ( float ) 0f );\r
125                                                         graphics.Dispose();\r
126                                                         this.txタイトル = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );\r
127                                                         this.txタイトル.vc拡大縮小倍率 = new Vector3( 0.5f, 0.5f, 1f );\r
128                                                         image.Dispose();\r
129                                                         this.n音符の表示位置X = ( ( 640 - ( (int) ( size.Width * this.txタイトル.vc拡大縮小倍率.X ) ) ) - ( ( this.tx音符 != null ) ? this.tx音符.sz画像サイズ.Width : 0 ) ) - 2;\r
130                                                 }\r
131                                                 else\r
132                                                 {\r
133                                                         this.txタイトル = null;\r
134                                                         this.n音符の表示位置X = ( 640 - ( ( this.tx音符 != null ) ? this.tx音符.sz画像サイズ.Width : 0 ) ) - 2;\r
135                                                 }\r
136                                         }\r
137                                         catch( CTextureCreateFailedException )\r
138                                         {\r
139                                                 Trace.TraceError( "テクスチャの生成に失敗しました。({0})", new object[] { this.strSTAGEFILE } );\r
140                                                 this.txタイトル = null;\r
141                                                 this.tx背景 = null;\r
142                                         }\r
143                                 }\r
144                                 else\r
145                                 {\r
146                                         this.txタイトル = null;\r
147                                 }\r
148                                 base.OnManagedリソースの作成();\r
149                         }\r
150                 }\r
151                 public override void OnManagedリソースの解放()\r
152                 {\r
153                         if( !base.b活性化してない )\r
154                         {\r
155                                 CDTXMania.tテクスチャの解放( ref this.tx背景 );\r
156                                 CDTXMania.tテクスチャの解放( ref this.tx音符 );\r
157                                 CDTXMania.tテクスチャの解放( ref this.txタイトル );\r
158                                 base.OnManagedリソースの解放();\r
159                         }\r
160                 }\r
161                 public override int On進行描画()\r
162                 {\r
163                         string str;\r
164 \r
165                         if( base.b活性化してない )\r
166                                 return 0;\r
167 \r
168                         #region [ 初めての進行描画 ]\r
169                         //-----------------------------\r
170                         if( base.b初めての進行描画 )\r
171                         {\r
172                                 Cスコア cスコア1 = CDTXMania.stage選曲.r確定されたスコア;\r
173                                 if( this.sd読み込み音 != null )\r
174                                 {\r
175                                         if( CDTXMania.Skin.sound曲読込開始音.b排他 && ( CSkin.Cシステムサウンド.r最後に再生した排他システムサウンド != null ) )\r
176                                         {\r
177                                                 CSkin.Cシステムサウンド.r最後に再生した排他システムサウンド.t停止する();\r
178                                         }\r
179                                         this.sd読み込み音.t再生を開始する();\r
180                                         this.nBGM再生開始時刻 = CDTXMania.Timer.n現在時刻;\r
181                                         this.nBGMの総再生時間ms = this.sd読み込み音.n総演奏時間ms;\r
182                                 }\r
183                                 else\r
184                                 {\r
185                                         CDTXMania.Skin.sound曲読込開始音.t再生する();\r
186                                         this.nBGM再生開始時刻 = CDTXMania.Timer.n現在時刻;\r
187                                         this.nBGMの総再生時間ms = CDTXMania.Skin.sound曲読込開始音.n長さ・現在のサウンド;\r
188                                 }\r
189 //                              this.actFI.tフェードイン開始();                                                 // #27787 2012.3.10 yyagi 曲読み込み画面のフェードインの省略\r
190                                 base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;\r
191                                 base.b初めての進行描画 = false;\r
192 \r
193                                 nWAVcount = 1;\r
194                                 bitmapFilename = new Bitmap( 640, 24 );\r
195                                 graphicsFilename = Graphics.FromImage( bitmapFilename );\r
196                                 graphicsFilename.TextRenderingHint = TextRenderingHint.AntiAlias;\r
197                                 ftFilename = new Font( "MS PGothic", 24f, FontStyle.Bold, GraphicsUnit.Pixel );\r
198                         }\r
199                         //-----------------------------\r
200                         #endregion\r
201 \r
202                         #region [ 背景、音符+タイトル表示 ]\r
203                         //-----------------------------\r
204                         if( this.tx背景 != null )\r
205                                 this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );\r
206 \r
207                         if( this.b音符を表示する )\r
208                         {\r
209                                 int y = 480 - 45;\r
210                                 if( this.tx音符 != null )\r
211                                 {\r
212                                         this.tx音符.t2D描画( CDTXMania.app.Device, this.n音符の表示位置X, y );\r
213                                 }\r
214                                 if( this.txタイトル != null )\r
215                                 {\r
216                                         this.txタイトル.t2D描画( CDTXMania.app.Device, (int) ( 640 - ( this.txタイトル.sz画像サイズ.Width * this.txタイトル.vc拡大縮小倍率.X ) ), y );\r
217                                 }\r
218                         }\r
219                         //-----------------------------\r
220                         #endregion\r
221 \r
222                         switch( base.eフェーズID )\r
223                         {\r
224                                 case CStage.Eフェーズ.共通_フェードイン:\r
225 //                                      if( this.actFI.On進行描画() != 0 )                                  // #27787 2012.3.10 yyagi 曲読み込み画面のフェードインの省略\r
226                                                                                                                                                 // 必ず一度「CStaeg.Eフェーズ.共通_フェードイン」フェーズを経由させること。\r
227                                                                                                                                                 // さもないと、曲読み込みが完了するまで、曲読み込み画面が描画されない。\r
228                                                 base.eフェーズID = CStage.Eフェーズ.NOWLOADING_DTXファイルを読み込む;\r
229                                         return 0;\r
230 \r
231                                 case CStage.Eフェーズ.NOWLOADING_DTXファイルを読み込む:\r
232                                         {\r
233                                                 timeBeginLoad = DateTime.Now;\r
234                                                 TimeSpan span;\r
235                                                 str = null;\r
236                                                 if( !CDTXMania.bコンパクトモード )\r
237                                                         str = CDTXMania.stage選曲.r確定されたスコア.ファイル情報.ファイルの絶対パス;\r
238                                                 else\r
239                                                         str = CDTXMania.strコンパクトモードファイル;\r
240 \r
241                                                 CScoreIni ini = new CScoreIni( str + ".score.ini" );\r
242                                                 ini.t全演奏記録セクションの整合性をチェックし不整合があればリセットする();\r
243 \r
244                                                 if( ( CDTXMania.DTX != null ) && CDTXMania.DTX.b活性化してる )\r
245                                                         CDTXMania.DTX.On非活性化();\r
246 \r
247                                                 CDTXMania.DTX = new CDTX( str, false, ( (double) CDTXMania.ConfigIni.n演奏速度 ) / 20.0, ini.stファイル.BGMAdjust );\r
248                                                 Trace.TraceInformation( "----曲情報-----------------" );\r
249                                                 Trace.TraceInformation( "TITLE: {0}", CDTXMania.DTX.TITLE );\r
250                                                 Trace.TraceInformation( "FILE: {0}",  CDTXMania.DTX.strファイル名の絶対パス );\r
251                                                 Trace.TraceInformation( "---------------------------" );\r
252 \r
253                                                 span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
254                                                 Trace.TraceInformation( "DTX読込所要時間:           {0}", span.ToString() );\r
255 \r
256                                                 if ( CDTXMania.bコンパクトモード )\r
257                                                         CDTXMania.DTX.MIDIレベル = 1;\r
258                                                 else\r
259                                                         CDTXMania.DTX.MIDIレベル = ( CDTXMania.stage選曲.r確定された曲.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) ? CDTXMania.stage選曲.n現在選択中の曲の難易度 : 0;\r
260 \r
261                                                 base.eフェーズID = CStage.Eフェーズ.NOWLOADING_WAVファイルを読み込む;\r
262                                                 timeBeginLoadWAV = DateTime.Now;\r
263                                                 return 0;\r
264                                         }\r
265 \r
266                                 case CStage.Eフェーズ.NOWLOADING_WAVファイルを読み込む:\r
267                                         {\r
268                                                 if ( nWAVcount == 1 && CDTXMania.DTX.listWAV.Count > 0 )                        // #28934 2012.7.7 yyagi (added checking Count)\r
269                                                 {\r
270                                                         ShowProgressByFilename( CDTXMania.DTX.listWAV[ nWAVcount ].strファイル名 );\r
271                                                 }\r
272                                                 int looptime = (CDTXMania.ConfigIni.b垂直帰線待ちを行う)? 3 : 1;       // VSyncWait=ON時は1frame(1/60s)あたり3つ読むようにする\r
273                                                 for ( int i = 0; i < looptime && nWAVcount <= CDTXMania.DTX.listWAV.Count; i++ )\r
274                                                 {\r
275                                                         if ( CDTXMania.DTX.listWAV[ nWAVcount ].listこのWAVを使用するチャンネル番号の集合.Count > 0 )  // #28674 2012.5.8 yyagi\r
276                                                         {\r
277                                                                 CDTXMania.DTX.tWAVの読み込み( CDTXMania.DTX.listWAV[ nWAVcount ] );\r
278                                                         }\r
279                                                         nWAVcount++;\r
280                                                 }\r
281                                                 if ( nWAVcount <= CDTXMania.DTX.listWAV.Count )\r
282                                                 {\r
283                                                         ShowProgressByFilename( CDTXMania.DTX.listWAV[ nWAVcount ].strファイル名 );\r
284                                                 }\r
285                                                 if ( nWAVcount > CDTXMania.DTX.listWAV.Count )\r
286                                                 {\r
287                                                         TimeSpan span = ( TimeSpan ) ( DateTime.Now - timeBeginLoadWAV );\r
288                                                         Trace.TraceInformation( "WAV読込所要時間({0,4}):     {1}", CDTXMania.DTX.listWAV.Count, span.ToString() );\r
289 \r
290                                                         CDTXMania.DTX.tギターとベースのランダム化( E楽器パート.GUITAR, CDTXMania.ConfigIni.eRandom.Guitar );\r
291                                                         CDTXMania.DTX.tギターとベースのランダム化( E楽器パート.BASS, CDTXMania.ConfigIni.eRandom.Bass );\r
292 \r
293                                                         if ( CDTXMania.ConfigIni.bギタレボモード )\r
294                                                                 CDTXMania.stage演奏ギター画面.On活性化();\r
295                                                         else\r
296                                                                 CDTXMania.stage演奏ドラム画面.On活性化();\r
297 \r
298                                                         base.eフェーズID = CStage.Eフェーズ.NOWLOADING_BMPファイルを読み込む;\r
299                                                 }\r
300                                                 return 0;\r
301                                         }\r
302 \r
303                                 case CStage.Eフェーズ.NOWLOADING_BMPファイルを読み込む:\r
304                                         {\r
305                                                 TimeSpan span;\r
306                                                 DateTime timeBeginLoadBMPAVI = DateTime.Now;\r
307                                                 if ( CDTXMania.ConfigIni.bBGA有効 )\r
308                                                         CDTXMania.DTX.tBMP_BMPTEXの読み込み();\r
309 \r
310                                                 if ( CDTXMania.ConfigIni.bAVI有効 )\r
311                                                         CDTXMania.DTX.tAVIの読み込み();\r
312                                                 span = ( TimeSpan ) ( DateTime.Now - timeBeginLoadBMPAVI );\r
313                                                 Trace.TraceInformation( "BMP/AVI読込所要時間({0,4}): {1}", ( CDTXMania.DTX.listBMP.Count + CDTXMania.DTX.listBMPTEX.Count + CDTXMania.DTX.listAVI.Count ), span.ToString() );\r
314 \r
315                                                 span = ( TimeSpan ) ( DateTime.Now - timeBeginLoad );\r
316                                                 Trace.TraceInformation( "総読込時間:                {0}", span.ToString() );\r
317 \r
318                                                 if ( bitmapFilename != null )\r
319                                                 {\r
320                                                         bitmapFilename.Dispose();\r
321                                                         bitmapFilename = null;\r
322                                                 }\r
323                                                 if ( graphicsFilename != null )\r
324                                                 {\r
325                                                         graphicsFilename.Dispose();\r
326                                                         graphicsFilename = null;\r
327                                                 }\r
328                                                 if ( ftFilename != null )\r
329                                                 {\r
330                                                         ftFilename.Dispose();\r
331                                                         ftFilename = null;\r
332                                                 }\r
333                                                 CDTXMania.Timer.t更新();\r
334                                                 base.eフェーズID = CStage.Eフェーズ.NOWLOADING_システムサウンドBGMの完了を待つ;\r
335                                                 return 0;\r
336                                         }\r
337 \r
338                                 case CStage.Eフェーズ.NOWLOADING_システムサウンドBGMの完了を待つ:\r
339                                         {\r
340                                                 long nCurrentTime = CDTXMania.Timer.n現在時刻;\r
341                                                 if( nCurrentTime < this.nBGM再生開始時刻 )\r
342                                                         this.nBGM再生開始時刻 = nCurrentTime;\r
343 \r
344 //                                              if ( ( nCurrentTime - this.nBGM再生開始時刻 ) > ( this.nBGMの総再生時間ms - 1000 ) )\r
345                                                 if ( ( nCurrentTime - this.nBGM再生開始時刻 ) > ( this.nBGMの総再生時間ms ) )       // #27787 2012.3.10 yyagi 1000ms == フェードイン分の時間\r
346                                                 {\r
347                                                         this.actFO.tフェードアウト開始();\r
348                                                         base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
349                                                 }\r
350                                                 return 0;\r
351                                         }\r
352 \r
353                                 case CStage.Eフェーズ.共通_フェードアウト:\r
354                                         if( this.actFO.On進行描画() == 0 )\r
355                                                 return 0;\r
356                                         if ( txFilename != null )\r
357                                         {\r
358                                                 txFilename.Dispose();\r
359                                         }\r
360                                         return 1;\r
361                         }\r
362                         return 0;\r
363                 }\r
364 \r
365                 private void ShowProgressByFilename(string strファイル名 )\r
366                 {\r
367                         if ( graphicsFilename != null && ftFilename != null )\r
368                         {\r
369                                 graphicsFilename.Clear( Color.Transparent );\r
370                                 graphicsFilename.DrawString( strファイル名, ftFilename, Brushes.White, new RectangleF( 0, 0, 640, 24 ) );\r
371                                 if ( txFilename != null )\r
372                                 {\r
373                                         txFilename.Dispose();\r
374                                 }\r
375                                 txFilename = new CTexture( CDTXMania.app.Device, bitmapFilename, CDTXMania.TextureFormat );\r
376                                 txFilename.vc拡大縮小倍率 = new Vector3( 0.5f, 0.5f, 1f );\r
377                                 txFilename.t2D描画( CDTXMania.app.Device, 0, 480 - 16 );\r
378                         }\r
379                 }\r
380 \r
381                 // その他\r
382 \r
383                 #region [ private ]\r
384                 //-----------------\r
385 //              private CActFIFOBlack actFI;\r
386                 private CActFIFOBlack actFO;\r
387                 private bool b音符を表示する;\r
388                 private Font ftタイトル表示用フォント;\r
389                 private long nBGMの総再生時間ms;\r
390                 private long nBGM再生開始時刻;\r
391                 private int n音符の表示位置X;\r
392                 private CSound sd読み込み音;\r
393                 private string strSTAGEFILE;\r
394                 private string str曲タイトル;\r
395                 private CTexture txタイトル;\r
396                 private CTexture tx音符;\r
397                 private CTexture tx背景;\r
398                 private DateTime timeBeginLoad;\r
399                 private DateTime timeBeginLoadWAV;\r
400                 private int nWAVcount;\r
401                 private CTexture txFilename;\r
402                 private Bitmap bitmapFilename;\r
403                 private Graphics graphicsFilename;\r
404                 private Font ftFilename;\r
405                 //-----------------\r
406                 #endregion\r
407         }\r
408 }\r