Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/DTXManiaプロジェクト/コード/ステージ/05.選曲/CActSelect曲リスト.cs

Parent Directory Parent Directory | Revision Log Revision Log


Revision 351 - (show annotations) (download)
Fri Feb 21 06:41:44 2014 UTC (10 years, 1 month ago) by ron1120
File size: 128278 byte(s)
#xxxxx XG版にて選曲中のフォルダ内の曲数表示。
#xxxxx 不要ファイルの削除。
#xxxxx プレイ中、リバース時に判定ラインを上げ下げすると不具合が起こるため、リバース時は判定ラインの操作ができないように変更。
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Globalization;
5 using System.Runtime.InteropServices;
6 using System.Drawing;
7 using System.Drawing.Imaging;
8 using System.Diagnostics;
9 using System.Drawing.Text;
10 using System.IO;
11 using SlimDX;
12 using FDK;
13
14 namespace DTXMania
15 {
16 //ここをXG風にする際に使ったコードはSSTから拝借、改造している。
17 internal class CActSelect曲リスト : CActivity
18 {
19
20 // プロパティ
21
22 public bool bIsEnumeratingSongs
23 {
24 get;
25 set;
26 }
27 public bool bスクロル中
28 {
29 get
30 {
31 if( this.n目標のスクロルカウンタ == 0 )
32 {
33 return ( this.n現在のスクロルカウンタ != 0 );
34 }
35 return true;
36 }
37 }
38 public int n現在のアンカ難易度レベル
39 {
40 get;
41 private set;
42 }
43 public int n現在選択中の曲の現在の難易度レベル
44 {
45 get
46 {
47 return this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( this.r現在選択中の曲 );
48 }
49 }
50 public Cスコア r現在選択中のスコア
51 {
52 get
53 {
54 if( this.r現在選択中の曲 != null )
55 {
56 return this.r現在選択中の曲.arスコア[ this.n現在選択中の曲の現在の難易度レベル ];
57 }
58 return null;
59 }
60 }
61 public C曲リストノ r現在選択中の曲
62 {
63 get;
64 private set;
65 }
66
67 public int nスクロルバ相対y座標
68 {
69 get;
70 private set;
71 }
72
73 // t選択曲が変更された()内で使う、直前の選曲の保持
74 // (前と同じ曲なら選択曲変更に掛かる再計算を省略して高速化するため)
75 private C曲リストノ song_last = null;
76
77
78 // コンストラクタ
79
80 public CActSelect曲リスト()
81 {
82 this.r現在選択中の曲 = null;
83 this.n現在のアンカ難易度レベル = 0;
84 base.b活性化してない = true;
85 this.bIsEnumeratingSongs = false;
86
87
88 this.stパネルマップ = null;
89 this.stパネルマップ = new STATUSPANEL[12]; // yyagi: 以下、手抜きの初期化でスマン
90 string[] labels = new string[12] {
91 "DTXMANIA", //0
92 "DEBUT", //1
93 "NOVICE", //2
94 "REGULAR", //3
95 "EXPERT", //4
96 "MASTER", //5
97 "BASIC", //6
98 "ADVANCED", //7
99 "EXTREME", //8
100 "RAW", //9
101 "RWS", //10
102 "REAL" //11
103 };
104 int[] status = new int[12] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
105
106 for (int i = 0; i < 12; i++)
107 {
108 this.stパネルマップ[i] = default(STATUSPANEL);
109 this.stパネルマップ[i].status = status[i];
110 this.stパネルマップ[i].label = labels[i];
111 }
112 }
113
114
115 // メソッド
116
117 public int n現在のアンカ難易度レベルに最も近い難易度レベルを返す( C曲リストノ song )
118 {
119 // 事前チェック。
120
121 if( song == null )
122 return this.n現在のアンカ難易度レベル; // 曲がまったくないよ
123
124 if( song.arスコア[ this.n現在のアンカ難易度レベル ] != null )
125 return this.n現在のアンカ難易度レベル; // 難易度ぴったりの曲があったよ
126
127 if( ( song.eド種別 == C曲リストノ.Eド種別.BOX ) || ( song.eド種別 == C曲リストノ.Eド種別.BACKBOX ) )
128 return 0; // BOX と BACKBOX は関係無いよ
129
130
131 // 現在のアンカレベルから、難易度上向きに検索開始。
132
133 int n最も近いレベル = this.n現在のアンカ難易度レベル;
134
135 for( int i = 0; i < 5; i++ )
136 {
137 if( song.arスコア[ n最も近いレベル ] != null )
138 break; // 曲があった。
139
140 n最も近いレベル = ( n最も近いレベル + 1 ) % 5; // 曲がなかったので次の難易度レベルへGo。(5以上になったら0に戻る。)
141 }
142
143
144 // 見つかった曲がアンカより下のレベルだった場合……
145 // アンカから下向きに検索すれば、もっとアンカに近い曲があるんじゃね?
146
147 if( n最も近いレベル < this.n現在のアンカ難易度レベル )
148 {
149 // 現在のアンカレベルから、難易度下向きに検索開始。
150
151 n最も近いレベル = this.n現在のアンカ難易度レベル;
152
153 for( int i = 0; i < 5; i++ )
154 {
155 if( song.arスコア[ n最も近いレベル ] != null )
156 break; // 曲があった。
157
158 n最も近いレベル = ( ( n最も近いレベル - 1 ) + 5 ) % 5; // 曲がなかったので次の難易度レベルへGo。(0未満になったら4に戻る。)
159 }
160 }
161
162 return n最も近いレベル;
163 }
164 public C曲リストノ r指定された曲が存在するリストの先頭の曲( C曲リストノ song )
165 {
166 List<C曲リストノ> songList = GetSongListWithinMe( song );
167 return ( songList == null ) ? null : songList[ 0 ];
168 }
169 public C曲リストノ r指定された曲が存在するリストの末尾の曲( C曲リストノ song )
170 {
171 List<C曲リストノ> songList = GetSongListWithinMe( song );
172 return ( songList == null ) ? null : songList[ songList.Count - 1 ];
173 }
174
175 private List<C曲リストノ> GetSongListWithinMe( C曲リストノ song )
176 {
177 if ( song.r親ノ == null ) // root階層のノートだったら
178 {
179 return CDTXMania.Songs管理.list曲ル; // rootのリストを返す
180 }
181 else
182 {
183 if ( ( song.r親ノ.list子リスト != null ) && ( song.r親ノ.list子リスト.Count > 0 ) )
184 {
185 return song.r親ノ.list子リスト;
186 }
187 else
188 {
189 return null;
190 }
191 }
192 }
193
194
195 public delegate void DGSortFunc( List<C曲リストノ> songList, E楽器パ eInst, int order, params object[] p);
196 /// <summary>
197 /// 主にCSong管理.cs内にあるソート機能を、delegateで呼び出す。
198 /// </summary>
199 /// <param name="sf">ソート用に呼び出すメソッド</param>
200 /// <param name="eInst">ソート基準とする楽器</param>
201 /// <param name="order">-1=降順, 1=昇順</param>
202 public void t曲リストのソ( DGSortFunc sf, E楽器パ eInst, int order, params object[] p )
203 {
204 List<C曲リストノ> songList = GetSongListWithinMe( this.r現在選択中の曲 );
205 if ( songList == null )
206 {
207 // 何もしない;
208 }
209 else
210 {
211 // CDTXMania.Songs管理.t曲リストのソート3_演奏回数の多い順( songList, eInst, order );
212 sf( songList, eInst, order, p );
213 // this.r現在選択中の曲 = CDTXMania
214 this.t現在選択中の曲を元に曲バを再構成する();
215 }
216 }
217
218 public bool tBOXに入る()
219 {
220 //Trace.TraceInformation( "box enter" );
221 //Trace.TraceInformation( "Skin現在Current : " + CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) );
222 //Trace.TraceInformation( "Skin現在System : " + CSkin.strSystemSkinSubfolderFullName );
223 //Trace.TraceInformation( "Skin現在BoxDef : " + CSkin.strBoxDefSkinSubfolderFullName );
224 //Trace.TraceInformation( "Skin現在: " + CSkin.GetSkinName( CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) ) );
225 //Trace.TraceInformation( "Skin現pt: " + CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) );
226 //Trace.TraceInformation( "Skin指定: " + CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath ) );
227 //Trace.TraceInformation( "Skinpath: " + this.r現在選択中の曲.strSkinPath );
228 bool ret = false;
229 if ( CSkin.GetSkinName( CDTXMania.Skin.GetCurrentSkinSubfolderFullName( false ) ) != CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath )
230 && CSkin.bUseBoxDefSkin )
231 {
232 ret = true;
233 // BOXに入るときは、スキン変更発生時のみboxdefスキン設定の更新を行う
234 CDTXMania.Skin.SetCurrentSkinSubfolderFullName(
235 CDTXMania.Skin.GetSkinSubfolderFullNameFromSkinName( CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath ) ), false );
236 }
237
238 //Trace.TraceInformation( "Skin変更: " + CSkin.GetSkinName( CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) ) );
239 //Trace.TraceInformation( "Skin変更Current : "+ CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) );
240 //Trace.TraceInformation( "Skin変更System : "+ CSkin.strSystemSkinSubfolderFullName );
241 //Trace.TraceInformation( "Skin変更BoxDef : "+ CSkin.strBoxDefSkinSubfolderFullName );
242 if( this.tx選択されている曲の曲名 != null )
243 {
244 this.tx選択されている曲の曲名.Dispose();
245 this.tx選択されている曲の曲名 = null;
246 }
247 if( this.tx選択されている曲のアティスト名 != null )
248 {
249 this.tx選択されている曲のアティスト名.Dispose();
250 this.tx選択されている曲のアティスト名 = null;
251 }
252 if( ( this.r現在選択中の曲.list子リスト != null ) && ( this.r現在選択中の曲.list子リスト.Count > 0 ) )
253 {
254 this.r現在選択中の曲 = this.r現在選択中の曲.list子リスト[ 0 ];
255 this.t現在選択中の曲を元に曲バを再構成する();
256 this.t選択曲が変更された(false); // #27648 項目数変更を反映させる
257 }
258 return ret;
259 }
260 public bool tBOXを出る()
261 {
262 //Trace.TraceInformation( "box exit" );
263 //Trace.TraceInformation( "Skin現在Current : " + CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) );
264 //Trace.TraceInformation( "Skin現在System : " + CSkin.strSystemSkinSubfolderFullName );
265 //Trace.TraceInformation( "Skin現在BoxDef : " + CSkin.strBoxDefSkinSubfolderFullName );
266 //Trace.TraceInformation( "Skin現在: " + CSkin.GetSkinName( CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) ) );
267 //Trace.TraceInformation( "Skin現pt: " + CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) );
268 //Trace.TraceInformation( "Skin指定: " + CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath ) );
269 //Trace.TraceInformation( "Skinpath: " + this.r現在選択中の曲.strSkinPath );
270 bool ret = false;
271 if ( CSkin.GetSkinName( CDTXMania.Skin.GetCurrentSkinSubfolderFullName( false ) ) != CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath )
272 && CSkin.bUseBoxDefSkin )
273 {
274 ret = true;
275 }
276 // スキン変更が発生しなくても、boxdef圏外に出る場合は、boxdefスキン設定の更新が必要
277 // (ユーザーがboxdefスキンをConfig指定している場合への対応のために必要)
278 // tBoxに入る()とは処理が微妙に異なるので注意
279 CDTXMania.Skin.SetCurrentSkinSubfolderFullName(
280 ( this.r現在選択中の曲.strSkinPath == "" ) ? "" : CDTXMania.Skin.GetSkinSubfolderFullNameFromSkinName( CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath ) ), false );
281 //Trace.TraceInformation( "SKIN変更: " + CSkin.GetSkinName( CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) ) );
282 //Trace.TraceInformation( "SKIN変更Current : "+ CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) );
283 //Trace.TraceInformation( "SKIN変更System : "+ CSkin.strSystemSkinSubfolderFullName );
284 //Trace.TraceInformation( "SKIN変更BoxDef : "+ CSkin.strBoxDefSkinSubfolderFullName );
285 if( this.tx選択されている曲の曲名 != null )
286 {
287 this.tx選択されている曲の曲名.Dispose();
288 this.tx選択されている曲の曲名 = null;
289 }
290 if( this.tx選択されている曲のアティスト名 != null )
291 {
292 this.tx選択されている曲のアティスト名.Dispose();
293 this.tx選択されている曲のアティスト名 = null;
294 }
295 if ( this.r現在選択中の曲.r親ノ != null )
296 {
297 this.r現在選択中の曲 = this.r現在選択中の曲.r親ノ;
298 this.t現在選択中の曲を元に曲バを再構成する();
299 this.t選択曲が変更された(false); // #27648 項目数変更を反映させる
300 }
301 return ret;
302 }
303 public void t現在選択中の曲を元に曲バを再構成する()
304 {
305 this.tの初期化();
306 for( int i = 0; i < 13; i++ )
307 {
308 this.t曲名バの生成( i, this.st情報[ i ].strタイトル文字列, this.st情報[ i ].col文字色 );
309 this.tティスト名テクスチャの生成( i, this.st情報[ i ].strティスト名 );
310 this.tパネルの生成( i, this.st情報[ i ].strタイトル文字列, this.st情報[ i ].strティスト名, this.st情報[ i ].col文字色 );
311 if( !this.dicThumbnail.ContainsKey( this.st情報[ i ].strDTXフォルダのパス ) )
312 {
313 //txTumbnail = this.tサムネイルテクスチャを作成する( Path.GetDirectoryName( song.ScoreFile ) );
314 this.tパスを指定してサムネイル画像を生成する( i, this.st情報[ i ].strDTXフォルダのパス, this.st情報[ i ].e種別 );
315 this.dicThumbnail.Add( this.st情報[ i ].strDTXフォルダのパス, this.txTumbnail[ i ] );
316 }
317 txTumbnail[ i ] = this.dicThumbnail[ this.st情報[ i ].strDTXフォルダのパス ];
318 }
319 }
320 public void t次に移動()
321 {
322 if( this.r現在選択中の曲 != null )
323 {
324 this.n目標のスクロルカウンタ += 100;
325 }
326 }
327 public void t前に移動()
328 {
329 if( this.r現在選択中の曲 != null )
330 {
331 this.n目標のスクロルカウンタ -= 100;
332 }
333 }
334 public void t難易度レベルをひとつ進める()
335 {
336 if( ( this.r現在選択中の曲 == null ) || ( this.r現在選択中の曲.nスコア数 <= 1 ) )
337 return; // 曲にスコアが0~1個しかないなら進める意味なし。
338
339
340 // 難易度レベルを+1し、現在選曲中のスコアを変更する。
341
342 this.n現在のアンカ難易度レベル = this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( this.r現在選択中の曲 );
343
344 for( int i = 0; i < 5; i++ )
345 {
346 this.n現在のアンカ難易度レベル = ( this.n現在のアンカ難易度レベル + 1 ) % 5; // 5以上になったら0に戻る。
347 if( this.r現在選択中の曲.arスコア[ this.n現在のアンカ難易度レベル ] != null ) // 曲が存在してるならここで終了。存在してないなら次のレベルへGo。
348 break;
349 }
350
351
352 // 曲毎に表示しているスキル値を、新しい難易度レベルに合わせて取得し直す。(表示されている13曲全部。)
353
354 C曲リストノ song = this.r現在選択中の曲;
355 for( int i = 0; i < 5; i++ )
356 song = this.r前の曲( song );
357
358 for( int i = this.n現在の選択行 - 5; i < ( ( this.n現在の選択行 - 5 ) + 13 ); i++ )
359 {
360 int index = ( i + 13 ) % 13;
361 for( int m = 0; m < 3; m++ )
362 {
363 this.st情報[ index ].nスキル値[ m ] = (int) song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.最大スキル[ m ];
364 }
365 song = this.r次の曲( song );
366 }
367
368 this.tラベル名からステタスパネルを決定する( this.r現在選択中の曲.ar難易度ラベル[ this.n現在選択中の曲の現在の難易度レベル ] );
369
370 switch( this.nIndex )
371 {
372 case 2:
373 CDTXMania.Skin.soundNovice.t再生する();
374 string strnov = CSkin.Path( @"Sounds\Novice.ogg" );
375 if( !File.Exists( strnov ) )
376 CDTXMania.Skin.sound変更音.t再生する();
377 break;
378
379 case 3:
380 CDTXMania.Skin.soundRegular.t再生する();
381 string strreg = CSkin.Path( @"Sounds\Regular.ogg" );
382 if( !File.Exists( strreg ) )
383 CDTXMania.Skin.sound変更音.t再生する();
384 break;
385
386 case 4:
387 CDTXMania.Skin.soundExpert.t再生する();
388 string strexp = CSkin.Path( @"Sounds\Expert.ogg" );
389 if( !File.Exists( strexp ) )
390 CDTXMania.Skin.sound変更音.t再生する();
391 break;
392
393 case 5:
394 CDTXMania.Skin.soundMaster.t再生する();
395 string strmas = CSkin.Path( @"Sounds\Master.ogg" );
396 if( !File.Exists( strmas ) )
397 CDTXMania.Skin.sound変更音.t再生する();
398 break;
399
400 case 6:
401 CDTXMania.Skin.soundBasic.t再生する();
402 string strbsc = CSkin.Path( @"Sounds\Basic.ogg" );
403 if( !File.Exists( strbsc ) )
404 CDTXMania.Skin.sound変更音.t再生する();
405 break;
406
407 case 7:
408 CDTXMania.Skin.soundAdvanced.t再生する();
409 string stradv = CSkin.Path( @"Sounds\Advanced.ogg" );
410 if( !File.Exists( stradv ) )
411 CDTXMania.Skin.sound変更音.t再生する();
412 break;
413
414 case 8:
415 CDTXMania.Skin.soundExtreme.t再生する();
416 string strext = CSkin.Path( @"Sounds\Extreme.ogg" );
417 if( !File.Exists( strext ) )
418 CDTXMania.Skin.sound変更音.t再生する();
419 break;
420
421 default:
422 CDTXMania.Skin.sound変更音.t再生する();
423 break;
424 }
425
426 // 選曲ステージに変更通知を発出し、関係Activityの対応を行ってもらう。
427
428 CDTXMania.stage選曲.t選択曲変更通知();
429 }
430
431
432 public void tラベル名からステタスパネルを決定する(string strラベル名)
433 {
434 if (string.IsNullOrEmpty(strラベル名))
435 {
436 this.nIndex = 0;
437 }
438 else
439 {
440 STATUSPANEL[] array = this.stパネルマップ;
441 for (int i = 0; i < array.Length; i++)
442 {
443 STATUSPANEL sTATUSPANEL = array[i];
444 if (strラベル名.Equals(sTATUSPANEL.label, StringComparison.CurrentCultureIgnoreCase))
445 {
446 this.nIndex = sTATUSPANEL.status;
447 return;
448 }
449 this.nIndex++;
450 }
451 }
452 }
453
454 /// <summary>
455 /// 曲リストをリセットする
456 /// </summary>
457 /// <param name="cs"></param>
458 public void Refresh(CSongs管理 cs, bool bRemakeSongTitleBar ) // #26070 2012.2.28 yyagi
459 {
460 // this.On非活性化();
461
462 if ( cs != null && cs.list曲ル.Count > 0 ) // 新しい曲リストを検索して、1曲以上あった
463 {
464 CDTXMania.Songs管理 = cs;
465
466 if ( this.r現在選択中の曲 != null ) // r現在選択中の曲==null とは、「最初songlist.dbが無かった or 検索したが1曲もない」
467 {
468 this.r現在選択中の曲 = searchCurrentBreadcrumbsPosition( CDTXMania.Songs管理.list曲ル, this.r現在選択中の曲.strBreadcrumbs );
469 if ( bRemakeSongTitleBar ) // 選曲画面以外に居るときには再構成しない (非活性化しているときに実行すると例外となる)
470 {
471 this.t現在選択中の曲を元に曲バを再構成する();
472 }
473 #if false // list子リストの中まではmatchしてくれないので、検索ロジックは手書きで実装 (searchCurrentBreadcrumbs())
474 string bc = this.r現在選択中の曲.strBreadcrumbs;
475 Predicate<C曲リストノ> match = delegate( C曲リストノ c )
476 {
477 return ( c.strBreadcrumbs.Equals( bc ) );
478 };
479 int nMatched = CDTXMania.Songs管理.list曲ル.FindIndex( match );
480
481 this.r現在選択中の曲 = ( nMatched == -1 ) ? null : CDTXMania.Songs管理.list曲ル[ nMatched ];
482 this.t現在選択中の曲を元に曲バを再構成する();
483 #endif
484 return;
485 }
486 }
487 this.On非活性化();
488 this.r現在選択中の曲 = null;
489 this.On活性化();
490 }
491
492
493 /// <summary>
494 /// 現在選曲している位置を検索する
495 /// (曲一覧クラスを新しいものに入れ替える際に用いる)
496 /// </summary>
497 /// <param name="ln">検索対象のList</param>
498 /// <param name="bc">検索するパンくずリスト(文字列)</param>
499 /// <returns></returns>
500 private C曲リストノ searchCurrentBreadcrumbsPosition( List<C曲リストノ> ln, string bc )
501 {
502 foreach (C曲リストノ n in ln)
503 {
504 if ( n.strBreadcrumbs == bc )
505 {
506 return n;
507 }
508 else if ( n.list子リスト != null && n.list子リスト.Count > 0 ) // 子リストが存在するなら、再帰で探す
509 {
510 C曲リストノ r = searchCurrentBreadcrumbsPosition( n.list子リスト, bc );
511 if ( r != null ) return r;
512 }
513 }
514 return null;
515 }
516
517 /// <summary>
518 /// BOXのアイテム数と、今何番目を選択しているかをセットする
519 /// </summary>
520 public void t選択曲が変更された( bool bForce ) // #27648
521 {
522 C曲リストノ song = CDTXMania.stage選曲.r現在選択中の曲;
523 if ( song == null )
524 return;
525 if ( song == song_last && bForce == false )
526 return;
527
528 song_last = song;
529 List<C曲リストノ> list = ( song.r親ノ != null ) ? song.r親ノ.list子リスト : CDTXMania.Songs管理.list曲ル;
530 int index = list.IndexOf( song ) + 1;
531 if ( index <= 0 )
532 {
533 nCurrentPosition = nNumOfItems = 0;
534 }
535 else
536 {
537 nCurrentPosition = index;
538 nNumOfItems = list.Count;
539 }
540
541 if( this.tx選択されている曲の曲名 != null )
542 {
543 this.tx選択されている曲の曲名.Dispose();
544 this.tx選択されている曲の曲名 = null;
545 }
546 if( this.tx選択されている曲のアティスト名 != null )
547 {
548 this.tx選択されている曲のアティスト名.Dispose();
549 this.tx選択されている曲のアティスト名 = null;
550 }
551 }
552
553 // CActivity 実装
554
555 public override void On活性化()
556 {
557 if( this.b活性化してる )
558 return;
559
560 this.e楽器パ = E楽器パ.DRUMS;
561 this.b登場アニメ全部完了 = false;
562 this.n目標のスクロルカウンタ = 0;
563 this.n現在のスクロルカウンタ = 0;
564 this.nスクロルタイマ = -1;
565
566 // フォント作成。
567 // 曲リスト文字は2倍(面積4倍)でテクスチャに描画してから縮小表示するので、フォントサイズは2倍とする。
568
569 FontStyle regular = FontStyle.Regular;
570 if( CDTXMania.ConfigIni.b選曲リストフォントを斜体にする ) regular |= FontStyle.Italic;
571 if( CDTXMania.ConfigIni.b選曲リストフォントを太字にする ) regular |= FontStyle.Bold;
572 this.ft曲リスト用フォント = new Font( CDTXMania.ConfigIni.str選曲リストフォント, (float) ( CDTXMania.ConfigIni.n選曲リストフォントのサイズdot * 2 ), regular, GraphicsUnit.Pixel );
573 //this.prvFont = new CPrivateFont( new FontFamily( CDTXMania.ConfigIni.str選曲リストフォント ), 28, FontStyle.Regular );
574
575 // 現在選択中の曲がない(=はじめての活性化)なら、現在選択中の曲をルートの先頭ノードに設定する。
576
577 if( ( this.r現在選択中の曲 == null ) && ( CDTXMania.Songs管理.list曲ル.Count > 0 ) )
578 this.r現在選択中の曲 = CDTXMania.Songs管理.list曲ル[ 0 ];
579
580
581 // バー情報を初期化する。
582
583 this.tの初期化();
584
585 base.On活性化();
586
587 this.t選択曲が変更された(true); // #27648 2012.3.31 yyagi 選曲画面に入った直後の 現在位置/全アイテム数 の表示を正しく行うため
588 }
589 public override void On非活性化()
590 {
591 if( this.b活性化してない )
592 return;
593
594 CDTXMania.t安全にDisposeする( ref this.ft曲リスト用フォント );
595 if( this.prvFont != null )
596 this.prvFont.Dispose();
597
598 for( int i = 0; i < 13; i++ )
599 this.ct登場アニメ用[ i ] = null;
600
601 base.On非活性化();
602 }
603 public override void OnManagedリソスの作成()
604 {
605 if( this.b活性化してない )
606 return;
607
608 this.tx曲名バ.Score = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_bar score.png" ), false );
609 this.tx曲名バ.Box = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_bar box.png" ), false );
610 this.tx曲名バ.Other = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_bar other.png" ), false );
611 this.tx選曲バ.Score = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_bar score selected.png" ), false );
612 this.tx選曲バ.Box = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_bar box selected.png" ), false );
613 this.tx選曲バ.Other = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_bar other selected.png" ), false );
614 this.txスキル数字 = CDTXMania.tテクスチャの生成( CSkin.Path(@"Graphics\ScreenSelect skill number on list.png" ), false );
615 this.tx選曲パネル = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_image_panel_guitar.png"));
616
617 if ( this.tx選曲パネル == null || CDTXMania.ConfigIni.bDrums有効 )
618 this.tx選曲パネル = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_image_panel.png"));
619
620 this.txパネル = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_music panel.png"));
621 //this.txジャケットボックスクローズ = CDTXMania.tテクスチャの生成( CSkin.Path(@"Graphics\5_preimage backbox.png") );
622 //this.txジャケットランダム = CDTXMania.tテクスチャの生成( CSkin.Path(@"Graphics\5_preimage random.png") );
623 this.tx = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_backpanel.png" ) );
624 this.tx色帯 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_ColorBar.png" ) );
625 this.txランプ用帯 = CDTXMania.tテクスチャの生成( CSkin.Path(@"Graphics\5_lamppanel.png" ));
626
627 this.txクリアランプ = CDTXMania.tテクスチャの生成( CSkin.Path(@"Graphics\5_Clearlamp.png") );
628 #region[ テクスチャの復元 ]
629 int nKeys = this.dicThumbnail.Count;
630 string[] keys = new string[ nKeys ];
631 this.dicThumbnail.Keys.CopyTo( keys, 0 );
632 foreach (var key in keys)
633 this.dicThumbnail[ key ] = this.tパスを指定してサムネイル画像を生成して返す( 0, key, this.st情報[ 0 ].e種別 );;
634
635 //ここは最初に表示される画像の復元に必要。
636 for (int i = 0; i < 13; i++)
637 {
638 this.t曲名バの生成(i, this.st情報[i].strタイトル文字列, this.st情報[i].col文字色);
639 this.tティスト名テクスチャの生成( i, this.st情報[ i ].strティスト名 );
640 this.tパネルの生成( i, this.st情報[ i ].strタイトル文字列, this.st情報[ i ].strティスト名, this.st情報[ i ].col文字色 );
641 //this.tパスを指定してサムネイル画像を生成する(i, this.stバー情報[i].strDTXフォルダのパス, this.stバー情報[i].eバー種別);
642 if( this.st情報[ i ].strDTXフォルダのパス != null )
643 {
644 if( !this.dicThumbnail.ContainsKey( this.st情報[ i ].strDTXフォルダのパス ) )
645 {
646 //txTumbnail = this.tサムネイルテクスチャを作成する( Path.GetDirectoryName( song.ScoreFile ) );
647 this.tパスを指定してサムネイル画像を生成する( i, this.st情報[ i ].strDTXフォルダのパス, this.st情報[ i ].e種別 );
648 this.dicThumbnail.Add( this.st情報[ i ].strDTXフォルダのパス, this.txTumbnail[ i ] );
649 }
650 txTumbnail[ i ] = this.dicThumbnail[ this.st情報[ i ].strDTXフォルダのパス ];
651 }
652 }
653 #endregion
654
655
656 int c = ( CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja" ) ? 0 : 1;
657 #region [ Songs not found画像 ]
658 try
659 {
660 using( Bitmap image = new Bitmap( 640, 128 ) )
661 using( Graphics graphics = Graphics.FromImage( image ) )
662 {
663 string[] s1 = { "曲データが見つかりません。", "Songs not found." };
664 string[] s2 = { "曲データをDTXManiaGR.exe以下の", "You need to install songs." };
665 string[] s3 = { "フォルダにインストールして下さい。", "" };
666 graphics.DrawString( s1[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float) 2f, (float) 2f );
667 graphics.DrawString( s1[c], this.ft曲リスト用フォント, Brushes.White, (float) 0f, (float) 0f );
668 graphics.DrawString( s2[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float) 2f, (float) 44f );
669 graphics.DrawString( s2[c], this.ft曲リスト用フォント, Brushes.White, (float) 0f, (float) 42f );
670 graphics.DrawString( s3[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float) 2f, (float) 86f );
671 graphics.DrawString( s3[c], this.ft曲リスト用フォント, Brushes.White, (float) 0f, (float) 84f );
672
673 this.txSongNotFound = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );
674
675 this.txSongNotFound.vc拡大縮小倍率 = new Vector3( 0.5f, 0.5f, 1f ); // 半分のサイズで表示する。
676 }
677 }
678 catch( CTextureCreateFailedException )
679 {
680 Trace.TraceError( "SoungNotFoundテクスチャの作成に失敗しました。" );
681 this.txSongNotFound = null;
682 }
683 #endregion
684 #region [ "曲データを検索しています"画像 ]
685 try
686 {
687 using ( Bitmap image = new Bitmap( 640, 96 ) )
688 using ( Graphics graphics = Graphics.FromImage( image ) )
689 {
690 string[] s1 = { "曲データを検索しています。", "Now enumerating songs." };
691 string[] s2 = { "そのまましばらくお待ち下さい。", "Please wait..." };
692 graphics.DrawString( s1[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float) 2f, (float) 2f );
693 graphics.DrawString( s1[c], this.ft曲リスト用フォント, Brushes.White, (float) 0f, (float) 0f );
694 graphics.DrawString( s2[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float) 2f, (float) 44f );
695 graphics.DrawString( s2[c], this.ft曲リスト用フォント, Brushes.White, (float) 0f, (float) 42f );
696
697 this.txEnumeratingSongs = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );
698
699 this.txEnumeratingSongs.vc拡大縮小倍率 = new Vector3( 0.5f, 0.5f, 1f ); // 半分のサイズで表示する。
700 }
701 }
702 catch ( CTextureCreateFailedException )
703 {
704 Trace.TraceError( "txEnumeratingSongsテクスチャの作成に失敗しました。" );
705 this.txEnumeratingSongs = null;
706 }
707 #endregion
708 #region [ 曲数表示 ]
709 this.txアイテム数数字 = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_skill number on gauge etc.png"), false);
710 #endregion
711
712 base.OnManagedリソスの作成();
713 }
714 public override void OnManagedリソスの解放()
715 {
716 if( this.b活性化してない )
717 return;
718
719 CDTXMania.t安全にDisposeする( ref this.txアイテム数数字 );
720
721 for ( int i = 0; i < 13; i++ )
722 {
723 CDTXMania.t安全にDisposeする( ref this.st情報[ i ].txタイトル名 );
724 CDTXMania.t安全にDisposeする( ref this.st情報[ i ].txティスト名 );
725 }
726
727 if( this.tx選択されている曲の曲名 != null )
728 {
729 this.tx選択されている曲の曲名.Dispose();
730 this.tx選択されている曲の曲名 = null;
731 }
732 if( this.tx選択されている曲のアティスト名 != null )
733 {
734 this.tx選択されている曲のアティスト名.Dispose();
735 this.tx選択されている曲のアティスト名 = null;
736 }
737 #region[ ジャケット画像の解放 ]
738 int nKeys = this.dicThumbnail.Count;
739 string[] keys = new string[ nKeys ];
740 this.dicThumbnail.Keys.CopyTo( keys, 0 );
741 foreach( var key in keys )
742 {
743 C共通.tDisposeする( this.dicThumbnail[ key ] );
744 this.dicThumbnail[ key ] = null;
745 }
746 #endregion
747
748 CDTXMania.t安全にDisposeする( ref this.txスキル数字 );
749 CDTXMania.t安全にDisposeする( ref this.txEnumeratingSongs );
750 CDTXMania.t安全にDisposeする( ref this.txSongNotFound );
751 CDTXMania.t安全にDisposeする( ref this.tx曲名バ.Score );
752 CDTXMania.t安全にDisposeする( ref this.tx曲名バ.Box );
753 CDTXMania.t安全にDisposeする( ref this.tx曲名バ.Other );
754 CDTXMania.t安全にDisposeする( ref this.tx選曲バ.Score );
755 CDTXMania.t安全にDisposeする( ref this.tx選曲バ.Box );
756 CDTXMania.t安全にDisposeする( ref this.tx選曲バ.Other );
757 CDTXMania.t安全にDisposeする( ref this.tx選曲パネル );
758 CDTXMania.t安全にDisposeする( ref this.txパネル );
759 CDTXMania.t安全にDisposeする( ref this.txクリアランプ );
760 //CDTXMania.t安全にDisposeする( ref this.txジャケットボックスクローズ );
761 //CDTXMania.t安全にDisposeする( ref this.txジャケットランダム );
762 CDTXMania.t安全にDisposeする( ref this.tx );
763 CDTXMania.t安全にDisposeする( ref this.tx色帯 );
764 CDTXMania.t安全にDisposeする( ref this.txランプ用帯 );
765
766 base.OnManagedリソスの解放();
767 }
768 public override int On進行描画()
769 {
770 if( this.b活性化してない )
771 return 0;
772
773 #region [ 初めての進行描画 ]
774 //-----------------
775 if( this.b初めての進行描画 )
776 {
777 for( int i = 0; i < 13; i++ )
778 this.ct登場アニメ用[ i ] = new CCounter( -i * 10, 100, 3, CDTXMania.Timer );
779
780 this.nスクロルタイマ = CSound管理.rc演奏用タイマ.n現在時刻;
781 CDTXMania.stage選曲.t選択曲変更通知();
782
783 base.b初めての進行描画 = false;
784 }
785 //-----------------
786 #endregion
787
788
789 // まだ選択中の曲が決まってなければ、曲ツリールートの最初の曲にセットする。
790
791 if( ( this.r現在選択中の曲 == null ) && ( CDTXMania.Songs管理.list曲ル.Count > 0 ) )
792 this.r現在選択中の曲 = CDTXMania.Songs管理.list曲ル[ 0 ];
793
794
795 // 本ステージは、(1)登場アニメフェーズ → (2)通常フェーズ と二段階にわけて進む。
796 // 2つしかフェーズがないので CStage.eフェーズID を使ってないところがまた本末転倒。
797
798
799 // 進行。
800
801 if( !this.b登場アニメ全部完了 )
802 {
803 #region [ (1) 登場アニメフェーズの進行。]
804 //-----------------
805 for( int i = 0; i < 13; i++ ) // パネルは全13枚。
806 {
807 this.ct登場アニメ用[ i ].t進行();
808
809 if( this.ct登場アニメ用[ i ].b終了値に達した )
810 this.ct登場アニメ用[ i ].t停止();
811 }
812
813 // 全部の進行が終わったら、this.b登場アニメ全部完了 を true にする。
814
815 this.b登場アニメ全部完了 = true;
816 for( int i = 0; i < 13; i++ ) // パネルは全13枚。
817 {
818 if( this.ct登場アニメ用[ i ].b進行中 )
819 {
820 this.b登場アニメ全部完了 = false; // まだ進行中のアニメがあるなら false のまま。
821 break;
822 }
823 }
824 //-----------------
825 #endregion
826 }
827 else
828 {
829 #region [ (2) 通常フェーズの進行。]
830 //-----------------
831 long n現在時刻 = CSound管理.rc演奏用タイマ.n現在時刻;
832
833 if( n現在時刻 < this.nスクロルタイマ ) // 念のため
834 this.nスクロルタイマ = n現在時刻;
835
836 const int nアニメ間隔 = 2;
837 while( ( n現在時刻 - this.nスクロルタイマ ) >= nアニメ間隔 )
838 {
839 int n加速度 = 1;
840 int n残距離 = Math.Abs( (int) ( this.n目標のスクロルカウンタ - this.n現在のスクロルカウンタ ) );
841
842 #region [ 残距離が遠いほどスクロールを速くする(=n加速度を多くする)。]
843 //-----------------
844 if( n残距離 <= 100 )
845 {
846 n加速度 = 2;
847 }
848 else if( n残距離 <= 300 )
849 {
850 n加速度 = 3;
851 }
852 else if( n残距離 <= 500 )
853 {
854 n加速度 = 4;
855 }
856 else
857 {
858 n加速度 = 8;
859 }
860 //-----------------
861 #endregion
862
863 #region [ 加速度を加算し、現在のスクロールカウンタを目標のスクロールカウンタまで近づける。 ]
864 //-----------------
865 if( this.n現在のスクロルカウンタ < this.n目標のスクロルカウンタ ) // (A) 正の方向に未達の場合:
866 {
867 this.n現在のスクロルカウンタ += n加速度; // カウンタを正方向に移動する。
868
869 if( this.n現在のスクロルカウンタ > this.n目標のスクロルカウンタ )
870 this.n現在のスクロルカウンタ = this.n目標のスクロルカウンタ; // 到着!スクロール停止!
871 }
872
873 else if( this.n現在のスクロルカウンタ > this.n目標のスクロルカウンタ ) // (B) 負の方向に未達の場合:
874 {
875 this.n現在のスクロルカウンタ -= n加速度; // カウンタを負方向に移動する。
876
877 if( this.n現在のスクロルカウンタ < this.n目標のスクロルカウンタ ) // 到着!スクロール停止!
878 this.n現在のスクロルカウンタ = this.n目標のスクロルカウンタ;
879 }
880 //-----------------
881 #endregion
882
883 if( this.n現在のスクロルカウンタ >= 100 ) // 1行=100カウント。
884 {
885 #region [ パネルを1行上にシフトする。]
886 //-----------------
887
888 // 選択曲と選択行を1つ下の行に移動。
889
890 this.r現在選択中の曲 = this.r次の曲( this.r現在選択中の曲 );
891 this.n現在の選択行 = ( this.n現在の選択行 + 1 ) % 13;
892
893 // 選択曲から7つ下のパネル(=新しく最下部に表示されるパネル。消えてしまう一番上のパネルを再利用する)に、新しい曲の情報を記載する。
894
895 C曲リストノ song = this.r現在選択中の曲;
896 for( int i = 0; i < 7; i++ )
897 song = this.r次の曲( song );
898
899 int index = ( this.n現在の選択行 + 7 ) % 13; // 新しく最下部に表示されるパネルのインデックス(0~12)。
900 this.st情報[ index ].strタイトル文字列 = song.strタイトル;
901 this.st情報[ index ].strティスト名 = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.ティスト名;
902 this.st情報[ index ].col文字色 = song.col文字色;
903 this.st情報[ index ].strDTXフォルダのパス = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].ファイル情報.フォルダの絶対パス + song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.Preimage;
904 this.t曲名バの生成( index, this.st情報[ index ].strタイトル文字列, this.st情報[ index ].col文字色 );
905 this.tティスト名テクスチャの生成( index, this.st情報[ index ].strティスト名 );
906 this.tパネルの生成( index, this.st情報[ index ].strタイトル文字列, this.st情報[ index ].strティスト名, this.st情報[ index ].col文字色 );
907
908 if( !this.dicThumbnail.ContainsKey( this.st情報[ index ].strDTXフォルダのパス ) )
909 {
910 //txTumbnail = this.tサムネイルテクスチャを作成する( Path.GetDirectoryName( song.ScoreFile ) );
911 this.tパスを指定してサムネイル画像を生成する( index, this.st情報[ index ].strDTXフォルダのパス, this.st情報[ index ].e種別 );
912 this.dicThumbnail.Add( this.st情報[ index ].strDTXフォルダのパス, this.txTumbnail[ index ] );
913 }
914 txTumbnail[ index ] = this.dicThumbnail[ this.st情報[ index ].strDTXフォルダのパス ];
915
916
917 // stバー情報[] の内容を1行ずつずらす。
918
919 C曲リストノ song2 = this.r現在選択中の曲;
920 for( int i = 0; i < 5; i++ )
921 song2 = this.r前の曲( song2 );
922
923 for( int i = 0; i < 13; i++ )
924 {
925 int n = ( ( ( this.n現在の選択行 - 5 ) + i ) + 13 ) % 13;
926 this.st情報[ n ].e種別 = this.e曲のバ種別を返す( song2 );
927 song2 = this.r次の曲( song2 );
928 }
929
930
931 // 新しく最下部に表示されるパネル用のスキル値を取得。
932
933 for( int i = 0; i < 3; i++ )
934 this.st情報[ index ].nスキル値[ i ] = (int) song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.最大スキル[ i ];
935
936 // 1行(100カウント)移動完了。
937
938 this.n現在のスクロルカウンタ -= 100;
939 this.n目標のスクロルカウンタ -= 100;
940
941 this.t選択曲が変更された( false ); // スクロールバー用に今何番目を選択しているかを更新
942 if( this.tx選択されている曲の曲名 != null )
943 {
944 this.tx選択されている曲の曲名.Dispose();
945 this.tx選択されている曲の曲名 = null;
946 }
947 if( this.tx選択されている曲のアティスト名 != null )
948 {
949 this.tx選択されている曲のアティスト名.Dispose();
950 this.tx選択されている曲のアティスト名 = null;
951 }
952
953 if( this.n目標のスクロルカウンタ == 0 )
954 CDTXMania.stage選曲.t選択曲変更通知(); // スクロール完了=選択曲変更!
955
956 //-----------------
957 #endregion
958 }
959 else if( this.n現在のスクロルカウンタ <= -100 )
960 {
961 #region [ パネルを1行下にシフトする。]
962 //-----------------
963
964 // 選択曲と選択行を1つ上の行に移動。
965
966 this.r現在選択中の曲 = this.r前の曲( this.r現在選択中の曲 );
967 this.n現在の選択行 = ( ( this.n現在の選択行 - 1 ) + 13 ) % 13;
968
969 // 選択曲から5つ上のパネル(=新しく最上部に表示されるパネル。消えてしまう一番下のパネルを再利用する)に、新しい曲の情報を記載する。
970
971 C曲リストノ song = this.r現在選択中の曲;
972 for( int i = 0; i < 5; i++ )
973 song = this.r前の曲( song );
974
975 int index = ( ( this.n現在の選択行 - 5 ) + 13 ) % 13; // 新しく最上部に表示されるパネルのインデックス(0~12)。
976 this.st情報[ index ].strタイトル文字列 = song.strタイトル;
977 this.st情報[ index ].strティスト名 = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song) ].譜面情報.ティスト名;
978 this.st情報[ index ].col文字色 = song.col文字色;
979 this.st情報[ index ].strDTXフォルダのパス = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].ファイル情報.フォルダの絶対パス + song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.Preimage;
980 this.t曲名バの生成( index, this.st情報[ index ].strタイトル文字列, this.st情報[ index ].col文字色 );
981 this.tティスト名テクスチャの生成( index, this.st情報[ index ].strティスト名 );
982 this.tパネルの生成( index, this.st情報[ index ].strタイトル文字列, this.st情報[ index ].strティスト名, this.st情報[ index ].col文字色 );
983
984 if( !this.dicThumbnail.ContainsKey( this.st情報[ index ].strDTXフォルダのパス ) )
985 {
986 //txTumbnail = this.tサムネイルテクスチャを作成する( Path.GetDirectoryName( song.ScoreFile ) );
987 this.tパスを指定してサムネイル画像を生成する( index, this.st情報[ index ].strDTXフォルダのパス, this.st情報[ index ].e種別 );
988 this.dicThumbnail.Add( this.st情報[ index ].strDTXフォルダのパス, this.txTumbnail[ index ] );
989 }
990 txTumbnail[ index ] = this.dicThumbnail[ this.st情報[ index ].strDTXフォルダのパス ];
991
992
993 // stバー情報[] の内容を1行ずつずらす。
994
995 C曲リストノ song2 = this.r現在選択中の曲;
996 for( int i = 0; i < 5; i++ )
997 song2 = this.r前の曲( song2 );
998
999 for( int i = 0; i < 13; i++ )
1000 {
1001 int n = ( ( ( this.n現在の選択行 - 5 ) + i ) + 13 ) % 13;
1002 this.st情報[ n ].e種別 = this.e曲のバ種別を返す( song2 );
1003 song2 = this.r次の曲( song2 );
1004 }
1005
1006
1007 // 新しく最上部に表示されるパネル用のスキル値を取得。
1008
1009 for( int i = 0; i < 3; i++ )
1010 this.st情報[ index ].nスキル値[ i ] = (int) song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.最大スキル[ i ];
1011
1012
1013 // 1行(100カウント)移動完了。
1014
1015 this.n現在のスクロルカウンタ += 100;
1016 this.n目標のスクロルカウンタ += 100;
1017
1018
1019 this.t選択曲が変更された( false ); // スクロールバー用に今何番目を選択しているかを更新
1020 if( this.tx選択されている曲の曲名 != null )
1021 {
1022 this.tx選択されている曲の曲名.Dispose();
1023 this.tx選択されている曲の曲名 = null;
1024 }
1025 if( this.tx選択されている曲のアティスト名 != null )
1026 {
1027 this.tx選択されている曲のアティスト名.Dispose();
1028 this.tx選択されている曲のアティスト名 = null;
1029 }
1030
1031 if( this.n目標のスクロルカウンタ == 0 )
1032 CDTXMania.stage選曲.t選択曲変更通知(); // スクロール完了=選択曲変更!
1033 //-----------------
1034 #endregion
1035 }
1036
1037 this.nスクロルタイマ += nアニメ間隔;
1038 }
1039 //-----------------
1040 #endregion
1041 }
1042
1043
1044 // 描画。
1045
1046 if( this.r現在選択中の曲 == null )
1047 {
1048 #region [ 曲が1つもないなら「Songs not found.」を表示してここで帰れ。]
1049 //-----------------
1050 if ( bIsEnumeratingSongs )
1051 {
1052 if ( this.txEnumeratingSongs != null )
1053 {
1054 this.txEnumeratingSongs.t2D描画( CDTXMania.app.Device, 530, 240 );
1055 }
1056 }
1057 else
1058 {
1059 if ( this.txSongNotFound != null )
1060 this.txSongNotFound.t2D描画( CDTXMania.app.Device, 500, 190 );
1061 }
1062 //-----------------
1063 #endregion
1064
1065 return 0;
1066 }
1067 var bar = SlimDX.Matrix.Identity;
1068 var barL = SlimDX.Matrix.Identity;
1069 bar *= SlimDX.Matrix.RotationY(-0.415f);
1070 barL *= SlimDX.Matrix.RotationY(0.415f);
1071 bar *= SlimDX.Matrix.Translation(540f, 20f, -24f);
1072 barL *= SlimDX.Matrix.Translation(-540f, 20f, -24f);
1073 bar *= SlimDX.Matrix.Scaling(1.0f, 0.65f, 1.0f);
1074 barL *= SlimDX.Matrix.Scaling(1.0f, 0.65f, 1.0f);
1075
1076 this.tx.t3D描画(CDTXMania.app.Device, bar); //右の帯。
1077 this.tx.t3D描画(CDTXMania.app.Device, barL); //右の帯。
1078 this.tx色帯.n透明度 = 155 + this.ct登場アニメ用[10].n現在の値;
1079 this.tx色帯.t3D描画( CDTXMania.app.Device, bar );
1080 this.tx色帯.t3D描画( CDTXMania.app.Device, barL );
1081
1082 #region [ デバッグ補助 ]
1083 //-----------------
1084 /*
1085 stマトリックス座標 = new ST中心点[] {
1086 new ST中心点() { x = -940.0000f, y = 4f, z = 320f, rotY = 0.4150f },
1087 new ST中心点() { x = -740.0000f, y = 4f, z = 230f, rotY = 0.4150f },
1088 new ST中心点() { x = -550.0000f, y = 4f, z = 150f, rotY = 0.4150f },
1089 new ST中心点() { x = -370.0000f, y = 4f, z = 70f, rotY = 0.4150f },
1090 new ST中心点() { x = -194.0000f, y = 4f, z = -6f, rotY = 0.4150f },
1091 new ST中心点() { x = 6.00002622683f, y = 2f, z = 0f, rotY = 0f },
1092 new ST中心点() { x = 204.0000f, y = 4f, z = 0f, rotY = -0.4150f },
1093 new ST中心点() { x = 362.0000f, y = 4f, z = 70f, rotY = -0.4150f },
1094 new ST中心点() { x = 528.0000f, y = 4f, z = 146f, rotY = -0.4150f },
1095 new ST中心点() { x = 686.0000f, y = 4f, z = 212f, rotY = -0.4150f },
1096 new ST中心点() { x = 848.0000f, y = 4f, z = 282f, rotY = -0.4150f },
1097 new ST中心点() { x = 1200.0000f, y = 4f, z = 450f, rotY = -0.4150f },
1098 new ST中心点() { x = 1500.0000f, y = 4f, z = -289.5575f, rotY = -0.9279888f },
1099 new ST中心点() { x = 1500.0000f, y = 4f, z = -289.5575f, rotY = -0.9279888f },
1100 };
1101 */
1102 //-----------------
1103 #endregion
1104
1105
1106 if( !this.b登場アニメ全部完了 )
1107 {
1108 #region [ (1) 登場アニメフェーズの描画。]
1109 //-----------------
1110 for( int i = 0; i < 13; i++ ) // パネルは全13枚。
1111 {
1112 if( this.ct登場アニメ用[ i ].n現在の値 >= 0 )
1113 {
1114 int nパネル番号 = ( ( ( this.n現在の選択行 - 5 ) + i ) + 13 ) % 13;
1115
1116 if( i == 6 )
1117 {
1118 #region [ ジャケット画像の描画 ]
1119 //-----------------
1120 if( this.txパネル != null )
1121 {
1122 var mat = SlimDX.Matrix.Identity;
1123 mat *= SlimDX.Matrix.Scaling( 0.62f, 0.88f, 1.0f );
1124 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[ i ].rotY + (this.stマトリックス座標[ i ].rotY - this.stマトリックス座標[i].rotY));
1125 mat *= SlimDX.Matrix.Translation(
1126 ( this.stマトリックス座標[ i ].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1127 ( this.stマトリックス座標[ i ].y + 2 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1128 ( this.stマトリックス座標[ i ].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1129 this.st情報[nパネル番号].txパネル.t3D描画(CDTXMania.app.Device, mat);
1130 }
1131 if( this.txTumbnail[nパネル番号] != null )
1132 {
1133 float f拡大率 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Width;
1134 float f拡大率2 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Height;
1135 var mat = SlimDX.Matrix.Identity;
1136 mat *= SlimDX.Matrix.Scaling(f拡大率 * CTexture.f画面比率 - 0.084f, f拡大率2 * CTexture.f画面比率 + 0.05f, 1.0f);
1137 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1138 mat *= SlimDX.Matrix.Translation(
1139 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1140 (this.stマトリックス座標[i].y + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率 - 1f,
1141 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1142 this.txTumbnail[nパネル番号].t3D描画(CDTXMania.app.Device, mat);
1143 }
1144 //-----------------
1145 #endregion
1146 #region [ タイトル名テクスチャを描画。]
1147 //-----------------
1148 if( this.st情報[nパネル番号].txタイトル名 != null )
1149 {
1150 //this.stバー情報[ nパネル番号 ].txタイトル名.t2D描画( CDTXMania.app.Device, x + 0x58, y + 8 );
1151 var mat = SlimDX.Matrix.Identity;
1152 mat *= SlimDX.Matrix.Scaling( 0.35f, 0.45f, 1.0f );
1153 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[ i ].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1154 mat *= SlimDX.Matrix.Translation(
1155 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1156 (this.stマトリックス座標[i].y + 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1157 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1158 //this.stバー情報[nパネル番号].txタイトル名.t3D描画(CDTXMania.app.Device, mat);
1159 }
1160 if (this.st情報[nパネル番号].txティスト名 != null)
1161 {
1162 var mat = SlimDX.Matrix.Identity;
1163 mat *= SlimDX.Matrix.Scaling(0.35f, 0.45f, 1.0f);
1164 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1165 mat *= SlimDX.Matrix.Translation(
1166 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1167 (this.stマトリックス座標[i].y - 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1168 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1169 //this.stバー情報[nパネル番号].txアーティスト名.t3D描画(CDTXMania.app.Device, mat);
1170 }
1171 //-----------------
1172 #endregion
1173 if( this.tx選曲パネル != null )
1174 this.tx選曲パネル.t2D描画( CDTXMania.app.Device, 761, 233, new Rectangle( 304, 70, 59, 242 ) );
1175 }
1176 else if( i == 5 )
1177 {
1178 // (A) 選択曲パネルを描画。
1179 if( this.tx選曲パネル != null )
1180 this.tx選曲パネル.t2D描画( CDTXMania.app.Device, 531, 243, new Rectangle( 74, 80, 230, 230 ) ); //真ん中の部分は別々に描画。
1181 if( this.txランプ用帯 != null )
1182 {
1183 this.txランプ用帯.t3D描画( CDTXMania.app.Device, bar ); //右の帯。
1184 this.txランプ用帯.t3D描画( CDTXMania.app.Device, barL ); //右の帯。
1185 }
1186 #region [ バーテクスチャを描画。]
1187 //-----------------
1188 if( this.txパネル != null )
1189 {
1190 var mat = SlimDX.Matrix.Identity;
1191 mat *= SlimDX.Matrix.Scaling(0.8f, 0.8f, 1.0f);
1192 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1193 mat *= SlimDX.Matrix.Translation(
1194 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1195 (this.stマトリックス座標[i].y + 2 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1196 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1197 this.txパネル.t3D描画(CDTXMania.app.Device, mat);
1198 }
1199 if( this.tx選曲パネル != null )
1200 this.tx選曲パネル.t2D描画( CDTXMania.app.Device, 457, 163, new Rectangle( 0, 0, 363, 368 ) );
1201 //-----------------
1202 #endregion
1203 #region [ ジャケット画像の描画 ]
1204 //-----------------
1205 for( int la = 0; la < 5 ; la++ )
1206 {
1207 if( this.txクリアランプ != null && CDTXMania.stage選曲.r現在選択中の曲.ar難易度ラベル[ la ] != null && CDTXMania.stage選曲.r現在選択中の曲.arスコア[ la ] != null )
1208 this.txクリアランプ.t2D描画(CDTXMania.app.Device, 506, 292 - la * 13, new Rectangle((CDTXMania.stage選曲.r現在選択中の曲.arスコア[la].譜面情報.最大スキル.Drums != 0 ? 11 + la * 11 : 0), ( CDTXMania.stage選曲.r現在選択中の曲.arスコア[la].譜面情報.フルコンボ.Drums ? 10 : 0), 11, 10));
1209 }
1210 if( this.txTumbnail[ nパネル番号 ] != null )
1211 {
1212 float f拡大率 = (float)218.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Width;
1213 float f拡大率2 = (float)218.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Height;
1214 this.txTumbnail[ nパネル番号 ].vc拡大縮小倍率 = new Vector3( f拡大率, f拡大率2, 1.0f );
1215 this.txTumbnail[ nパネル番号 ].t2D描画(CDTXMania.app.Device, 537, 249 );
1216 this.txTumbnail[ nパネル番号 ].vc拡大縮小倍率 = new Vector3( 1.0f, 1.0f, 1.0f );
1217 }
1218 //-----------------
1219 #endregion
1220 #region [ タイトル名テクスチャを描画。]
1221 //-----------------
1222 if( this.st情報[ nパネル番号 ].strタイトル文字列 != "" && this.st情報[ nパネル番号 ].strタイトル文字列 != null && this.tx選択されている曲の曲名 == null )
1223 this.tx選択されている曲の曲名 = this.t指定された文字テクスチャを生成する( this.st情報[ nパネル番号 ].strタイトル文字列 );
1224 if( this.st情報[ nパネル番号 ].strティスト名 != "" && this.st情報[ nパネル番号 ].strティスト名 != null && this.tx選択されている曲のアティスト名 == null )
1225 this.tx選択されている曲のアティスト名 = this.t指定された文字テクスチャを生成する( this.st情報[ nパネル番号 ].strティスト名 );
1226
1227 if( this.tx選択されている曲の曲名 != null )
1228 this.tx選択されている曲の曲名.t2D描画( CDTXMania.app.Device, 552, 210 );
1229 if( this.tx選択されている曲のアティスト名 != null )
1230 this.tx選択されている曲のアティスト名.t2D描画(CDTXMania.app.Device, 770 - this.st情報[ nパネル番号 ].nティスト名テクスチャの長さdot, 470);
1231 //if( this.stバー情報[ nパネル番号 ].txタイトル名 != null )
1232 // this.stバー情報[ nパネル番号 ].txタイトル名.t2D描画( CDTXMania.app.Device, 556, 210 );
1233 //if (this.stバー情報[ nパネル番号 ].txアーティスト名 != null)
1234 // this.stバー情報[ nパネル番号 ].txアーティスト名.t2D描画(CDTXMania.app.Device, 560 - 770 - this.stバー情報[ nパネル番号 ].nアーティスト名テクスチャの長さdot, 402);
1235 //-----------------
1236 #endregion
1237 }
1238 else
1239 {
1240 // (B) その他のパネルの描画。
1241 #region [ ジャケット画像の描画 ]
1242 //-----------------
1243 if( this.txパネル != null )
1244 {
1245 var mat = SlimDX.Matrix.Identity;
1246 mat *= SlimDX.Matrix.Scaling(0.62f, 0.88f, 1.0f);
1247 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1248 mat *= SlimDX.Matrix.Translation(
1249 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1250 (this.stマトリックス座標[i].y + 2 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1251 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1252 this.st情報[nパネル番号].txパネル.t3D描画(CDTXMania.app.Device, mat);
1253 }
1254 if( this.txTumbnail[ nパネル番号 ] != null )
1255 {
1256 float f拡大率 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Width;
1257 float f拡大率2 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Height;
1258 var mat = SlimDX.Matrix.Identity;
1259 mat *= SlimDX.Matrix.Scaling(f拡大率 * CTexture.f画面比率 - 0.084f, f拡大率2 * CTexture.f画面比率 + 0.05f, 1.0f);
1260 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1261 mat *= SlimDX.Matrix.Translation(
1262 (this.stマトリックス座標[ i ].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1263 (this.stマトリックス座標[ i ].y + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1264 (this.stマトリックス座標[ i ].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1265 this.txTumbnail[nパネル番号].t3D描画(CDTXMania.app.Device, mat);
1266 }
1267 //-----------------
1268 #endregion
1269 #region [ タイトル名テクスチャを描画。]
1270 //-----------------
1271 if( this.txランプ用帯 != null )
1272 this.txランプ用帯.t3D描画( CDTXMania.app.Device, bar ); //右の帯。
1273 if( this.tx選曲パネル != null )
1274 this.tx選曲パネル.t2D描画( CDTXMania.app.Device, 761, 233, new Rectangle( 304, 70, 59, 242 ) );
1275 if (this.st情報[ nパネル番号 ].txタイトル名 != null)
1276 {
1277 var mat = SlimDX.Matrix.Identity;
1278 mat *= SlimDX.Matrix.Scaling(0.35f, 0.45f, 1.0f);
1279 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1280 mat *= SlimDX.Matrix.Translation(
1281 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1282 (this.stマトリックス座標[i].y + 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1283 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1284 //this.stバー情報[nパネル番号].txタイトル名.t3D描画(CDTXMania.app.Device, mat);
1285 }
1286 if (this.st情報[nパネル番号].txティスト名 != null)
1287 {
1288 var mat = SlimDX.Matrix.Identity;
1289 mat *= SlimDX.Matrix.Scaling(0.35f, 0.45f, 1.0f);
1290 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1291 mat *= SlimDX.Matrix.Translation(
1292 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1293 (this.stマトリックス座標[i].y - 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1294 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1295 //this.stバー情報[nパネル番号].txアーティスト名.t3D描画(CDTXMania.app.Device, mat);
1296 }
1297 //-----------------
1298 #endregion
1299 }
1300 }
1301 }
1302 //-----------------
1303 #endregion
1304
1305 }
1306 else
1307 {
1308
1309 #region [ (2) 通常フェーズの描画。]
1310 //-----------------
1311 for( int i = 0; i < 13; i++ ) // パネルは全13枚。
1312 {
1313 int nパネル番号 = ( ( ( this.n現在の選択行 - 5 ) + i ) + 13 ) % 13;
1314 int n見た目の行番号 = i;
1315 int n次のパネル番号 = ( this.n現在のスクロルカウンタ <= 0 ) ? ( ( i + 1 ) % 13 ) : ( ( ( i - 1 ) + 13 ) % 13 );
1316 int x = this.ptの基本座標[ n見た目の行番号 ].X + ( (int) ( ( this.ptの基本座標[ n次のパネル番号 ].X - this.ptの基本座標[ n見た目の行番号 ].X ) * ( ( (double) Math.Abs( this.n現在のスクロルカウンタ ) ) / 100.0 ) ) );
1317 int y = this.ptの基本座標[ n見た目の行番号 ].Y + ( (int) ( ( this.ptの基本座標[ n次のパネル番号 ].Y - this.ptの基本座標[ n見た目の行番号 ].Y ) * ( ( (double) Math.Abs( this.n現在のスクロルカウンタ ) ) / 100.0 ) ) );
1318 float fX = this.n現在のスクロルカウンタ <= 0 ? this.stマトリックス座標[ n見た目の行番号 ].x + ( ( ( this.stマトリックス座標[ n次のパネル番号 ].x - this.stマトリックス座標[ n見た目の行番号 ].x ) * ( ( this.n現在のスクロルカウンタ ) ) / 100.0f ) ) :
1319 this.stマトリックス座標[ n見た目の行番号 ].x + ( ( ( this.stマトリックス座標[ n次のパネル番号 ].x + this.stマトリックス座標[ n見た目の行番号 ].x ) * ( ( this.n現在のスクロルカウンタ ) ) / 100.0f ) );
1320
1321 float fY = this.n現在のスクロルカウンタ <= 0 ? this.stマトリックス座標[ n見た目の行番号 ].y + ( ( ( this.stマトリックス座標[ n次のパネル番号 ].y - this.stマトリックス座標[ n見た目の行番号 ].y ) * ( ( this.n現在のスクロルカウンタ ) ) / 100.0f ) ) :
1322 this.stマトリックス座標[ n見た目の行番号 ].y + ( ( ( this.stマトリックス座標[ n次のパネル番号 ].y - this.stマトリックス座標[ n見た目の行番号 ].y ) * ( ( this.n現在のスクロルカウンタ ) ) / 100.0f ) );
1323
1324 float fZ = this.n現在のスクロルカウンタ <= 0 ? this.stマトリックス座標[ n見た目の行番号 ].z + ( ( ( this.stマトリックス座標[ n次のパネル番号 ].z - this.stマトリックス座標[ n見た目の行番号 ].z ) * ( ( this.n現在のスクロルカウンタ ) ) / 100.0f ) ) :
1325 this.stマトリックス座標[ n見た目の行番号 ].z + ( ( ( this.stマトリックス座標[ n次のパネル番号 ].z + this.stマトリックス座標[ n見た目の行番号 ].z ) * ( ( this.n現在のスクロルカウンタ ) ) / 100.0f ) );
1326
1327 if (i == 6)
1328 {
1329 #region [ ジャケット画像の描画 ]
1330 //-----------------
1331 if( this.txパネル != null )
1332 {
1333 var mat = SlimDX.Matrix.Identity;
1334 mat *= SlimDX.Matrix.Scaling(0.62f, 0.88f, 1.0f);
1335 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1336 mat *= SlimDX.Matrix.Translation(
1337 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1338 (this.stマトリックス座標[i].y + 2 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1339 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1340 this.st情報[ nパネル番号 ].txパネル.t3D描画(CDTXMania.app.Device, mat);
1341 }
1342 if (this.txTumbnail[nパネル番号] != null)
1343 {
1344 float f拡大率 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Width;
1345 float f拡大率2 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Height;
1346 var mat = SlimDX.Matrix.Identity;
1347 mat *= SlimDX.Matrix.Scaling(f拡大率 * CTexture.f画面比率 - 0.084f, f拡大率2 * CTexture.f画面比率 + 0.05f, 1.0f);
1348 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1349 mat *= SlimDX.Matrix.Translation(
1350 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1351 (this.stマトリックス座標[i].y + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率 - 1f,
1352 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1353 this.txTumbnail[nパネル番号].t3D描画(CDTXMania.app.Device, mat);
1354 }
1355 //-----------------
1356 #endregion
1357 #region [ タイトル名テクスチャを描画。]
1358 //-----------------
1359 if (this.st情報[nパネル番号].txタイトル名 != null)
1360 {
1361 //this.stバー情報[ nパネル番号 ].txタイトル名.t2D描画( CDTXMania.app.Device, x + 0x58, y + 8 );
1362 var mat = SlimDX.Matrix.Identity;
1363 mat *= SlimDX.Matrix.Scaling(0.35f, 0.45f, 1.0f);
1364 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1365 mat *= SlimDX.Matrix.Translation(
1366 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1367 (this.stマトリックス座標[i].y + 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1368 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1369 //this.stバー情報[nパネル番号].txタイトル名.t3D描画(CDTXMania.app.Device, mat);
1370 }
1371 if (this.st情報[nパネル番号].txティスト名 != null)
1372 {
1373 var mat = SlimDX.Matrix.Identity;
1374 mat *= SlimDX.Matrix.Scaling(0.35f, 0.45f, 1.0f);
1375 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1376 mat *= SlimDX.Matrix.Translation(
1377 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1378 (this.stマトリックス座標[i].y - 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1379 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1380 //this.stバー情報[nパネル番号].txアーティスト名.t3D描画(CDTXMania.app.Device, mat);
1381 }
1382 //-----------------
1383 #endregion
1384 }
1385 else if( ( i == 5 ) )
1386 {
1387 if( this.txランプ用帯 != null )
1388 this.txランプ用帯.t3D描画( CDTXMania.app.Device, barL ); //右の帯。
1389 //for (int la = 0; la < 5; la++)
1390 {
1391 //if( this.stバー情報[ 6 ].ar難易度ラベル[ la ] != null )
1392 {
1393 //var lamp = SlimDX.Matrix.Identity;
1394 //lamp *= SlimDX.Matrix.Translation(
1395 //( this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x ) )) * CTexture.f画面比率,
1396 //( this.stマトリックス座標[i].y + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y ) ) ) * CTexture.f画面比率 - 1f - la * 13f,
1397 //( this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z ) ) ) * CTexture.f画面比率);
1398
1399 //this.txクリアランプ.t3D描画( CDTXMania.app.Device, lamp, new Rectangle((CDTXMania.stage選曲.r現在選択中の曲.arスコア[la].譜面情報.最大スキル.Drums != 0 ? 11 + la * 11 : 0), (CDTXMania.stage選曲.r現在選択中の曲.arスコア[la].譜面情報.フルコンボ.Drums ? 10 : 0), 11, 10));
1400 }
1401 }
1402 if( this.tx選曲パネル != null )
1403 this.tx選曲パネル.t2D描画(CDTXMania.app.Device, 531, 243, new Rectangle(74, 80, 230, 230)); //真ん中の部分は別々に描画。
1404 // (A) スクロールが停止しているときの選択曲バーの描画。
1405 #region [ ジャケット画像の描画 ]
1406 //-----------------
1407 if( this.txパネル != null )
1408 {
1409 var mat = SlimDX.Matrix.Identity;
1410 mat *= SlimDX.Matrix.Scaling(CTexture.f画面比率, CTexture.f画面比率, 1.0f);
1411 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1412 mat *= SlimDX.Matrix.Translation(
1413 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1414 (this.stマトリックス座標[i].y + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1415 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1416 this.st情報[nパネル番号].txパネル.t3D描画(CDTXMania.app.Device, mat);
1417 }
1418 if( this.tx選曲パネル != null )
1419 this.tx選曲パネル.t2D描画(CDTXMania.app.Device, 457, 163, new Rectangle(0, 0, 363, 368));
1420
1421 for( int la = 0; la < 5 ; la++ )
1422 {
1423 if( this.txクリアランプ != null && CDTXMania.stage選曲.r現在選択中の曲.ar難易度ラベル[ la ] != null && CDTXMania.stage選曲.r現在選択中の曲.arスコア[ la ] != null )
1424 this.txクリアランプ.t2D描画(CDTXMania.app.Device, 506, 292 - la * 13, new Rectangle((CDTXMania.stage選曲.r現在選択中の曲.arスコア[la].譜面情報.最大スキル.Drums != 0 ? 11 + la * 11 : 0), ( CDTXMania.stage選曲.r現在選択中の曲.arスコア[la].譜面情報.フルコンボ.Drums ? 10 : 0), 11, 10));
1425 }
1426 if( this.txTumbnail[ nパネル番号 ] != null )
1427 {
1428 float f拡大率 = (float)218.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Width;
1429 float f拡大率2 = (float)218.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Height;
1430 this.txTumbnail[ nパネル番号 ].vc拡大縮小倍率 = new Vector3( f拡大率, f拡大率2, 1.0f );
1431 this.txTumbnail[ nパネル番号 ].t2D描画(CDTXMania.app.Device, 537, 249 );
1432 this.txTumbnail[ nパネル番号 ].vc拡大縮小倍率 = new Vector3( 1.0f, 1.0f, 1.0f );
1433 }
1434 //-----------------
1435 #endregion
1436 #region [ タイトル名テクスチャを描画。]
1437 //-----------------
1438 if( this.st情報[ nパネル番号 ].strタイトル文字列 != "" && this.st情報[ nパネル番号 ].strタイトル文字列 != null && this.tx選択されている曲の曲名 == null )
1439 this.tx選択されている曲の曲名 = this.t指定された文字テクスチャを生成する( this.st情報[ nパネル番号 ].strタイトル文字列 );
1440 if( this.st情報[ nパネル番号 ].strティスト名 != "" && this.st情報[ nパネル番号 ].strティスト名 != null && this.tx選択されている曲のアティスト名 == null )
1441 this.tx選択されている曲のアティスト名 = this.t指定された文字テクスチャを生成する( this.st情報[ nパネル番号 ].strティスト名 );
1442
1443 if( this.tx選択されている曲の曲名 != null )
1444 this.tx選択されている曲の曲名.t2D描画( CDTXMania.app.Device, 552, 210 );
1445 if( this.tx選択されている曲のアティスト名 != null )
1446 this.tx選択されている曲のアティスト名.t2D描画( CDTXMania.app.Device, 770 - this.st情報[ nパネル番号 ].nティスト名テクスチャの長さdot, 470);
1447 //if( this.stバー情報[ nパネル番号 ].txタイトル名 != null )
1448 // this.stバー情報[ nパネル番号 ].txタイトル名.t2D描画( CDTXMania.app.Device, 556, 210 );
1449 //if (this.stバー情報[ nパネル番号 ].txアーティスト名 != null)
1450 // this.stバー情報[ nパネル番号 ].txアーティスト名.t2D描画(CDTXMania.app.Device, 560 - 770 - this.stバー情報[ nパネル番号 ].nアーティスト名テクスチャの長さdot, 402);
1451 //-----------------
1452 #endregion
1453 }
1454 else if (i >= 12)
1455 {
1456 }
1457 else
1458 {
1459 // (B) スクロール中の選択曲バー、またはその他のバーの描画。
1460 if( this.txランプ用帯 != null )
1461 this.txランプ用帯.t3D描画( CDTXMania.app.Device, bar ); //右の帯。
1462 if( this.tx選曲パネル != null )
1463 this.tx選曲パネル.t2D描画(CDTXMania.app.Device, 761, 233, new Rectangle(304, 70, 59, 242));
1464
1465 #region [ ジャケット画像の描画 ]
1466 //-----------------
1467 if( this.txパネル != null )
1468 {
1469 var mat = SlimDX.Matrix.Identity;
1470 mat *= SlimDX.Matrix.Scaling(0.62f, 0.88f, 1.0f);
1471 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1472 mat *= SlimDX.Matrix.Translation(
1473 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1474 (this.stマトリックス座標[i].y + 2 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1475 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1476 this.st情報[nパネル番号].txパネル.t3D描画(CDTXMania.app.Device, mat);
1477 }
1478 if( this.txTumbnail[nパネル番号] != null )
1479 {
1480 float f拡大率 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Width ;
1481 float f拡大率2 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Height;
1482 var mat = SlimDX.Matrix.Identity;
1483 mat *= SlimDX.Matrix.Scaling(f拡大率 * CTexture.f画面比率 - 0.084f, f拡大率2 * CTexture.f画面比率 + 0.05f, 1.0f);
1484 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1485 mat *= SlimDX.Matrix.Translation(
1486 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1487 (this.stマトリックス座標[i].y + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1488 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1489 this.txTumbnail[nパネル番号].t3D描画(CDTXMania.app.Device, mat);
1490 }
1491 //-----------------
1492 #endregion
1493 #region [ タイトル名テクスチャを描画。]
1494 //-----------------
1495 if( this.st情報[nパネル番号].txタイトル名 != null )
1496 {
1497 //this.stバー情報[ nパネル番号 ].txタイトル名.t2D描画( CDTXMania.app.Device, x + 0x58, y + 8 );
1498 var mat = SlimDX.Matrix.Identity;
1499 mat *= SlimDX.Matrix.Scaling(0.35f, 0.45f, 1.0f);
1500 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1501 mat *= SlimDX.Matrix.Translation(
1502 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1503 (this.stマトリックス座標[i].y + 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1504 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1505 //this.stバー情報[nパネル番号].txタイトル名.t3D描画(CDTXMania.app.Device, mat);
1506 }
1507 if( this.st情報[nパネル番号].txティスト名 != null )
1508 {
1509 var mat = SlimDX.Matrix.Identity;
1510 mat *= SlimDX.Matrix.Scaling(0.35f, 0.45f, 1.0f);
1511 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1512 mat *= SlimDX.Matrix.Translation(
1513 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1514 (this.stマトリックス座標[i].y - 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1515 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1516 //this.stバー情報[nパネル番号].txアーティスト名.t3D描画(CDTXMania.app.Device, mat);
1517 }
1518 //-----------------
1519 #endregion
1520
1521 #region [ スキル値を描画。]
1522 //-----------------
1523 //if( ( this.stバー情報[ nパネル番号 ].eバー種別 == Eバー種別.Score ) && ( this.e楽器パート != E楽器パート.UNKNOWN ) )
1524 //this.tスキル値の描画( x + 34, y + 18, this.stバー情報[ nパネル番号 ].nスキル値[ (int) this.e楽器パート ] );
1525 //-----------------
1526 #endregion
1527 }
1528 }
1529 //-----------------
1530 #endregion
1531
1532 }
1533 #region [ スクロール地点の計算(描画はCActSelectShowCurrentPositionにて行う) #27648 ]
1534 int py;
1535 double d = 0;
1536 if ( nNumOfItems > 1 )
1537 {
1538 d = ( 336 - 8 ) / (double) ( nNumOfItems - 1 );
1539 py = (int) ( d * ( nCurrentPosition - 1 ) );
1540 }
1541 else
1542 {
1543 d = 0;
1544 py = 0;
1545 }
1546 int delta = (int) ( d * this.n現在のスクロルカウンタ / 100 );
1547 if ( py + delta <= 336 - 8 )
1548 {
1549 this.nスクロルバ相対y座標 = py + delta;
1550 }
1551 #endregion
1552
1553 #region [ アイテム数の描画 #27648 ]
1554 tアイテム数の描画();
1555 #endregion
1556 return 0;
1557 }
1558
1559
1560 // その他
1561
1562 #region [ private ]
1563 //-----------------
1564 private enum E種別 { Score, Box, Other, Random, BackBox }
1565
1566 private struct ST
1567 {
1568 public CTexture Score;
1569 public CTexture Box;
1570 public CTexture Other;
1571 public CTexture Random;
1572 public CTexture BackBox;
1573 public CTexture this[ int index ]
1574 {
1575 get
1576 {
1577 switch( index )
1578 {
1579 case 0:
1580 return this.Score;
1581
1582 case 1:
1583 return this.Box;
1584
1585 case 2:
1586 return this.Other;
1587
1588 case 3:
1589 return this.Random;
1590
1591 case 4:
1592 return this.BackBox;
1593 }
1594 throw new IndexOutOfRangeException();
1595 }
1596 set
1597 {
1598 switch( index )
1599 {
1600 case 0:
1601 this.Score = value;
1602 return;
1603
1604 case 1:
1605 this.Box = value;
1606 return;
1607
1608 case 2:
1609 this.Other = value;
1610 return;
1611
1612 case 3:
1613 this.Random = value;
1614 return;
1615
1616 case 4:
1617 this.BackBox = value;
1618 return;
1619 }
1620 throw new IndexOutOfRangeException();
1621 }
1622 }
1623 }
1624
1625 private struct ST情報
1626 {
1627 public CActSelect曲リスト.E種別 e種別;
1628 public string strタイトル文字列;
1629 public string strティスト名;
1630 public CTexture txタイトル名;
1631 public CTexture txティスト名;
1632 public CTexture txパネル;
1633 public int nティスト名テクスチャの長さdot;
1634 public int nタイトル名テクスチャの長さdot;
1635 public STDGBVALUE<int> nスキル値;
1636 public Color col文字色;
1637 public string strDTXフォルダのパス;
1638 public string[] ar難易度ラベル;
1639 public Cスコア.ST譜面情報 ar譜面情報;
1640 }
1641
1642 private struct ST選曲バ
1643 {
1644 public CTexture Score;
1645 public CTexture Box;
1646 public CTexture Other;
1647 public CTexture this[ int index ]
1648 {
1649 get
1650 {
1651 switch( index )
1652 {
1653 case 0:
1654 return this.Score;
1655
1656 case 1:
1657 return this.Box;
1658
1659 case 2:
1660 return this.Other;
1661 }
1662 throw new IndexOutOfRangeException();
1663 }
1664 set
1665 {
1666 switch( index )
1667 {
1668 case 0:
1669 this.Score = value;
1670 return;
1671
1672 case 1:
1673 this.Box = value;
1674 return;
1675
1676 case 2:
1677 this.Other = value;
1678 return;
1679 }
1680 throw new IndexOutOfRangeException();
1681 }
1682 }
1683 }
1684
1685 protected struct ST中心点
1686 {
1687 public float x;
1688 public float y;
1689 public float z;
1690 public float rotY;
1691 }
1692 /// <summary>
1693 /// <para>SSTFファイル絶対パス(key)とサムネイル画像(value)との辞書。</para>
1694 /// <para>アプリの起動から終了まで単純に増加を続け、要素が減ることはない。</para>
1695 /// </summary>
1696 protected Dictionary<string, CTexture> dicThumbnail = new Dictionary<string, CTexture>();
1697
1698 /// <summary>
1699 /// <para>SSTFファイル絶対パス(key)とプロパティ画像(value)との辞書。</para>
1700 /// <para>アプリの起動から終了まで単純に増加を続け、要素が減ることはない。</para>
1701 /// </summary>
1702 protected Dictionary<string, CTexture> dicProperty = new Dictionary<string, CTexture>();
1703
1704 protected ST中心点[] stマトリックス座標 = new ST中心点[] {
1705 #region [ 実は円弧配置になってない。射影行列間違ってるよスターレインボウ見せる気かよ… ]
1706 //-----------------
1707 new ST中心点() { x = -940.0000f, y = 4f, z = 320f, rotY = 0.4150f },
1708 new ST中心点() { x = -740.0000f, y = 4f, z = 230f, rotY = 0.4150f },
1709 new ST中心点() { x = -550.0000f, y = 4f, z = 150f, rotY = 0.4150f },
1710 new ST中心点() { x = -370.0000f, y = 4f, z = 70f, rotY = 0.4150f },
1711 new ST中心点() { x = -194.0000f, y = 4f, z = -6f, rotY = 0.4150f },
1712 new ST中心点() { x = 6.00002622683f, y = 2f, z = 0f, rotY = 0f },
1713 new ST中心点() { x = 204.0000f, y = 4f, z = 0f, rotY = -0.4150f },
1714 new ST中心点() { x = 362.0000f, y = 4f, z = 70f, rotY = -0.4150f },
1715 new ST中心点() { x = 528.0000f, y = 4f, z = 146f, rotY = -0.4150f },
1716 new ST中心点() { x = 686.0000f, y = 4f, z = 212f, rotY = -0.4150f },
1717 new ST中心点() { x = 848.0000f, y = 4f, z = 282f, rotY = -0.4150f },
1718 new ST中心点() { x = 1200.0000f, y = 4f, z = 450f, rotY = -0.4150f },
1719 new ST中心点() { x = 1500.0000f, y = 4f, z = -289.5575f, rotY = -0.9279888f },
1720 new ST中心点() { x = 1500.0000f, y = 4f, z = -289.5575f, rotY = -0.9279888f },
1721 //-----------------
1722 #endregion
1723 };
1724
1725 protected readonly ST中心点[] stマトリックス曲名座標 = new ST中心点[] {
1726 #region [ 実は円弧配置になってない。射影行列間違ってるよスターレインボウ見せる気かよ… ]
1727 //-----------------
1728 new ST中心点() { x = -980.0000f, y = 2f, z = 360f, rotY = 0.4000f },
1729 new ST中心点() { x = -780.0000f, y = 2f, z = 270f, rotY = 0.4000f },
1730 new ST中心点() { x = -590.0000f, y = 2f, z = 180f, rotY = 0.4000f },
1731 new ST中心点() { x = -400.0000f, y = 2f, z = 90f, rotY = 0.4000f },
1732 new ST中心点() { x = -210.0000f, y = 2f, z = 0f, rotY = 0.4000f },
1733 new ST中心点() { x = 6.00002622683f, y = 2f, z = 0f, rotY = 0f },
1734 new ST中心点() { x = 210.0000f, y = 2f, z = 0f, rotY = -0.4000f },
1735 new ST中心点() { x = 400.0000f, y = 2f, z = 90f, rotY = -0.4f },
1736 new ST中心点() { x = 590.0000f, y = 2f, z = 180f, rotY = -0.4f },
1737 new ST中心点() { x = 780.0000f, y = 2f, z = 270f, rotY = -0.4f },
1738 new ST中心点() { x = 980.0000f, y = 2f, z = 360f, rotY = -0.4f },
1739 new ST中心点() { x = 1200.0000f, y = 2f, z = 450f, rotY = -0.4f },
1740 new ST中心点() { x = 1500.0000f, y = 2f, z = -289.5575f, rotY = -0.9279888f },
1741 new ST中心点() { x = 1500.0000f, y = 2f, z = -289.5575f, rotY = -0.9279888f },
1742 //-----------------
1743 #endregion
1744 };
1745 [StructLayout(LayoutKind.Sequential)]
1746 public struct STATUSPANEL
1747 {
1748 public string label;
1749 public int status;
1750 }
1751 public int nIndex;
1752 public STATUSPANEL[] stパネルマップ;
1753
1754 public bool b登場アニメ全部完了;
1755 private Color color文字影 = Color.FromArgb( 0x40, 10, 10, 10 );
1756 public CCounter[] ct登場アニメ用 = new CCounter[ 13 ];
1757 private E楽器パ e楽器パ;
1758 private Font ft曲リスト用フォント;
1759 private long nスクロルタイマ;
1760 private int n現在のスクロルカウンタ;
1761 private int n現在の選択行;
1762 private int n目標のスクロルカウンタ;
1763 private readonly Point[] ptの基本座標 = new Point[] { new Point(0x2c4, 30), new Point(0x272, 0x51), new Point(0x242, 0x84), new Point(0x222, 0xb7), new Point(0x210, 0xea), new Point(0x1d0, 0x127), new Point(0x224, 0x183), new Point(0x242, 0x1b6), new Point(0x270, 0x1e9), new Point(0x2ae, 540), new Point(0x314, 0x24f), new Point(0x3e4, 0x282), new Point(0x500, 0x2b5) };
1764 private ST情報[] st情報 = new ST情報[ 13 ];
1765 private CTexture txSongNotFound, txEnumeratingSongs;
1766 private CTexture txスキル数字;
1767 private CTexture txアイテム数数字;
1768 private ST tx曲名バ;
1769 private ST選曲バ tx選曲バ;
1770 private CTexture[] txTumbnail = new CTexture[13];
1771 private CTexture tx選曲パネル;
1772 private CTexture txパネル;
1773 private CTexture txジャケットランダム;
1774 private CTexture txジャケットボックスクロ;
1775 private CTexture tx;
1776 private CTexture tx色帯;
1777 private CTexture txランプ用帯;
1778 private CTexture tx選択されている曲の曲名;
1779 private CTexture tx選択されている曲のアティスト名;
1780 private CTexture txクリアランプ;
1781 //CPrivateFont prvFont;
1782 private CPrivateFastFont prvFont;
1783
1784 private int nCurrentPosition = 0;
1785 private int nNumOfItems = 0;
1786
1787 //private string strBoxDefSkinPath = "";
1788 private E種別 e曲のバ種別を返す( C曲リストノ song )
1789 {
1790 if( song != null )
1791 {
1792 switch( song.eド種別 )
1793 {
1794 case C曲リストノ.Eド種別.SCORE:
1795 case C曲リストノ.Eド種別.SCORE_MIDI:
1796 return E種別.Score;
1797
1798 case C曲リストノ.Eド種別.BOX:
1799 return E種別.Box;
1800
1801 case C曲リストノ.Eド種別.BACKBOX:
1802 return E種別.BackBox;
1803
1804 case C曲リストノ.Eド種別.RANDOM:
1805 return E種別.Random;
1806 }
1807 }
1808 return E種別.Other;
1809 }
1810 private C曲リストノ r次の曲( C曲リストノ song )
1811 {
1812 if( song == null )
1813 return null;
1814
1815 List<C曲リストノ> list = ( song.r親ノ != null ) ? song.r親ノ.list子リスト : CDTXMania.Songs管理.list曲ル;
1816
1817 int index = list.IndexOf( song );
1818
1819 if( index < 0 )
1820 return null;
1821
1822 if( index == ( list.Count - 1 ) )
1823 return list[ 0 ];
1824
1825 return list[ index + 1 ];
1826 }
1827 private C曲リストノ r前の曲( C曲リストノ song )
1828 {
1829 if( song == null )
1830 return null;
1831
1832 List<C曲リストノ> list = ( song.r親ノ != null ) ? song.r親ノ.list子リスト : CDTXMania.Songs管理.list曲ル;
1833
1834 int index = list.IndexOf( song );
1835
1836 if( index < 0 )
1837 return null;
1838
1839 if( index == 0 )
1840 return list[ list.Count - 1 ];
1841
1842 return list[ index - 1 ];
1843 }
1844 private void tスキル値の描画( int x, int y, int nスキル値 )
1845 {
1846 if( nスキル値 <= 0 || nスキル値 > 100 ) // スキル値 0 = 未プレイ なので表示しない。
1847 return;
1848
1849 int color = ( nスキル値 == 100 ) ? 3 : ( nスキル値 / 25 );
1850
1851 int n百の位 = nスキル値 / 100;
1852 int n十の位 = ( nスキル値 % 100 ) / 10;
1853 int n一の位 = ( nスキル値 % 100 ) % 10;
1854
1855
1856 // 百の位の描画。
1857
1858 if( n百の位 > 0 )
1859 this.tスキル値の描画・1桁描画( x, y, n百の位, color );
1860
1861
1862 // 十の位の描画。
1863
1864 if( n百の位 != 0 || n十の位 != 0 )
1865 this.tスキル値の描画・1桁描画( x + 14, y, n十の位, color );
1866
1867
1868 // 一の位の描画。
1869
1870 this.tスキル値の描画・1桁描画( x + 0x1c, y, n一の位, color );
1871 }
1872 private void tスキル値の描画・1桁描画( int x, int y, int n数値, int color )
1873 {
1874 int dx = ( n数値 % 5 ) * 9;
1875 int dy = ( n数値 / 5 ) * 12;
1876
1877 switch( color )
1878 {
1879 case 0:
1880 if( this.txスキル数字 != null )
1881 this.txスキル数字.t2D描画( CDTXMania.app.Device, x, y, new Rectangle( 45 + dx, 24 + dy, 9, 12 ) );
1882 break;
1883
1884 case 1:
1885 if( this.txスキル数字 != null )
1886 this.txスキル数字.t2D描画( CDTXMania.app.Device, x, y, new Rectangle( 45 + dx, dy, 9, 12 ) );
1887 break;
1888
1889 case 2:
1890 if( this.txスキル数字 != null )
1891 this.txスキル数字.t2D描画( CDTXMania.app.Device, x, y, new Rectangle( dx, 24 + dy, 9, 12 ) );
1892 break;
1893
1894 case 3:
1895 if( this.txスキル数字 != null )
1896 this.txスキル数字.t2D描画( CDTXMania.app.Device, x, y, new Rectangle( dx, dy, 9, 12 ) );
1897 break;
1898 }
1899 }
1900 private void tの初期化()
1901 {
1902 C曲リストノ song = this.r現在選択中の曲;
1903
1904 if( song == null )
1905 return;
1906
1907 for( int i = 0; i < 5; i++ )
1908 song = this.r前の曲( song );
1909
1910 for( int i = 0; i < 13; i++ )
1911 {
1912 this.st情報[ i ].strタイトル文字列 = song.strタイトル;
1913 this.st情報[ i ].strティスト名 = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.ティスト名;
1914 this.st情報[ i ].col文字色 = song.col文字色;
1915 this.st情報[ i ].e種別 = this.e曲のバ種別を返す( song );
1916 this.st情報[ i ].ar譜面情報 = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報;
1917
1918 //for( int n = 0; n < 5; n++ )
1919 {
1920 //this.stバー情報[ i ].ar難易度ラベル[ n ];
1921
1922 //if( this.stバー情報[ i ].ar難易度ラベル[ n ] != null )
1923 //this.stバー情報[ i ].ar難易度ラベル[ n ] = song.ar難易度ラベル[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ];
1924 }
1925
1926 this.st情報[ i ].strDTXフォルダのパス = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].ファイル情報.フォルダの絶対パス + song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.Preimage;
1927 //this.tパスを指定してサムネイル画像を生成する( i, this.stバー情報[ i ].strDTXフォルダのパス, this.stバー情報[ i ].eバー種別 );
1928 this.tパネルの生成(i, song.strタイトル, this.st情報[i].strティスト名, song.col文字色);
1929 if( !this.dicThumbnail.ContainsKey( this.st情報[ i ].strDTXフォルダのパス ) )
1930 {
1931 //txTumbnail = this.tサムネイルテクスチャを作成する( Path.GetDirectoryName( song.ScoreFile ) );
1932 this.tパスを指定してサムネイル画像を生成する( i, this.st情報[ i ].strDTXフォルダのパス, this.st情報[ i ].e種別 );
1933 this.dicThumbnail.Add( this.st情報[ i ].strDTXフォルダのパス, this.txTumbnail[ i ] );
1934 }
1935 txTumbnail[ i ] = this.dicThumbnail[ this.st情報[ i ].strDTXフォルダのパス ];
1936
1937 for( int j = 0; j < 3; j++ )
1938 this.st情報[ i ].nスキル値[ j ] = (int) song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.最大スキル[ j ];
1939
1940 song = this.r次の曲( song );
1941 }
1942
1943 this.n現在の選択行 = 5;
1944 }
1945 private void tの描画( int x, int y, E種別 type, bool b選択曲 )
1946 {
1947 if( x >= SampleFramework.GameWindowSize.Width || y >= SampleFramework.GameWindowSize.Height )
1948 return;
1949
1950 if (b選択曲)
1951 {
1952 #region [ (A) 選択曲の場合 ]
1953 //-----------------
1954 if (this.tx選曲バ[(int)type] != null)
1955 this.tx選曲バ[(int)type].t2D描画(CDTXMania.app.Device, x, y, new Rectangle(0, 0, 128, 96)); // ヘサキ
1956 x += 128;
1957
1958 var rc = new Rectangle(128, 0, 128, 96);
1959 while (x < 1280)
1960 {
1961 if (this.tx選曲バ[(int)type] != null)
1962 this.tx選曲バ[(int)type].t2D描画(CDTXMania.app.Device, x, y, rc); // 胴体;64pxずつ横につなげていく。
1963 x += 128;
1964 }
1965 //-----------------
1966 #endregion
1967 }
1968 else
1969 {
1970 #region [ (B) その他の場合 ]
1971 //-----------------
1972 if (this.tx曲名バ[(int)type] != null)
1973 this.tx曲名バ[(int)type].t2D描画(CDTXMania.app.Device, x, y, new Rectangle(0, 0, 128, 48)); // ヘサキ
1974 x += 128;
1975
1976 var rc = new Rectangle(0, 48, 128, 48);
1977 while (x < 1280)
1978 {
1979 if (this.tx曲名バ[(int)type] != null)
1980 this.tx曲名バ[(int)type].t2D描画(CDTXMania.app.Device, x, y, rc); // 胴体;64pxずつ横につなげていく。
1981 x += 128;
1982 }
1983 //-----------------
1984 #endregion
1985 }
1986 }
1987 private void tパスを指定してサムネイル画像を生成する( int n番号, string strDTXPath, E種別 eType )
1988 {
1989 if( n番号 < 0 || n番号 > 12 )
1990 return;
1991
1992 //try
1993 {
1994 //if ( this.stバー情報[ nバー番号 ].eバー種別 == Eバー種別.Score || this.stバー情報[ nバー番号 ].eバー種別 == Eバー種別.Box)
1995 {
1996 if (!File.Exists(strDTXPath))
1997 {
1998 this.txTumbnail[n番号] = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_preimage default.png"), false);
1999 }
2000 else
2001 {
2002 this.txTumbnail[n番号] = CDTXMania.tテクスチャの生成(strDTXPath);
2003 }
2004 }
2005 //else if( this.stバー情報[ nバー番号 ].eバー種別 == Eバー種別.Random)
2006 //{
2007 // if( this.txジャケットランダム != null )
2008 // this.txTumbnail[ nバー番号 ] = this.txジャケットランダム;
2009 //}
2010 //else if( this.stバー情報[ nバー番号 ].eバー種別 == Eバー種別.BackBox)
2011 //{
2012 // if( this.txジャケットボックスクローズ != null )
2013 // this.txTumbnail[ nバー番号 ] = this.txジャケットボックスクローズ;
2014 //}
2015 }
2016 /*
2017 catch( CTextureCreateFailedException )
2018 {
2019 if ( this.txジャケット指定が無い場合の画像 != null )
2020 {
2021 this.txTumbnail[ nバー番号 ] = this.txジャケット指定が無い場合の画像;
2022 }
2023 else
2024 {
2025 this.txTumbnail[ nバー番号 ] = null;
2026 }
2027 }
2028 */
2029 }
2030 private CTexture tパスを指定してサムネイル画像を生成して返す( int n番号, string strDTXPath, E種別 eType )
2031 {
2032 if (n番号 < 0 || n番号 > 12)
2033 return this.txTumbnail[n番号] = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_preimage default.png"), false);
2034
2035 //try
2036 {
2037 //if (eType == Eバー種別.Score || eType == Eバー種別.Box)
2038 {
2039 if (!File.Exists(strDTXPath))
2040 {
2041 return this.txTumbnail[n番号] = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_preimage default.png"), false);
2042 }
2043 else
2044 {
2045 return this.txTumbnail[n番号] = CDTXMania.tテクスチャの生成(strDTXPath);
2046 }
2047 }
2048 //else if (eType == Eバー種別.Random)
2049 {
2050 // if(this.txジャケットランダム != null)
2051 // this.txTumbnail[nバー番号] = this.txジャケットランダム;
2052 }
2053 //else if (eType == Eバー種別.BackBox)
2054 {
2055 // if(this.txジャケットボックスクローズ != null)
2056 // this.txTumbnail[nバー番号] = this.txジャケットボックスクローズ;
2057 }
2058 }
2059 /*
2060 catch( CTextureCreateFailedException )
2061 {
2062 if ( this.txジャケット指定が無い場合の画像 != null )
2063 {
2064 this.txTumbnail[ nバー番号 ] = this.txジャケット指定が無い場合の画像;
2065 }
2066 else
2067 {
2068 this.txTumbnail[ nバー番号 ] = null;
2069 }
2070 }
2071 */
2072 }
2073 private CTexture t指定された文字テクスチャを生成する( string str文字 )
2074 {
2075 //2013.09.05.kairera0467 中央にしか使用することはないので、色は黒固定。
2076 //現在は機能しない(面倒なので実装してない)が、そのうち使用する予定。
2077 //PrivateFontの試験運転も兼ねて。
2078 //CPrivateFastFont
2079 prvFont = new CPrivateFastFont( new FontFamily( CDTXMania.ConfigIni.str選曲リストフォント ), 28, FontStyle.Regular );
2080 Bitmap bmp;
2081
2082 bmp = prvFont.DrawPrivateFont( str文字, Color.Black, Color.Transparent );
2083
2084 SizeF sz曲名;
2085
2086 #region [ 曲名表示に必要となるサイズを取得する。]
2087 //-----------------
2088 using( var bmpDummy = new Bitmap(1, 1) )
2089 {
2090 var g = Graphics.FromImage( bmpDummy );
2091 g.PageUnit = GraphicsUnit.Pixel;
2092 sz曲名 = g.MeasureString( str文字, this.ft曲リスト用フォント);
2093 //this.stバー情報[ nバー番号 ].nタイトル名テクスチャの長さdot = (int)g.MeasureString(str文字, this.ft曲リスト用フォント).Width;
2094 }
2095 //-----------------
2096 #endregion
2097 int n最大幅px = 200;
2098 int height = 25;
2099 int width = (int)((sz曲名.Width + 2) * 0.5f);
2100 if (width > (CDTXMania.app.Device.Capabilities.MaxTextureWidth / 2))
2101 width = CDTXMania.app.Device.Capabilities.MaxTextureWidth / 2; // 右端断ち切れ仕方ないよね
2102
2103 float f拡大率X = (width <= n最大幅px) ? 0.5f : (((float)n最大幅px / (float)width) * 0.5f); // 長い文字列は横方向に圧縮。
2104
2105 CTexture tx文字テクスチャ = CDTXMania.tテクスチャの生成( bmp, false );
2106
2107 if( tx文字テクスチャ != null )
2108 tx文字テクスチャ.vc拡大縮小倍率 = new Vector3( f拡大率X, 0.5f, 1f );
2109
2110 //prvFont.Dispose();
2111 bmp.Dispose();
2112
2113 return tx文字テクスチャ;
2114 }
2115 private void tパネルの生成( int n番号, string str曲名, string strティスト名, Color color )
2116 {
2117 //t3D描画の仕様上左詰や右詰が面倒になってしまうので、
2118 //パネルにあらかじめ曲名とアーティスト名を埋め込んでおく。
2119
2120 if( n番号 < 0 || n番号 > 12 )
2121 return;
2122 try
2123 {
2124 Bitmap b4font;
2125 Bitmap bSongPanel;
2126 Image imgSongPanel;
2127 SizeF sz曲名;
2128 SizeF szティスト名;
2129
2130 b4font = new Bitmap( 1, 1 );
2131 Graphics graphics = Graphics.FromImage( b4font );
2132 graphics.PageUnit = GraphicsUnit.Pixel;
2133 imgSongPanel= Image.FromFile( CSkin.Path( @"Graphics\5_music panel.png" ) );
2134 bSongPanel = new Bitmap( 223, 279 );
2135
2136 graphics = Graphics.FromImage( bSongPanel );
2137 graphics.DrawImage( imgSongPanel, 0, 0, 223, 279 );
2138
2139
2140 #region [ 曲名表示に必要となるサイズを取得する。]
2141 //-----------------
2142 using( var bmpDummy = new Bitmap( 1, 1 ) )
2143 {
2144 var g = Graphics.FromImage( bmpDummy );
2145 g.PageUnit = GraphicsUnit.Pixel;
2146 sz曲名 = g.MeasureString( str曲名, this.ft曲リスト用フォント );
2147 szティスト名 = g.MeasureString( strティスト名, this.ft曲リスト用フォント );
2148 this.st情報[ n番号 ].nタイトル名テクスチャの長さdot = (int) g.MeasureString( strティスト名, new Font( CDTXMania.ConfigIni.str選曲リストフォント, 16 ) ).Width;
2149 }
2150 //-----------------
2151 #endregion
2152
2153 int n最大幅px = 200;
2154 int height = 25;
2155 int width = (int) ( ( sz曲名.Width + 2 ) );
2156 if( width > ( CDTXMania.app.Device.Capabilities.MaxTextureWidth ) )
2157 width = CDTXMania.app.Device.Capabilities.MaxTextureWidth; // 右端断ち切れ仕方ないよね
2158
2159 float f拡大率X = ( width <= n最大幅px ) ? 1 : ( ( (float) n最大幅px / (float) width ) ); // 長い文字列は横方向に圧縮。
2160
2161 using( var bmp = new Bitmap( width, height, PixelFormat.Format32bppArgb ) ) // 2倍(面積4倍)のBitmapを確保。(0.5倍で表示する前提。)
2162 using( var g = Graphics.FromImage( bmp ) )
2163 {
2164 graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
2165 float y = ( ( ( float ) bmp.Height ) ) - ( ( CDTXMania.ConfigIni.n選曲リストフォントのサイズdot ) );
2166 //graphics.DrawString( str曲名, this.ft曲リスト用フォント, new SolidBrush( this.color文字影 ), (float) 2f, (float) ( y + 2f ) );
2167 graphics.DrawString( str曲名, new Font( CDTXMania.ConfigIni.str選曲リストフォント, 16 ), new SolidBrush( color ), 5f, y - 2 );
2168 graphics.DrawString( strティスト名, new Font( CDTXMania.ConfigIni.str選曲リストフォント, 16 ), new SolidBrush( Color.White ), (float)218f - this.st情報[ n番号 ].nタイトル名テクスチャの長さdot, 255f);
2169 //graphics.DrawString( strアーティスト名, this.ft曲リスト用フォント, new SolidBrush( Color.White ), 234f, 258f );
2170
2171 CDTXMania.t安全にDisposeする( ref this.st情報[ n番号 ].txパネル );
2172
2173 this.st情報[ n番号 ].txパネル = new CTexture( CDTXMania.app.Device, bSongPanel, CDTXMania.TextureFormat, false );
2174 }
2175
2176
2177 }
2178 catch( CTextureCreateFailedException )
2179 {
2180 Trace.TraceError( "曲名テクスチャの作成に失敗しました。[{0}]", str曲名 );
2181 this.st情報[ n番号 ].txパネル = null;
2182 }
2183
2184 }
2185 private void t曲名バの生成( int n番号, string str曲名, Color color )
2186 {
2187 if( n番号 < 0 || n番号 > 12 )
2188 return;
2189
2190 try
2191 {
2192 SizeF sz曲名;
2193
2194 #region [ 曲名表示に必要となるサイズを取得する。]
2195 //-----------------
2196 using( var bmpDummy = new Bitmap( 1, 1 ) )
2197 {
2198 var g = Graphics.FromImage( bmpDummy );
2199 g.PageUnit = GraphicsUnit.Pixel;
2200 sz曲名 = g.MeasureString( str曲名, this.ft曲リスト用フォント );
2201 this.st情報[ n番号 ].nタイトル名テクスチャの長さdot = (int) g.MeasureString( str曲名, this.ft曲リスト用フォント ).Width;
2202 }
2203 //-----------------
2204 #endregion
2205
2206 int n最大幅px = 200;
2207 int height = 25;
2208 int width = (int) ( ( sz曲名.Width + 2 ) * 0.5f );
2209 if( width > ( CDTXMania.app.Device.Capabilities.MaxTextureWidth / 2 ) )
2210 width = CDTXMania.app.Device.Capabilities.MaxTextureWidth / 2; // 右端断ち切れ仕方ないよね
2211
2212 float f拡大率X = ( width <= n最大幅px ) ? 0.5f : ( ( (float) n最大幅px / (float) width ) * 0.5f ); // 長い文字列は横方向に圧縮。
2213
2214 using( var bmp = new Bitmap( width * 2, height * 2, PixelFormat.Format32bppArgb ) ) // 2倍(面積4倍)のBitmapを確保。(0.5倍で表示する前提。)
2215 using( var g = Graphics.FromImage( bmp ) )
2216 {
2217 g.TextRenderingHint = TextRenderingHint.AntiAlias;
2218 float y = ( ( ( float ) bmp.Height ) / 2f ) - ( ( CDTXMania.ConfigIni.n選曲リストフォントのサイズdot * 2f ) / 2f );
2219 g.DrawString( str曲名, this.ft曲リスト用フォント, new SolidBrush( this.color文字影 ), (float) 2f, (float) ( y + 2f ) );
2220 g.DrawString( str曲名, this.ft曲リスト用フォント, new SolidBrush( color ), 0f, y );
2221
2222 CDTXMania.t安全にDisposeする( ref this.st情報[ n番号 ].txタイトル名 );
2223
2224 this.st情報[ n番号 ].txタイトル名 = new CTexture( CDTXMania.app.Device, bmp, CDTXMania.TextureFormat, false );
2225 this.st情報[ n番号 ].txタイトル名.vc拡大縮小倍率 = new Vector3( f拡大率X, 0.5f, 1f );
2226 }
2227 }
2228 catch( CTextureCreateFailedException )
2229 {
2230 Trace.TraceError( "曲名テクスチャの作成に失敗しました。[{0}]", str曲名 );
2231 this.st情報[ n番号 ].txタイトル名 = null;
2232 }
2233 }
2234 private void tティスト名テクスチャの生成( int n番号, string strティスト名 )
2235 {
2236 if( n番号 < 0 || n番号 > 12 )
2237 return;
2238
2239 try
2240 {
2241 SizeF szティスト名;
2242
2243 #region [ 曲名表示に必要となるサイズを取得する。]
2244 //-----------------
2245 using( var bmpDummy = new Bitmap( 1, 1 ) )
2246 {
2247 var g = Graphics.FromImage( bmpDummy );
2248 g.PageUnit = GraphicsUnit.Pixel;
2249 szティスト名 = g.MeasureString( strティスト名, this.