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 410 - (show annotations) (download)
Mon Aug 11 09:56:36 2014 UTC (9 years, 7 months ago) by kairera0467
File size: 125677 byte(s)
#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.b登場アニメ全部完了 = false;
561 this.n目標のスクロルカウンタ = 0;
562 this.n現在のスクロルカウンタ = 0;
563 this.nスクロルタイマ = -1;
564
565 // フォント作成。
566 // 曲リスト文字は2倍(面積4倍)でテクスチャに描画してから縮小表示するので、フォントサイズは2倍とする。
567
568 FontStyle regular = FontStyle.Regular;
569 if( CDTXMania.ConfigIni.b選曲リストフォントを斜体にする ) regular |= FontStyle.Italic;
570 if( CDTXMania.ConfigIni.b選曲リストフォントを太字にする ) regular |= FontStyle.Bold;
571 this.ft曲リスト用フォント = new Font( CDTXMania.ConfigIni.str選曲リストフォント, (float) ( CDTXMania.ConfigIni.n選曲リストフォントのサイズdot * 2 ), regular, GraphicsUnit.Pixel );
572 //this.prvFont = new CPrivateFont( new FontFamily( CDTXMania.ConfigIni.str選曲リストフォント ), 28, FontStyle.Regular );
573
574 // 現在選択中の曲がない(=はじめての活性化)なら、現在選択中の曲をルートの先頭ノードに設定する。
575
576 if( ( this.r現在選択中の曲 == null ) && ( CDTXMania.Songs管理.list曲ル.Count > 0 ) )
577 this.r現在選択中の曲 = CDTXMania.Songs管理.list曲ル[ 0 ];
578
579
580 // バー情報を初期化する。
581
582 this.tの初期化();
583
584 base.On活性化();
585
586 this.t選択曲が変更された(true); // #27648 2012.3.31 yyagi 選曲画面に入った直後の 現在位置/全アイテム数 の表示を正しく行うため
587 }
588 public override void On非活性化()
589 {
590 if( this.b活性化してない )
591 return;
592
593 CDTXMania.t安全にDisposeする( ref this.ft曲リスト用フォント );
594 if( this.prvFont != null )
595 this.prvFont.Dispose();
596
597 for( int i = 0; i < 13; i++ )
598 this.ct登場アニメ用[ i ] = null;
599
600 base.On非活性化();
601 }
602 public override void OnManagedリソスの作成()
603 {
604 if( this.b活性化してない )
605 return;
606
607 this.txスキル数字 = CDTXMania.tテクスチャの生成( CSkin.Path(@"Graphics\ScreenSelect skill number on list.png" ), false );
608 this.tx選曲パネル = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_image_panel_guitar.png"));
609
610 if ( this.tx選曲パネル == null || CDTXMania.ConfigIni.bDrums有効 )
611 this.tx選曲パネル = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_image_panel.png"));
612
613 this.txパネル = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_music panel.png"));
614 this.tx = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_backpanel.png" ) );
615 this.tx色帯 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_ColorBar.png" ) );
616 this.txランプ用帯 = CDTXMania.tテクスチャの生成( CSkin.Path(@"Graphics\5_lamppanel.png" ));
617
618 this.txクリアランプ = CDTXMania.tテクスチャの生成( CSkin.Path(@"Graphics\5_Clearlamp.png") );
619 #region[ テクスチャの復元 ]
620 int nKeys = this.dicThumbnail.Count;
621 string[] keys = new string[ nKeys ];
622 this.dicThumbnail.Keys.CopyTo( keys, 0 );
623 foreach (var key in keys)
624 this.dicThumbnail[ key ] = this.tパスを指定してサムネイル画像を生成して返す( 0, key, this.st情報[ 0 ].e種別 );;
625
626 //ここは最初に表示される画像の復元に必要。
627 for (int i = 0; i < 13; i++)
628 {
629 this.t曲名バの生成(i, this.st情報[i].strタイトル文字列, this.st情報[i].col文字色);
630 this.tティスト名テクスチャの生成( i, this.st情報[ i ].strティスト名 );
631 this.tパネルの生成( i, this.st情報[ i ].strタイトル文字列, this.st情報[ i ].strティスト名, this.st情報[ i ].col文字色 );
632 //this.tパスを指定してサムネイル画像を生成する(i, this.stバー情報[i].strDTXフォルダのパス, this.stバー情報[i].eバー種別);
633 if( this.st情報[ i ].strDTXフォルダのパス != null )
634 {
635 if( !this.dicThumbnail.ContainsKey( this.st情報[ i ].strDTXフォルダのパス ) )
636 {
637 //txTumbnail = this.tサムネイルテクスチャを作成する( Path.GetDirectoryName( song.ScoreFile ) );
638 this.tパスを指定してサムネイル画像を生成する( i, this.st情報[ i ].strDTXフォルダのパス, this.st情報[ i ].e種別 );
639 this.dicThumbnail.Add( this.st情報[ i ].strDTXフォルダのパス, this.txTumbnail[ i ] );
640 }
641 txTumbnail[ i ] = this.dicThumbnail[ this.st情報[ i ].strDTXフォルダのパス ];
642 }
643 }
644 #endregion
645
646
647 int c = ( CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja" ) ? 0 : 1;
648 #region [ Songs not found画像 ]
649 try
650 {
651 using( Bitmap image = new Bitmap( 640, 128 ) )
652 using( Graphics graphics = Graphics.FromImage( image ) )
653 {
654 string[] s1 = { "曲データが見つかりません。", "Songs not found." };
655 string[] s2 = { "曲データをDTXManiaGR.exe以下の", "You need to install songs." };
656 string[] s3 = { "フォルダにインストールして下さい。", "" };
657 graphics.DrawString( s1[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float) 2f, (float) 2f );
658 graphics.DrawString( s1[c], this.ft曲リスト用フォント, Brushes.White, (float) 0f, (float) 0f );
659 graphics.DrawString( s2[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float) 2f, (float) 44f );
660 graphics.DrawString( s2[c], this.ft曲リスト用フォント, Brushes.White, (float) 0f, (float) 42f );
661 graphics.DrawString( s3[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float) 2f, (float) 86f );
662 graphics.DrawString( s3[c], this.ft曲リスト用フォント, Brushes.White, (float) 0f, (float) 84f );
663
664 this.txSongNotFound = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );
665
666 this.txSongNotFound.vc拡大縮小倍率 = new Vector3( 0.5f, 0.5f, 1f ); // 半分のサイズで表示する。
667 }
668 }
669 catch( CTextureCreateFailedException )
670 {
671 Trace.TraceError( "SoungNotFoundテクスチャの作成に失敗しました。" );
672 this.txSongNotFound = null;
673 }
674 #endregion
675 #region [ "曲データを検索しています"画像 ]
676 try
677 {
678 using ( Bitmap image = new Bitmap( 640, 96 ) )
679 using ( Graphics graphics = Graphics.FromImage( image ) )
680 {
681 string[] s1 = { "曲データを検索しています。", "Now enumerating songs." };
682 string[] s2 = { "そのまましばらくお待ち下さい。", "Please wait..." };
683 graphics.DrawString( s1[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float) 2f, (float) 2f );
684 graphics.DrawString( s1[c], this.ft曲リスト用フォント, Brushes.White, (float) 0f, (float) 0f );
685 graphics.DrawString( s2[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float) 2f, (float) 44f );
686 graphics.DrawString( s2[c], this.ft曲リスト用フォント, Brushes.White, (float) 0f, (float) 42f );
687
688 this.txEnumeratingSongs = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );
689
690 this.txEnumeratingSongs.vc拡大縮小倍率 = new Vector3( 0.5f, 0.5f, 1f ); // 半分のサイズで表示する。
691 }
692 }
693 catch ( CTextureCreateFailedException )
694 {
695 Trace.TraceError( "txEnumeratingSongsテクスチャの作成に失敗しました。" );
696 this.txEnumeratingSongs = null;
697 }
698 #endregion
699 #region [ 曲数表示 ]
700 this.txアイテム数数字 = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_skill number on gauge etc.png"), false);
701 #endregion
702
703 base.OnManagedリソスの作成();
704 }
705 public override void OnManagedリソスの解放()
706 {
707 if( this.b活性化してない )
708 return;
709
710 CDTXMania.t安全にDisposeする( ref this.txアイテム数数字 );
711
712 for ( int i = 0; i < 13; i++ )
713 {
714 CDTXMania.t安全にDisposeする( ref this.st情報[ i ].txタイトル名 );
715 CDTXMania.t安全にDisposeする( ref this.st情報[ i ].txティスト名 );
716 }
717
718 if( this.tx選択されている曲の曲名 != null )
719 {
720 this.tx選択されている曲の曲名.Dispose();
721 this.tx選択されている曲の曲名 = null;
722 }
723 if( this.tx選択されている曲のアティスト名 != null )
724 {
725 this.tx選択されている曲のアティスト名.Dispose();
726 this.tx選択されている曲のアティスト名 = null;
727 }
728 #region[ ジャケット画像の解放 ]
729 int nKeys = this.dicThumbnail.Count;
730 string[] keys = new string[ nKeys ];
731 this.dicThumbnail.Keys.CopyTo( keys, 0 );
732 foreach( var key in keys )
733 {
734 C共通.tDisposeする( this.dicThumbnail[ key ] );
735 this.dicThumbnail[ key ] = null;
736 }
737 #endregion
738
739 CDTXMania.t安全にDisposeする( ref this.txスキル数字 );
740 CDTXMania.t安全にDisposeする( ref this.txEnumeratingSongs );
741 CDTXMania.t安全にDisposeする( ref this.txSongNotFound );
742 CDTXMania.t安全にDisposeする( ref this.tx選曲パネル );
743 CDTXMania.t安全にDisposeする( ref this.txパネル );
744 CDTXMania.t安全にDisposeする( ref this.txクリアランプ );
745 CDTXMania.t安全にDisposeする( ref this.tx );
746 CDTXMania.t安全にDisposeする( ref this.tx色帯 );
747 CDTXMania.t安全にDisposeする( ref this.txランプ用帯 );
748
749 base.OnManagedリソスの解放();
750 }
751 public override int On進行描画()
752 {
753 if( this.b活性化してない )
754 return 0;
755
756 #region [ 初めての進行描画 ]
757 //-----------------
758 if( this.b初めての進行描画 )
759 {
760 for( int i = 0; i < 13; i++ )
761 this.ct登場アニメ用[ i ] = new CCounter( -i * 10, 100, 3, CDTXMania.Timer );
762
763 this.nスクロルタイマ = CSound管理.rc演奏用タイマ.n現在時刻;
764 CDTXMania.stage選曲.t選択曲変更通知();
765
766 base.b初めての進行描画 = false;
767 }
768 //-----------------
769 #endregion
770
771
772 // まだ選択中の曲が決まってなければ、曲ツリールートの最初の曲にセットする。
773
774 if( ( this.r現在選択中の曲 == null ) && ( CDTXMania.Songs管理.list曲ル.Count > 0 ) )
775 this.r現在選択中の曲 = CDTXMania.Songs管理.list曲ル[ 0 ];
776
777
778 // 本ステージは、(1)登場アニメフェーズ → (2)通常フェーズ と二段階にわけて進む。
779 // 2つしかフェーズがないので CStage.eフェーズID を使ってないところがまた本末転倒。
780
781
782 // 進行。
783
784 if( !this.b登場アニメ全部完了 )
785 {
786 #region [ (1) 登場アニメフェーズの進行。]
787 //-----------------
788 for( int i = 0; i < 13; i++ ) // パネルは全13枚。
789 {
790 this.ct登場アニメ用[ i ].t進行();
791
792 if( this.ct登場アニメ用[ i ].b終了値に達した )
793 this.ct登場アニメ用[ i ].t停止();
794 }
795
796 // 全部の進行が終わったら、this.b登場アニメ全部完了 を true にする。
797
798 this.b登場アニメ全部完了 = true;
799 for( int i = 0; i < 13; i++ ) // パネルは全13枚。
800 {
801 if( this.ct登場アニメ用[ i ].b進行中 )
802 {
803 this.b登場アニメ全部完了 = false; // まだ進行中のアニメがあるなら false のまま。
804 break;
805 }
806 }
807 //-----------------
808 #endregion
809 }
810 else
811 {
812 #region [ (2) 通常フェーズの進行。]
813 //-----------------
814 long n現在時刻 = CSound管理.rc演奏用タイマ.n現在時刻;
815
816 if( n現在時刻 < this.nスクロルタイマ ) // 念のため
817 this.nスクロルタイマ = n現在時刻;
818
819 const int nアニメ間隔 = 2;
820 while( ( n現在時刻 - this.nスクロルタイマ ) >= nアニメ間隔 )
821 {
822 int n加速度 = 1;
823 int n残距離 = Math.Abs( (int) ( this.n目標のスクロルカウンタ - this.n現在のスクロルカウンタ ) );
824
825 #region [ 残距離が遠いほどスクロールを速くする(=n加速度を多くする)。]
826 //-----------------
827 if( n残距離 <= 100 )
828 {
829 n加速度 = 2;
830 }
831 else if( n残距離 <= 300 )
832 {
833 n加速度 = 3;
834 }
835 else if( n残距離 <= 500 )
836 {
837 n加速度 = 4;
838 }
839 else
840 {
841 n加速度 = 8;
842 }
843 //-----------------
844 #endregion
845
846 #region [ 加速度を加算し、現在のスクロールカウンタを目標のスクロールカウンタまで近づける。 ]
847 //-----------------
848 if( this.n現在のスクロルカウンタ < this.n目標のスクロルカウンタ ) // (A) 正の方向に未達の場合:
849 {
850 this.n現在のスクロルカウンタ += n加速度; // カウンタを正方向に移動する。
851
852 if( this.n現在のスクロルカウンタ > this.n目標のスクロルカウンタ )
853 this.n現在のスクロルカウンタ = this.n目標のスクロルカウンタ; // 到着!スクロール停止!
854 }
855
856 else if( this.n現在のスクロルカウンタ > this.n目標のスクロルカウンタ ) // (B) 負の方向に未達の場合:
857 {
858 this.n現在のスクロルカウンタ -= n加速度; // カウンタを負方向に移動する。
859
860 if( this.n現在のスクロルカウンタ < this.n目標のスクロルカウンタ ) // 到着!スクロール停止!
861 this.n現在のスクロルカウンタ = this.n目標のスクロルカウンタ;
862 }
863 //-----------------
864 #endregion
865
866 if( this.n現在のスクロルカウンタ >= 100 ) // 1行=100カウント。
867 {
868 #region [ パネルを1行上にシフトする。]
869 //-----------------
870
871 // 選択曲と選択行を1つ下の行に移動。
872
873 this.r現在選択中の曲 = this.r次の曲( this.r現在選択中の曲 );
874 this.n現在の選択行 = ( this.n現在の選択行 + 1 ) % 13;
875
876 // 選択曲から7つ下のパネル(=新しく最下部に表示されるパネル。消えてしまう一番上のパネルを再利用する)に、新しい曲の情報を記載する。
877
878 C曲リストノ song = this.r現在選択中の曲;
879 for( int i = 0; i < 7; i++ )
880 song = this.r次の曲( song );
881
882 int index = ( this.n現在の選択行 + 7 ) % 13; // 新しく最下部に表示されるパネルのインデックス(0~12)。
883 this.st情報[ index ].strタイトル文字列 = song.strタイトル;
884 this.st情報[ index ].strティスト名 = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.ティスト名;
885 this.st情報[ index ].col文字色 = song.col文字色;
886 this.st情報[ index ].strDTXフォルダのパス = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].ファイル情報.フォルダの絶対パス + song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.Preimage;
887 this.t曲名バの生成( index, this.st情報[ index ].strタイトル文字列, this.st情報[ index ].col文字色 );
888 this.tティスト名テクスチャの生成( index, this.st情報[ index ].strティスト名 );
889 this.tパネルの生成( index, this.st情報[ index ].strタイトル文字列, this.st情報[ index ].strティスト名, this.st情報[ index ].col文字色 );
890
891 if( !this.dicThumbnail.ContainsKey( this.st情報[ index ].strDTXフォルダのパス ) )
892 {
893 //txTumbnail = this.tサムネイルテクスチャを作成する( Path.GetDirectoryName( song.ScoreFile ) );
894 this.tパスを指定してサムネイル画像を生成する( index, this.st情報[ index ].strDTXフォルダのパス, this.st情報[ index ].e種別 );
895 this.dicThumbnail.Add( this.st情報[ index ].strDTXフォルダのパス, this.txTumbnail[ index ] );
896 }
897 txTumbnail[ index ] = this.dicThumbnail[ this.st情報[ index ].strDTXフォルダのパス ];
898
899
900 // stバー情報[] の内容を1行ずつずらす。
901
902 C曲リストノ song2 = this.r現在選択中の曲;
903 for( int i = 0; i < 5; i++ )
904 song2 = this.r前の曲( song2 );
905
906 for( int i = 0; i < 13; i++ )
907 {
908 int n = ( ( ( this.n現在の選択行 - 5 ) + i ) + 13 ) % 13;
909 this.st情報[ n ].e種別 = this.e曲のバ種別を返す( song2 );
910 song2 = this.r次の曲( song2 );
911 }
912
913
914 // 新しく最下部に表示されるパネル用のスキル値を取得。
915
916 for( int i = 0; i < 3; i++ )
917 this.st情報[ index ].nスキル値[ i ] = (int) song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.最大スキル[ i ];
918
919 // 1行(100カウント)移動完了。
920
921 this.n現在のスクロルカウンタ -= 100;
922 this.n目標のスクロルカウンタ -= 100;
923
924 this.t選択曲が変更された( false ); // スクロールバー用に今何番目を選択しているかを更新
925 if( this.tx選択されている曲の曲名 != null )
926 {
927 this.tx選択されている曲の曲名.Dispose();
928 this.tx選択されている曲の曲名 = null;
929 }
930 if( this.tx選択されている曲のアティスト名 != null )
931 {
932 this.tx選択されている曲のアティスト名.Dispose();
933 this.tx選択されている曲のアティスト名 = null;
934 }
935
936 if( this.n目標のスクロルカウンタ == 0 )
937 CDTXMania.stage選曲.t選択曲変更通知(); // スクロール完了=選択曲変更!
938
939 //-----------------
940 #endregion
941 }
942 else if( this.n現在のスクロルカウンタ <= -100 )
943 {
944 #region [ パネルを1行下にシフトする。]
945 //-----------------
946
947 // 選択曲と選択行を1つ上の行に移動。
948
949 this.r現在選択中の曲 = this.r前の曲( this.r現在選択中の曲 );
950 this.n現在の選択行 = ( ( this.n現在の選択行 - 1 ) + 13 ) % 13;
951
952 // 選択曲から5つ上のパネル(=新しく最上部に表示されるパネル。消えてしまう一番下のパネルを再利用する)に、新しい曲の情報を記載する。
953
954 C曲リストノ song = this.r現在選択中の曲;
955 for( int i = 0; i < 5; i++ )
956 song = this.r前の曲( song );
957
958 int index = ( ( this.n現在の選択行 - 5 ) + 13 ) % 13; // 新しく最上部に表示されるパネルのインデックス(0~12)。
959 this.st情報[ index ].strタイトル文字列 = song.strタイトル;
960 this.st情報[ index ].strティスト名 = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song) ].譜面情報.ティスト名;
961 this.st情報[ index ].col文字色 = song.col文字色;
962 this.st情報[ index ].strDTXフォルダのパス = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].ファイル情報.フォルダの絶対パス + song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.Preimage;
963 this.t曲名バの生成( index, this.st情報[ index ].strタイトル文字列, this.st情報[ index ].col文字色 );
964 this.tティスト名テクスチャの生成( index, this.st情報[ index ].strティスト名 );
965 this.tパネルの生成( index, this.st情報[ index ].strタイトル文字列, this.st情報[ index ].strティスト名, this.st情報[ index ].col文字色 );
966
967 if( !this.dicThumbnail.ContainsKey( this.st情報[ index ].strDTXフォルダのパス ) )
968 {
969 //txTumbnail = this.tサムネイルテクスチャを作成する( Path.GetDirectoryName( song.ScoreFile ) );
970 this.tパスを指定してサムネイル画像を生成する( index, this.st情報[ index ].strDTXフォルダのパス, this.st情報[ index ].e種別 );
971 this.dicThumbnail.Add( this.st情報[ index ].strDTXフォルダのパス, this.txTumbnail[ index ] );
972 }
973 txTumbnail[ index ] = this.dicThumbnail[ this.st情報[ index ].strDTXフォルダのパス ];
974
975
976 // stバー情報[] の内容を1行ずつずらす。
977
978 C曲リストノ song2 = this.r現在選択中の曲;
979 for( int i = 0; i < 5; i++ )
980 song2 = this.r前の曲( song2 );
981
982 for( int i = 0; i < 13; i++ )
983 {
984 int n = ( ( ( this.n現在の選択行 - 5 ) + i ) + 13 ) % 13;
985 this.st情報[ n ].e種別 = this.e曲のバ種別を返す( song2 );
986 song2 = this.r次の曲( song2 );
987 }
988
989
990 // 新しく最上部に表示されるパネル用のスキル値を取得。
991
992 for( int i = 0; i < 3; i++ )
993 this.st情報[ index ].nスキル値[ i ] = (int) song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.最大スキル[ i ];
994
995
996 // 1行(100カウント)移動完了。
997
998 this.n現在のスクロルカウンタ += 100;
999 this.n目標のスクロルカウンタ += 100;
1000
1001
1002 this.t選択曲が変更された( false ); // スクロールバー用に今何番目を選択しているかを更新
1003 if( this.tx選択されている曲の曲名 != null )
1004 {
1005 this.tx選択されている曲の曲名.Dispose();
1006 this.tx選択されている曲の曲名 = null;
1007 }
1008 if( this.tx選択されている曲のアティスト名 != null )
1009 {
1010 this.tx選択されている曲のアティスト名.Dispose();
1011 this.tx選択されている曲のアティスト名 = null;
1012 }
1013
1014 if( this.n目標のスクロルカウンタ == 0 )
1015 CDTXMania.stage選曲.t選択曲変更通知(); // スクロール完了=選択曲変更!
1016 //-----------------
1017 #endregion
1018 }
1019
1020 this.nスクロルタイマ += nアニメ間隔;
1021 }
1022 //-----------------
1023 #endregion
1024 }
1025
1026
1027 // 描画。
1028
1029 if( this.r現在選択中の曲 == null )
1030 {
1031 #region [ 曲が1つもないなら「Songs not found.」を表示してここで帰れ。]
1032 //-----------------
1033 if ( bIsEnumeratingSongs )
1034 {
1035 if ( this.txEnumeratingSongs != null )
1036 {
1037 this.txEnumeratingSongs.t2D描画( CDTXMania.app.Device, 530, 240 );
1038 }
1039 }
1040 else
1041 {
1042 if ( this.txSongNotFound != null )
1043 this.txSongNotFound.t2D描画( CDTXMania.app.Device, 500, 190 );
1044 }
1045 //-----------------
1046 #endregion
1047
1048 return 0;
1049 }
1050 var bar = SlimDX.Matrix.Identity;
1051 var barL = SlimDX.Matrix.Identity;
1052 bar *= SlimDX.Matrix.RotationY(-0.415f);
1053 barL *= SlimDX.Matrix.RotationY(0.415f);
1054 bar *= SlimDX.Matrix.Translation(540f, 20f, -24f);
1055 barL *= SlimDX.Matrix.Translation(-540f, 20f, -24f);
1056 bar *= SlimDX.Matrix.Scaling(1.0f, 0.65f, 1.0f);
1057 barL *= SlimDX.Matrix.Scaling(1.0f, 0.65f, 1.0f);
1058
1059 this.tx.t3D描画(CDTXMania.app.Device, bar); //右の帯。
1060 this.tx.t3D描画(CDTXMania.app.Device, barL); //右の帯。
1061 this.tx色帯.n透明度 = 155 + this.ct登場アニメ用[10].n現在の値;
1062 this.tx色帯.t3D描画( CDTXMania.app.Device, bar );
1063 this.tx色帯.t3D描画( CDTXMania.app.Device, barL );
1064
1065 #region [ デバッグ補助 ]
1066 //-----------------
1067 /*
1068 stマトリックス座標 = new ST中心点[] {
1069 new ST中心点() { x = -940.0000f, y = 4f, z = 320f, rotY = 0.4150f },
1070 new ST中心点() { x = -740.0000f, y = 4f, z = 230f, rotY = 0.4150f },
1071 new ST中心点() { x = -550.0000f, y = 4f, z = 150f, rotY = 0.4150f },
1072 new ST中心点() { x = -370.0000f, y = 4f, z = 70f, rotY = 0.4150f },
1073 new ST中心点() { x = -194.0000f, y = 4f, z = -6f, rotY = 0.4150f },
1074 new ST中心点() { x = 6.00002622683f, y = 2f, z = 0f, rotY = 0f },
1075 new ST中心点() { x = 204.0000f, y = 4f, z = 0f, rotY = -0.4150f },
1076 new ST中心点() { x = 362.0000f, y = 4f, z = 70f, rotY = -0.4150f },
1077 new ST中心点() { x = 528.0000f, y = 4f, z = 146f, rotY = -0.4150f },
1078 new ST中心点() { x = 686.0000f, y = 4f, z = 212f, rotY = -0.4150f },
1079 new ST中心点() { x = 848.0000f, y = 4f, z = 282f, rotY = -0.4150f },
1080 new ST中心点() { x = 1200.0000f, y = 4f, z = 450f, rotY = -0.4150f },
1081 new ST中心点() { x = 1500.0000f, y = 4f, z = -289.5575f, rotY = -0.9279888f },
1082 new ST中心点() { x = 1500.0000f, y = 4f, z = -289.5575f, rotY = -0.9279888f },
1083 };
1084 */
1085 //-----------------
1086 #endregion
1087
1088
1089 if( !this.b登場アニメ全部完了 )
1090 {
1091 #region [ (1) 登場アニメフェーズの描画。]
1092 //-----------------
1093 for( int i = 0; i < 13; i++ ) // パネルは全13枚。
1094 {
1095 if( this.ct登場アニメ用[ i ].n現在の値 >= 0 )
1096 {
1097 int nパネル番号 = ( ( ( this.n現在の選択行 - 5 ) + i ) + 13 ) % 13;
1098
1099 if( i == 6 )
1100 {
1101 #region [ ジャケット画像の描画 ]
1102 //-----------------
1103 if( this.txパネル != null )
1104 {
1105 var mat = SlimDX.Matrix.Identity;
1106 mat *= SlimDX.Matrix.Scaling( 0.62f, 0.88f, 1.0f );
1107 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[ i ].rotY + (this.stマトリックス座標[ i ].rotY - this.stマトリックス座標[i].rotY));
1108 mat *= SlimDX.Matrix.Translation(
1109 ( this.stマトリックス座標[ i ].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1110 ( this.stマトリックス座標[ i ].y + 2 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1111 ( this.stマトリックス座標[ i ].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1112 this.st情報[nパネル番号].txパネル.t3D描画(CDTXMania.app.Device, mat);
1113 }
1114 if( this.txTumbnail[nパネル番号] != null )
1115 {
1116 float f拡大率 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Width;
1117 float f拡大率2 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Height;
1118 var mat = SlimDX.Matrix.Identity;
1119 mat *= SlimDX.Matrix.Scaling(f拡大率 * CTexture.f画面比率 - 0.084f, f拡大率2 * CTexture.f画面比率 + 0.05f, 1.0f);
1120 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1121 mat *= SlimDX.Matrix.Translation(
1122 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1123 (this.stマトリックス座標[i].y + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率 - 1f,
1124 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1125 this.txTumbnail[nパネル番号].t3D描画(CDTXMania.app.Device, mat);
1126 }
1127 //-----------------
1128 #endregion
1129 #region [ タイトル名テクスチャを描画。]
1130 //-----------------
1131 if( this.st情報[nパネル番号].txタイトル名 != null )
1132 {
1133 //this.stバー情報[ nパネル番号 ].txタイトル名.t2D描画( CDTXMania.app.Device, x + 0x58, y + 8 );
1134 var mat = SlimDX.Matrix.Identity;
1135 mat *= SlimDX.Matrix.Scaling( 0.35f, 0.45f, 1.0f );
1136 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[ i ].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1137 mat *= SlimDX.Matrix.Translation(
1138 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1139 (this.stマトリックス座標[i].y + 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1140 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1141 //this.stバー情報[nパネル番号].txタイトル名.t3D描画(CDTXMania.app.Device, mat);
1142 }
1143 if (this.st情報[nパネル番号].txティスト名 != null)
1144 {
1145 var mat = SlimDX.Matrix.Identity;
1146 mat *= SlimDX.Matrix.Scaling(0.35f, 0.45f, 1.0f);
1147 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1148 mat *= SlimDX.Matrix.Translation(
1149 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1150 (this.stマトリックス座標[i].y - 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1151 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1152 //this.stバー情報[nパネル番号].txアーティスト名.t3D描画(CDTXMania.app.Device, mat);
1153 }
1154 //-----------------
1155 #endregion
1156 if( this.tx選曲パネル != null )
1157 this.tx選曲パネル.t2D描画( CDTXMania.app.Device, 761, 233, new Rectangle( 304, 70, 59, 242 ) );
1158 }
1159 else if( i == 5 )
1160 {
1161 // (A) 選択曲パネルを描画。
1162 if( this.tx選曲パネル != null )
1163 this.tx選曲パネル.t2D描画( CDTXMania.app.Device, 531, 243, new Rectangle( 74, 80, 230, 230 ) ); //真ん中の部分は別々に描画。
1164 if( this.txランプ用帯 != null )
1165 {
1166 this.txランプ用帯.t3D描画( CDTXMania.app.Device, bar ); //右の帯。
1167 this.txランプ用帯.t3D描画( CDTXMania.app.Device, barL ); //右の帯。
1168 }
1169 #region [ バーテクスチャを描画。]
1170 //-----------------
1171 if( this.txパネル != null )
1172 {
1173 var mat = SlimDX.Matrix.Identity;
1174 mat *= SlimDX.Matrix.Scaling(0.8f, 0.8f, 1.0f);
1175 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1176 mat *= SlimDX.Matrix.Translation(
1177 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1178 (this.stマトリックス座標[i].y + 2 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1179 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1180 this.txパネル.t3D描画(CDTXMania.app.Device, mat);
1181 }
1182 if( this.tx選曲パネル != null )
1183 this.tx選曲パネル.t2D描画( CDTXMania.app.Device, 457, 163, new Rectangle( 0, 0, 363, 368 ) );
1184 //-----------------
1185 #endregion
1186 #region [ ジャケット画像の描画 ]
1187 //-----------------
1188 for( int la = 0; la < 5 ; la++ )
1189 {
1190 if( this.txクリアランプ != null && CDTXMania.stage選曲.r現在選択中の曲.ar難易度ラベル[ la ] != null && CDTXMania.stage選曲.r現在選択中の曲.arスコア[ la ] != null )
1191 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));
1192 }
1193 if( this.txTumbnail[ nパネル番号 ] != null )
1194 {
1195 float f拡大率 = (float)218.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Width;
1196 float f拡大率2 = (float)218.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Height;
1197 this.txTumbnail[ nパネル番号 ].vc拡大縮小倍率 = new Vector3( f拡大率, f拡大率2, 1.0f );
1198 this.txTumbnail[ nパネル番号 ].t2D描画(CDTXMania.app.Device, 537, 249 );
1199 this.txTumbnail[ nパネル番号 ].vc拡大縮小倍率 = new Vector3( 1.0f, 1.0f, 1.0f );
1200 }
1201 //-----------------
1202 #endregion
1203 #region [ タイトル名テクスチャを描画。]
1204 //-----------------
1205 if( this.st情報[ nパネル番号 ].strタイトル文字列 != "" && this.st情報[ nパネル番号 ].strタイトル文字列 != null && this.tx選択されている曲の曲名 == null )
1206 this.tx選択されている曲の曲名 = this.t指定された文字テクスチャを生成する( this.st情報[ nパネル番号 ].strタイトル文字列 );
1207 if( this.st情報[ nパネル番号 ].strティスト名 != "" && this.st情報[ nパネル番号 ].strティスト名 != null && this.tx選択されている曲のアティスト名 == null )
1208 this.tx選択されている曲のアティスト名 = this.t指定された文字テクスチャを生成する( this.st情報[ nパネル番号 ].strティスト名 );
1209
1210 if( this.tx選択されている曲の曲名 != null )
1211 this.tx選択されている曲の曲名.t2D描画( CDTXMania.app.Device, 552, 210 );
1212 if( this.tx選択されている曲のアティスト名 != null )
1213 this.tx選択されている曲のアティスト名.t2D描画(CDTXMania.app.Device, 770 - this.st情報[ nパネル番号 ].nティスト名テクスチャの長さdot, 470);
1214 //if( this.stバー情報[ nパネル番号 ].txタイトル名 != null )
1215 // this.stバー情報[ nパネル番号 ].txタイトル名.t2D描画( CDTXMania.app.Device, 556, 210 );
1216 //if (this.stバー情報[ nパネル番号 ].txアーティスト名 != null)
1217 // this.stバー情報[ nパネル番号 ].txアーティスト名.t2D描画(CDTXMania.app.Device, 560 - 770 - this.stバー情報[ nパネル番号 ].nアーティスト名テクスチャの長さdot, 402);
1218 //-----------------
1219 #endregion
1220 }
1221 else
1222 {
1223 // (B) その他のパネルの描画。
1224 #region [ ジャケット画像の描画 ]
1225 //-----------------
1226 if( this.txパネル != null )
1227 {
1228 var mat = SlimDX.Matrix.Identity;
1229 mat *= SlimDX.Matrix.Scaling(0.62f, 0.88f, 1.0f);
1230 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1231 mat *= SlimDX.Matrix.Translation(
1232 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1233 (this.stマトリックス座標[i].y + 2 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1234 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1235 this.st情報[nパネル番号].txパネル.t3D描画(CDTXMania.app.Device, mat);
1236 }
1237 if( this.txTumbnail[ nパネル番号 ] != null )
1238 {
1239 float f拡大率 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Width;
1240 float f拡大率2 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Height;
1241 var mat = SlimDX.Matrix.Identity;
1242 mat *= SlimDX.Matrix.Scaling(f拡大率 * CTexture.f画面比率 - 0.084f, f拡大率2 * CTexture.f画面比率 + 0.05f, 1.0f);
1243 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1244 mat *= SlimDX.Matrix.Translation(
1245 (this.stマトリックス座標[ i ].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1246 (this.stマトリックス座標[ i ].y + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1247 (this.stマトリックス座標[ i ].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1248 this.txTumbnail[nパネル番号].t3D描画(CDTXMania.app.Device, mat);
1249 }
1250 //-----------------
1251 #endregion
1252 #region [ タイトル名テクスチャを描画。]
1253 //-----------------
1254 if( this.txランプ用帯 != null )
1255 this.txランプ用帯.t3D描画( CDTXMania.app.Device, bar ); //右の帯。
1256 if( this.tx選曲パネル != null )
1257 this.tx選曲パネル.t2D描画( CDTXMania.app.Device, 761, 233, new Rectangle( 304, 70, 59, 242 ) );
1258 if (this.st情報[ nパネル番号 ].txタイトル名 != null)
1259 {
1260 var mat = SlimDX.Matrix.Identity;
1261 mat *= SlimDX.Matrix.Scaling(0.35f, 0.45f, 1.0f);
1262 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1263 mat *= SlimDX.Matrix.Translation(
1264 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1265 (this.stマトリックス座標[i].y + 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1266 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1267 //this.stバー情報[nパネル番号].txタイトル名.t3D描画(CDTXMania.app.Device, mat);
1268 }
1269 if (this.st情報[nパネル番号].txティスト名 != null)
1270 {
1271 var mat = SlimDX.Matrix.Identity;
1272 mat *= SlimDX.Matrix.Scaling(0.35f, 0.45f, 1.0f);
1273 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1274 mat *= SlimDX.Matrix.Translation(
1275 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1276 (this.stマトリックス座標[i].y - 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1277 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1278 //this.stバー情報[nパネル番号].txアーティスト名.t3D描画(CDTXMania.app.Device, mat);
1279 }
1280 //-----------------
1281 #endregion
1282 }
1283 }
1284 }
1285 //-----------------
1286 #endregion
1287
1288 }
1289 else
1290 {
1291
1292 #region [ (2) 通常フェーズの描画。]
1293 //-----------------
1294 for( int i = 0; i < 13; i++ ) // パネルは全13枚。
1295 {
1296 int nパネル番号 = ( ( ( this.n現在の選択行 - 5 ) + i ) + 13 ) % 13;
1297 int n見た目の行番号 = i;
1298 int n次のパネル番号 = ( this.n現在のスクロルカウンタ <= 0 ) ? ( ( i + 1 ) % 13 ) : ( ( ( i - 1 ) + 13 ) % 13 );
1299 int x = this.ptの基本座標[ n見た目の行番号 ].X + ( (int) ( ( this.ptの基本座標[ n次のパネル番号 ].X - this.ptの基本座標[ n見た目の行番号 ].X ) * ( ( (double) Math.Abs( this.n現在のスクロルカウンタ ) ) / 100.0 ) ) );
1300 int y = this.ptの基本座標[ n見た目の行番号 ].Y + ( (int) ( ( this.ptの基本座標[ n次のパネル番号 ].Y - this.ptの基本座標[ n見た目の行番号 ].Y ) * ( ( (double) Math.Abs( this.n現在のスクロルカウンタ ) ) / 100.0 ) ) );
1301 float fX = this.n現在のスクロルカウンタ <= 0 ? this.stマトリックス座標[ n見た目の行番号 ].x + ( ( ( this.stマトリックス座標[ n次のパネル番号 ].x - this.stマトリックス座標[ n見た目の行番号 ].x ) * ( ( this.n現在のスクロルカウンタ ) ) / 100.0f ) ) :
1302 this.stマトリックス座標[ n見た目の行番号 ].x + ( ( ( this.stマトリックス座標[ n次のパネル番号 ].x + this.stマトリックス座標[ n見た目の行番号 ].x ) * ( ( this.n現在のスクロルカウンタ ) ) / 100.0f ) );
1303
1304 float fY = this.n現在のスクロルカウンタ <= 0 ? this.stマトリックス座標[ n見た目の行番号 ].y + ( ( ( this.stマトリックス座標[ n次のパネル番号 ].y - this.stマトリックス座標[ n見た目の行番号 ].y ) * ( ( this.n現在のスクロルカウンタ ) ) / 100.0f ) ) :
1305 this.stマトリックス座標[ n見た目の行番号 ].y + ( ( ( this.stマトリックス座標[ n次のパネル番号 ].y - this.stマトリックス座標[ n見た目の行番号 ].y ) * ( ( this.n現在のスクロルカウンタ ) ) / 100.0f ) );
1306
1307 float fZ = this.n現在のスクロルカウンタ <= 0 ? this.stマトリックス座標[ n見た目の行番号 ].z + ( ( ( this.stマトリックス座標[ n次のパネル番号 ].z - this.stマトリックス座標[ n見た目の行番号 ].z ) * ( ( this.n現在のスクロルカウンタ ) ) / 100.0f ) ) :
1308 this.stマトリックス座標[ n見た目の行番号 ].z + ( ( ( this.stマトリックス座標[ n次のパネル番号 ].z + this.stマトリックス座標[ n見た目の行番号 ].z ) * ( ( this.n現在のスクロルカウンタ ) ) / 100.0f ) );
1309
1310 if (i == 6)
1311 {
1312 #region [ ジャケット画像の描画 ]
1313 //-----------------
1314 if( this.txパネル != null )
1315 {
1316 var mat = SlimDX.Matrix.Identity;
1317 mat *= SlimDX.Matrix.Scaling(0.62f, 0.88f, 1.0f);
1318 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1319 mat *= SlimDX.Matrix.Translation(
1320 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1321 (this.stマトリックス座標[i].y + 2 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1322 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1323 this.st情報[ nパネル番号 ].txパネル.t3D描画(CDTXMania.app.Device, mat);
1324 }
1325 if (this.txTumbnail[nパネル番号] != null)
1326 {
1327 float f拡大率 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Width;
1328 float f拡大率2 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Height;
1329 var mat = SlimDX.Matrix.Identity;
1330 mat *= SlimDX.Matrix.Scaling(f拡大率 * CTexture.f画面比率 - 0.084f, f拡大率2 * CTexture.f画面比率 + 0.05f, 1.0f);
1331 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1332 mat *= SlimDX.Matrix.Translation(
1333 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1334 (this.stマトリックス座標[i].y + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率 - 1f,
1335 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1336 this.txTumbnail[nパネル番号].t3D描画(CDTXMania.app.Device, mat);
1337 }
1338 //-----------------
1339 #endregion
1340 #region [ タイトル名テクスチャを描画。]
1341 //-----------------
1342 if (this.st情報[nパネル番号].txタイトル名 != null)
1343 {
1344 //this.stバー情報[ nパネル番号 ].txタイトル名.t2D描画( CDTXMania.app.Device, x + 0x58, y + 8 );
1345 var mat = SlimDX.Matrix.Identity;
1346 mat *= SlimDX.Matrix.Scaling(0.35f, 0.45f, 1.0f);
1347 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1348 mat *= SlimDX.Matrix.Translation(
1349 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1350 (this.stマトリックス座標[i].y + 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1351 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1352 //this.stバー情報[nパネル番号].txタイトル名.t3D描画(CDTXMania.app.Device, mat);
1353 }
1354 if (this.st情報[nパネル番号].txティスト名 != null)
1355 {
1356 var mat = SlimDX.Matrix.Identity;
1357 mat *= SlimDX.Matrix.Scaling(0.35f, 0.45f, 1.0f);
1358 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1359 mat *= SlimDX.Matrix.Translation(
1360 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1361 (this.stマトリックス座標[i].y - 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1362 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1363 //this.stバー情報[nパネル番号].txアーティスト名.t3D描画(CDTXMania.app.Device, mat);
1364 }
1365 //-----------------
1366 #endregion
1367 }
1368 else if( ( i == 5 ) )
1369 {
1370 if( this.txランプ用帯 != null )
1371 this.txランプ用帯.t3D描画( CDTXMania.app.Device, barL ); //右の帯。
1372 //for (int la = 0; la < 5; la++)
1373 {
1374 //if( this.stバー情報[ 6 ].ar難易度ラベル[ la ] != null )
1375 {
1376 //var lamp = SlimDX.Matrix.Identity;
1377 //lamp *= SlimDX.Matrix.Translation(
1378 //( this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x ) )) * CTexture.f画面比率,
1379 //( this.stマトリックス座標[i].y + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y ) ) ) * CTexture.f画面比率 - 1f - la * 13f,
1380 //( this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z ) ) ) * CTexture.f画面比率);
1381
1382 //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));
1383 }
1384 }
1385 if( this.tx選曲パネル != null )
1386 this.tx選曲パネル.t2D描画(CDTXMania.app.Device, 531, 243, new Rectangle(74, 80, 230, 230)); //真ん中の部分は別々に描画。
1387 // (A) スクロールが停止しているときの選択曲バーの描画。
1388 #region [ ジャケット画像の描画 ]
1389 //-----------------
1390 if( this.txパネル != null )
1391 {
1392 var mat = SlimDX.Matrix.Identity;
1393 mat *= SlimDX.Matrix.Scaling(CTexture.f画面比率, CTexture.f画面比率, 1.0f);
1394 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1395 mat *= SlimDX.Matrix.Translation(
1396 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1397 (this.stマトリックス座標[i].y + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1398 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1399 this.st情報[nパネル番号].txパネル.t3D描画(CDTXMania.app.Device, mat);
1400 }
1401 if( this.tx選曲パネル != null )
1402 this.tx選曲パネル.t2D描画(CDTXMania.app.Device, 457, 163, new Rectangle(0, 0, 363, 368));
1403
1404 for( int la = 0; la < 5 ; la++ )
1405 {
1406 if( this.txクリアランプ != null && CDTXMania.stage選曲.r現在選択中の曲.ar難易度ラベル[ la ] != null && CDTXMania.stage選曲.r現在選択中の曲.arスコア[ la ] != null )
1407 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));
1408 }
1409 if( this.txTumbnail[ nパネル番号 ] != null )
1410 {
1411 float f拡大率 = (float)218.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Width;
1412 float f拡大率2 = (float)218.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Height;
1413 this.txTumbnail[ nパネル番号 ].vc拡大縮小倍率 = new Vector3( f拡大率, f拡大率2, 1.0f );
1414 this.txTumbnail[ nパネル番号 ].t2D描画(CDTXMania.app.Device, 537, 249 );
1415 this.txTumbnail[ nパネル番号 ].vc拡大縮小倍率 = new Vector3( 1.0f, 1.0f, 1.0f );
1416 }
1417 //-----------------
1418 #endregion
1419 #region [ タイトル名テクスチャを描画。]
1420 //-----------------
1421 if( this.st情報[ nパネル番号 ].strタイトル文字列 != "" && this.st情報[ nパネル番号 ].strタイトル文字列 != null && this.tx選択されている曲の曲名 == null )
1422 this.tx選択されている曲の曲名 = this.t指定された文字テクスチャを生成する( this.st情報[ nパネル番号 ].strタイトル文字列 );
1423 if( this.st情報[ nパネル番号 ].strティスト名 != "" && this.st情報[ nパネル番号 ].strティスト名 != null && this.tx選択されている曲のアティスト名 == null )
1424 this.tx選択されている曲のアティスト名 = this.t指定された文字テクスチャを生成する( this.st情報[ nパネル番号 ].strティスト名 );
1425
1426 if( this.tx選択されている曲の曲名 != null )
1427 this.tx選択されている曲の曲名.t2D描画( CDTXMania.app.Device, 552, 210 );
1428 if( this.tx選択されている曲のアティスト名 != null )
1429 this.tx選択されている曲のアティスト名.t2D描画( CDTXMania.app.Device, 770 - this.st情報[ nパネル番号 ].nティスト名テクスチャの長さdot, 470);
1430 //if( this.stバー情報[ nパネル番号 ].txタイトル名 != null )
1431 // this.stバー情報[ nパネル番号 ].txタイトル名.t2D描画( CDTXMania.app.Device, 556, 210 );
1432 //if (this.stバー情報[ nパネル番号 ].txアーティスト名 != null)
1433 // this.stバー情報[ nパネル番号 ].txアーティスト名.t2D描画(CDTXMania.app.Device, 560 - 770 - this.stバー情報[ nパネル番号 ].nアーティスト名テクスチャの長さdot, 402);
1434 //-----------------
1435 #endregion
1436 }
1437 else if (i >= 12)
1438 {
1439 }
1440 else
1441 {
1442 // (B) スクロール中の選択曲バー、またはその他のバーの描画。
1443 if( this.txランプ用帯 != null )
1444 this.txランプ用帯.t3D描画( CDTXMania.app.Device, bar ); //右の帯。
1445 if( this.tx選曲パネル != null )
1446 this.tx選曲パネル.t2D描画(CDTXMania.app.Device, 761, 233, new Rectangle(304, 70, 59, 242));
1447
1448 #region [ ジャケット画像の描画 ]
1449 //-----------------
1450 if( this.txパネル != null )
1451 {
1452 var mat = SlimDX.Matrix.Identity;
1453 mat *= SlimDX.Matrix.Scaling(0.62f, 0.88f, 1.0f);
1454 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1455 mat *= SlimDX.Matrix.Translation(
1456 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1457 (this.stマトリックス座標[i].y + 2 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1458 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1459 this.st情報[nパネル番号].txパネル.t3D描画(CDTXMania.app.Device, mat);
1460 }
1461 if( this.txTumbnail[nパネル番号] != null )
1462 {
1463 float f拡大率 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Width ;
1464 float f拡大率2 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Height;
1465 var mat = SlimDX.Matrix.Identity;
1466 mat *= SlimDX.Matrix.Scaling(f拡大率 * CTexture.f画面比率 - 0.084f, f拡大率2 * CTexture.f画面比率 + 0.05f, 1.0f);
1467 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1468 mat *= SlimDX.Matrix.Translation(
1469 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1470 (this.stマトリックス座標[i].y + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1471 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1472 this.txTumbnail[nパネル番号].t3D描画(CDTXMania.app.Device, mat);
1473 }
1474 //-----------------
1475 #endregion
1476 #region [ タイトル名テクスチャを描画。]
1477 //-----------------
1478 if( this.st情報[nパネル番号].txタイトル名 != null )
1479 {
1480 //this.stバー情報[ nパネル番号 ].txタイトル名.t2D描画( CDTXMania.app.Device, x + 0x58, y + 8 );
1481 var mat = SlimDX.Matrix.Identity;
1482 mat *= SlimDX.Matrix.Scaling(0.35f, 0.45f, 1.0f);
1483 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1484 mat *= SlimDX.Matrix.Translation(
1485 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1486 (this.stマトリックス座標[i].y + 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1487 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1488 //this.stバー情報[nパネル番号].txタイトル名.t3D描画(CDTXMania.app.Device, mat);
1489 }
1490 if( this.st情報[nパネル番号].txティスト名 != null )
1491 {
1492 var mat = SlimDX.Matrix.Identity;
1493 mat *= SlimDX.Matrix.Scaling(0.35f, 0.45f, 1.0f);
1494 mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1495 mat *= SlimDX.Matrix.Translation(
1496 (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1497 (this.stマトリックス座標[i].y - 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1498 (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1499 //this.stバー情報[nパネル番号].txアーティスト名.t3D描画(CDTXMania.app.Device, mat);
1500 }
1501 //-----------------
1502 #endregion
1503
1504 #region [ スキル値を描画。]
1505 //-----------------
1506 //if( ( this.stバー情報[ nパネル番号 ].eバー種別 == Eバー種別.Score ) && ( this.e楽器パート != E楽器パート.UNKNOWN ) )
1507 //this.tスキル値の描画( x + 34, y + 18, this.stバー情報[ nパネル番号 ].nスキル値[ (int) this.e楽器パート ] );
1508 //-----------------
1509 #endregion
1510 }
1511 }
1512 //-----------------
1513 #endregion
1514
1515 }
1516 #region [ スクロール地点の計算(描画はCActSelectShowCurrentPositionにて行う) #27648 ]
1517 int py;
1518 double d = 0;
1519 if ( nNumOfItems > 1 )
1520 {
1521 d = ( 336 - 8 ) / (double) ( nNumOfItems - 1 );
1522 py = (int) ( d * ( nCurrentPosition - 1 ) );
1523 }
1524 else
1525 {
1526 d = 0;
1527 py = 0;
1528 }
1529 int delta = (int) ( d * this.n現在のスクロルカウンタ / 100 );
1530 if ( py + delta <= 336 - 8 )
1531 {
1532 this.nスクロルバ相対y座標 = py + delta;
1533 }
1534 #endregion
1535
1536 #region [ アイテム数の描画 #27648 ]
1537 tアイテム数の描画();
1538 #endregion
1539 return 0;
1540 }
1541
1542
1543 // その他
1544
1545 #region [ private ]
1546 //-----------------
1547 private enum E種別 { Score, Box, Other, Random, BackBox }
1548
1549 private struct ST
1550 {
1551 public CTexture Score;
1552 public CTexture Box;
1553 public CTexture Other;
1554 public CTexture Random;
1555 public CTexture BackBox;
1556 public CTexture this[ int index ]
1557 {
1558 get
1559 {
1560 switch( index )
1561 {
1562 case 0:
1563 return this.Score;
1564
1565 case 1:
1566 return this.Box;
1567
1568 case 2:
1569 return this.Other;
1570
1571 case 3:
1572 return this.Random;
1573
1574 case 4:
1575 return this.BackBox;
1576 }
1577 throw new IndexOutOfRangeException();
1578 }
1579 set
1580 {
1581 switch( index )
1582 {
1583 case 0:
1584 this.Score = value;
1585 return;
1586
1587 case 1:
1588 this.Box = value;
1589 return;
1590
1591 case 2:
1592 this.Other = value;
1593 return;
1594
1595 case 3:
1596 this.Random = value;
1597 return;
1598
1599 case 4:
1600 this.BackBox = value;
1601 return;
1602 }
1603 throw new IndexOutOfRangeException();
1604 }
1605 }
1606 }
1607
1608 private struct ST情報
1609 {
1610 public CActSelect曲リスト.E種別 e種別;
1611 public string strタイトル文字列;
1612 public string strティスト名;
1613 public CTexture txタイトル名;
1614 public CTexture txティスト名;
1615 public CTexture txパネル;
1616 public CTexture txカスタム曲名テクスチャ;
1617 public int nティスト名テクスチャの長さdot;
1618 public int nタイトル名テクスチャの長さdot;
1619 public STDGBVALUE<int> nスキル値;
1620 public Color col文字色;
1621 public string strDTXフォルダのパス;
1622 public Cスコア.ST譜面情報 ar譜面情報;
1623 }
1624
1625 private struct ST選曲バ
1626 {
1627 public CTexture Score;
1628 public CTexture Box;
1629 public CTexture Other;
1630 public CTexture this[ int index ]
1631 {
1632 get
1633 {
1634 switch( index )
1635 {
1636 case 0:
1637 return this.Score;
1638
1639 case 1:
1640 return this.Box;
1641
1642 case 2:
1643 return this.Other;
1644 }
1645 throw new IndexOutOfRangeException();
1646 }
1647 set
1648 {
1649 switch( index )
1650 {
1651 case 0:
1652 this.Score = value;
1653 return;
1654
1655 case 1:
1656 this.Box = value;
1657 return;
1658
1659 case 2:
1660 this.Other = value;
1661 return;
1662 }
1663 throw new IndexOutOfRangeException();
1664 }
1665 }
1666 }
1667
1668 protected struct ST中心点
1669 {
1670 public float x;
1671 public float y;
1672 public float z;
1673 public float rotY;
1674 }
1675 /// <summary>
1676 /// <para>SSTFファイル絶対パス(key)とサムネイル画像(value)との辞書。</para>
1677 /// <para>アプリの起動から終了まで単純に増加を続け、要素が減ることはない。</para>
1678 /// </summary>
1679 protected Dictionary<string, CTexture> dicThumbnail = new Dictionary<string, CTexture>();
1680
1681 /// <summary>
1682 /// <para>SSTFファイル絶対パス(key)とプロパティ画像(value)との辞書。</para>
1683 /// <para>アプリの起動から終了まで単純に増加を続け、要素が減ることはない。</para>
1684 /// </summary>
1685 protected Dictionary<string, CTexture> dicProperty = new Dictionary<string, CTexture>();
1686
1687 protected ST中心点[] stマトリックス座標 = new ST中心点[] {
1688 #region [ 実は円弧配置になってない。射影行列間違ってるよスターレインボウ見せる気かよ… ]
1689 //-----------------
1690 new ST中心点() { x = -940.0000f, y = 4f, z = 320f, rotY = 0.4150f },
1691 new ST中心点() { x = -740.0000f, y = 4f, z = 230f, rotY = 0.4150f },
1692 new ST中心点() { x = -550.0000f, y = 4f, z = 150f, rotY = 0.4150f },
1693 new ST中心点() { x = -370.0000f, y = 4f, z = 70f, rotY = 0.4150f },
1694 new ST中心点() { x = -194.0000f, y = 4f, z = -6f, rotY = 0.4150f },
1695 new ST中心点() { x = 6.00002622683f, y = 2f, z = 0f, rotY = 0f },
1696 new ST中心点() { x = 204.0000f, y = 4f, z = 0f, rotY = -0.4150f },
1697 new ST中心点() { x = 362.0000f, y = 4f, z = 70f, rotY = -0.4150f },
1698 new ST中心点() { x = 528.0000f, y = 4f, z = 146f, rotY = -0.4150f },
1699 new ST中心点() { x = 686.0000f, y = 4f, z = 212f, rotY = -0.4150f },
1700 new ST中心点() { x = 848.0000f, y = 4f, z = 282f, rotY = -0.4150f },
1701 new ST中心点() { x = 1200.0000f, y = 4f, z = 450f, rotY = -0.4150f },
1702 new ST中心点() { x = 1500.0000f, y = 4f, z = -289.5575f, rotY = -0.9279888f },
1703 new ST中心点() { x = 1500.0000f, y = 4f, z = -289.5575f, rotY = -0.9279888f },
1704 //-----------------
1705 #endregion
1706 };
1707
1708 protected readonly ST中心点[] stマトリックス曲名座標 = new ST中心点[] {
1709 #region [ 実は円弧配置になってない。射影行列間違ってるよスターレインボウ見せる気かよ… ]
1710 //-----------------
1711 new ST中心点() { x = -980.0000f, y = 2f, z = 360f, rotY = 0.4000f },
1712 new ST中心点() { x = -780.0000f, y = 2f, z = 270f, rotY = 0.4000f },
1713 new ST中心点() { x = -590.0000f, y = 2f, z = 180f, rotY = 0.4000f },
1714 new ST中心点() { x = -400.0000f, y = 2f, z = 90f, rotY = 0.4000f },
1715 new ST中心点() { x = -210.0000f, y = 2f, z = 0f, rotY = 0.4000f },
1716 new ST中心点() { x = 6.00002622683f, y = 2f, z = 0f, rotY = 0f },
1717 new ST中心点() { x = 210.0000f, y = 2f, z = 0f, rotY = -0.4000f },
1718 new ST中心点() { x = 400.0000f, y = 2f, z = 90f, rotY = -0.4f },
1719 new ST中心点() { x = 590.0000f, y = 2f, z = 180f, rotY = -0.4f },
1720 new ST中心点() { x = 780.0000f, y = 2f, z = 270f, rotY = -0.4f },
1721 new ST中心点() { x = 980.0000f, y = 2f, z = 360f, rotY = -0.4f },
1722 new ST中心点() { x = 1200.0000f, y = 2f, z = 450f, rotY = -0.4f },
1723 new ST中心点() { x = 1500.0000f, y = 2f, z = -289.5575f, rotY = -0.9279888f },
1724 new ST中心点() { x = 1500.0000f, y = 2f, z = -289.5575f, rotY = -0.9279888f },
1725 //-----------------
1726 #endregion
1727 };
1728 [StructLayout(LayoutKind.Sequential)]
1729 public struct STATUSPANEL
1730 {
1731 public string label;
1732 public int status;
1733 }
1734 public int nIndex;
1735 public STATUSPANEL[] stパネルマップ;
1736
1737 public bool b登場アニメ全部完了;
1738 private Color color文字影 = Color.FromArgb( 0x40, 10, 10, 10 );
1739 public CCounter[] ct登場アニメ用 = new CCounter[ 13 ];
1740 private Font ft曲リスト用フォント;
1741 private long nスクロルタイマ;
1742 private int n現在のスクロルカウンタ;
1743 private int n現在の選択行;
1744 private int n目標のスクロルカウンタ;
1745 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) };
1746 private ST情報[] st情報 = new ST情報[ 13 ];
1747 private CTexture txSongNotFound, txEnumeratingSongs;
1748 private CTexture txスキル数字;
1749 private CTexture txアイテム数数字;
1750 private CTexture[] txTumbnail = new CTexture[13];
1751 private CTexture tx選曲パネル;
1752 private CTexture txパネル;
1753 private CTexture tx;
1754 private CTexture tx色帯;
1755 private CTexture txランプ用帯;
1756 private CTexture tx選択されている曲の曲名;
1757 private CTexture tx選択されている曲のアティスト名;
1758 private CTexture txクリアランプ;
1759 //CPrivateFont prvFont;
1760 private CPrivateFastFont prvFont;
1761
1762 private int nCurrentPosition = 0;
1763 private int nNumOfItems = 0;
1764
1765 //private string strBoxDefSkinPath = "";
1766 private E種別 e曲のバ種別を返す( C曲リストノ song )
1767 {
1768 if( song != null )
1769 {
1770 switch( song.eド種別 )
1771 {
1772 case C曲リストノ.Eド種別.SCORE:
1773 case C曲リストノ.Eド種別.SCORE_MIDI:
1774 return E種別.Score;
1775
1776 case C曲リストノ.Eド種別.BOX:
1777 return E種別.Box;
1778
1779 case C曲リストノ.Eド種別.BACKBOX:
1780 return E種別.BackBox;
1781
1782 case C曲リストノ.Eド種別.RANDOM:
1783 return E種別.Random;
1784 }
1785 }
1786 return E種別.Other;
1787 }
1788 private C曲リストノ r次の曲( C曲リストノ song )
1789 {
1790 if( song == null )
1791 return null;
1792
1793 List<C曲リストノ> list = ( song.r親ノ != null ) ? song.r親ノ.list子リスト : CDTXMania.Songs管理.list曲ル;
1794
1795 int index = list.IndexOf( song );
1796
1797 if( index < 0 )
1798 return null;
1799
1800 if( index == ( list.Count - 1 ) )
1801 return list[ 0 ];
1802
1803 return list[ index + 1 ];
1804 }
1805 private C曲リストノ r前の曲( C曲リストノ song )
1806 {
1807 if( song == null )
1808 return null;
1809
1810 List<C曲リストノ> list = ( song.r親ノ != null ) ? song.r親ノ.list子リスト : CDTXMania.Songs管理.list曲ル;
1811
1812 int index = list.IndexOf( song );
1813
1814 if( index < 0 )
1815 return null;
1816
1817 if( index == 0 )
1818 return list[ list.Count - 1 ];
1819
1820 return list[ index - 1 ];
1821 }
1822 private void tスキル値の描画( int x, int y, int nスキル値 )
1823 {
1824 if( nスキル値 <= 0 || nスキル値 > 100 ) // スキル値 0 = 未プレイ なので表示しない。
1825 return;
1826
1827 int color = ( nスキル値 == 100 ) ? 3 : ( nスキル値 / 25 );
1828
1829 int n百の位 = nスキル値 / 100;
1830 int n十の位 = ( nスキル値 % 100 ) / 10;
1831 int n一の位 = ( nスキル値 % 100 ) % 10;
1832
1833
1834 // 百の位の描画。
1835
1836 if( n百の位 > 0 )
1837 this.tスキル値の描画・1桁描画( x, y, n百の位, color );
1838
1839
1840 // 十の位の描画。
1841
1842 if( n百の位 != 0 || n十の位 != 0 )
1843 this.tスキル値の描画・1桁描画( x + 14, y, n十の位, color );
1844
1845
1846 // 一の位の描画。
1847
1848 this.tスキル値の描画・1桁描画( x + 0x1c, y, n一の位, color );
1849 }
1850 private void tスキル値の描画・1桁描画( int x, int y, int n数値, int color )
1851 {
1852 int dx = ( n数値 % 5 ) * 9;
1853 int dy = ( n数値 / 5 ) * 12;
1854
1855 switch( color )
1856 {
1857 case 0:
1858 if( this.txスキル数字 != null )
1859 this.txスキル数字.t2D描画( CDTXMania.app.Device, x, y, new Rectangle( 45 + dx, 24 + dy, 9, 12 ) );
1860 break;
1861
1862 case 1:
1863 if( this.txスキル数字 != null )
1864 this.txスキル数字.t2D描画( CDTXMania.app.Device, x, y, new Rectangle( 45 + dx, dy, 9, 12 ) );
1865 break;
1866
1867 case 2:
1868 if( this.txスキル数字 != null )
1869 this.txスキル数字.t2D描画( CDTXMania.app.Device, x, y, new Rectangle( dx, 24 + dy, 9, 12 ) );
1870 break;
1871
1872 case 3:
1873 if( this.txスキル数字 != null )
1874 this.txスキル数字.t2D描画( CDTXMania.app.Device, x, y, new Rectangle( dx, dy, 9, 12 ) );
1875 break;
1876 }
1877 }
1878 private void tの初期化()
1879 {
1880 C曲リストノ song = this.r現在選択中の曲;
1881
1882 if( song == null )
1883 return;
1884
1885 for( int i = 0; i < 5; i++ )
1886 song = this.r前の曲( song );
1887
1888 for( int i = 0; i < 13; i++ )
1889 {
1890 this.st情報[ i ].strタイトル文字列 = song.strタイトル;
1891 this.st情報[ i ].strティスト名 = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.ティスト名;
1892 this.st情報[ i ].col文字色 = song.col文字色;
1893 this.st情報[ i ].e種別 = this.e曲のバ種別を返す( song );
1894 this.st情報[ i ].ar譜面情報 = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報;
1895
1896 //for( int n = 0; n < 5; n++ )
1897 {
1898 //this.stバー情報[ i ].ar難易度ラベル[ n ];
1899
1900 //if( this.stバー情報[ i ].ar難易度ラベル[ n ] != null )
1901 //this.stバー情報[ i ].ar難易度ラベル[ n ] = song.ar難易度ラベル[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ];
1902 }
1903
1904 this.st情報[ i ].strDTXフォルダのパス = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].ファイル情報.フォルダの絶対パス + song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.Preimage;
1905 //this.tパスを指定してサムネイル画像を生成する( i, this.stバー情報[ i ].strDTXフォルダのパス, this.stバー情報[ i ].eバー種別 );
1906 this.tパネルの生成(i, song.strタイトル, this.st情報[ i ].strティスト名, song.col文字色);
1907 if( !this.dicThumbnail.ContainsKey( this.st情報[ i ].strDTXフォルダのパス ) )
1908 {
1909 //txTumbnail = this.tサムネイルテクスチャを作成する( Path.GetDirectoryName( song.ScoreFile ) );
1910 this.tパスを指定してサムネイル画像を生成する( i, this.st情報[ i ].strDTXフォルダのパス, this.st情報[ i ].e種別 );
1911 this.dicThumbnail.Add( this.st情報[ i ].strDTXフォルダのパス, this.txTumbnail[ i ] );
1912 }
1913 txTumbnail[ i ] = this.dicThumbnail[ this.st情報[ i ].strDTXフォルダのパス ];
1914
1915 for( int j = 0; j < 3; j++ )
1916 this.st情報[ i ].nスキル値[ j ] = (int) song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.最大スキル[ j ];
1917
1918 song = this.r次の曲( song );
1919 }
1920
1921 this.n現在の選択行 = 5;
1922 }
1923 private void tパスを指定してサムネイル画像を生成する( int n番号, string strDTXPath, E種別 eType )
1924 {
1925 if( n番号 < 0 || n番号 > 12 )
1926 return;
1927
1928 //try
1929 {
1930 //if ( this.stバー情報[ nバー番号 ].eバー種別 == Eバー種別.Score || this.stバー情報[ nバー番号 ].eバー種別 == Eバー種別.Box)
1931 {
1932 if (!File.Exists(strDTXPath))
1933 {
1934 this.txTumbnail[n番号] = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_preimage default.png"), false);
1935 }
1936 else
1937 {
1938 this.txTumbnail[n番号] = CDTXMania.tテクスチャの生成(strDTXPath);
1939 }
1940 }
1941 //else if( this.stバー情報[ nバー番号 ].eバー種別 == Eバー種別.Random)
1942 //{
1943 // if( this.txジャケットランダム != null )
1944 // this.txTumbnail[ nバー番号 ] = this.txジャケットランダム;
1945 //}
1946 //else if( this.stバー情報[ nバー番号 ].eバー種別 == Eバー種別.BackBox)
1947 //{
1948 // if( this.txジャケットボックスクローズ != null )
1949 // this.txTumbnail[ nバー番号 ] = this.txジャケットボックスクローズ;
1950 //}
1951 }
1952 /*
1953 catch( CTextureCreateFailedException )
1954 {
1955 if ( this.txジャケット指定が無い場合の画像 != null )
1956 {
1957 this.txTumbnail[ nバー番号 ] = this.txジャケット指定が無い場合の画像;
1958 }
1959 else
1960 {
1961 this.txTumbnail[ nバー番号 ] = null;
1962 }
1963 }
1964 */
1965 }
1966 private CTexture tパスを指定してサムネイル画像を生成して返す( int n番号, string strDTXPath, E種別 eType )
1967 {
1968 if (n番号 < 0 || n番号 > 12)
1969 return this.txTumbnail[n番号] = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_preimage default.png"), false);
1970
1971 //try
1972 {
1973 //if (eType == Eバー種別.Score || eType == Eバー種別.Box)
1974 {
1975 if (!File.Exists(strDTXPath))
1976 {
1977 return this.txTumbnail[n番号] = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_preimage default.png"), false);
1978 }
1979 else
1980 {
1981 return this.txTumbnail[n番号] = CDTXMania.tテクスチャの生成(strDTXPath);
1982 }
1983 }
1984 //else if (eType == Eバー種別.Random)
1985 {
1986 // if(this.txジャケットランダム != null)
1987 // this.txTumbnail[nバー番号] = this.txジャケットランダム;
1988 }
1989 //else if (eType == Eバー種別.BackBox)
1990 {
1991 // if(this.txジャケットボックスクローズ != null)
1992 // this.txTumbnail[nバー番号] = this.txジャケットボックスクローズ;
1993 }
1994 }
1995 /*
1996 catch( CTextureCreateFailedException )
1997 {
1998 if ( this.txジャケット指定が無い場合の画像 != null )
1999 {
2000 this.txTumbnail[ nバー番号 ] = this.txジャケット指定が無い場合の画像;
2001 }
2002 else
2003 {
2004 this.txTumbnail[ nバー番号 ] = null;
2005 }
2006 }
2007 */
2008 }
2009 private CTexture t指定された文字テクスチャを生成する( string str文字 )
2010 {
2011 //2013.09.05.kairera0467 中央にしか使用することはないので、色は黒固定。
2012 //現在は機能しない(面倒なので実装してない)が、そのうち使用する予定。
2013 //PrivateFontの試験運転も兼ねて。
2014 //CPrivateFastFont
2015 prvFont = new CPrivateFastFont( new FontFamily( CDTXMania.ConfigIni.str選曲リストフォント ), 28, FontStyle.Regular );
2016 Bitmap bmp;
2017
2018 bmp = prvFont.DrawPrivateFont( str文字, Color.Black, Color.Transparent );
2019
2020 SizeF sz曲名;
2021
2022 #region [ 曲名表示に必要となるサイズを取得する。]
2023 //-----------------
2024 using( var bmpDummy = new Bitmap(1, 1) )
2025 {
2026 var g = Graphics.FromImage( bmpDummy );
2027 g.PageUnit = GraphicsUnit.Pixel;
2028 sz曲名 = g.MeasureString( str文字, this.ft曲リスト用フォント);
2029 //this.stバー情報[ nバー番号 ].nタイトル名テクスチャの長さdot = (int)g.MeasureString(str文字, this.ft曲リスト用フォント).Width;
2030 }
2031 //-----------------
2032 #endregion
2033 int n最大幅px = 200;
2034 int height = 25;
2035 int width = (int)((sz曲名.Width + 2) * 0.5f);
2036 if (width > (CDTXMania.app.Device.Capabilities.MaxTextureWidth / 2))
2037 width = CDTXMania.app.Device.Capabilities.MaxTextureWidth / 2; // 右端断ち切れ仕方ないよね
2038
2039 float f拡大率X = (width <= n最大幅px) ? 0.5f : (((float)n最大幅px / (float)width) * 0.5f); // 長い文字列は横方向に圧縮。
2040
2041 CTexture tx文字テクスチャ = CDTXMania.tテクスチャの生成( bmp, false );
2042
2043 if( tx文字テクスチャ != null )
2044 tx文字テクスチャ.vc拡大縮小倍率 = new Vector3( f拡大率X, 0.5f, 1f );
2045
2046 //prvFont.Dispose();
2047 bmp.Dispose();
2048
2049 return tx文字テクスチャ;
2050 }
2051 private void tパネルの生成( int n番号, string str曲名, string strティスト名, Color color )
2052 {
2053 //t3D描画の仕様上左詰や右詰が面倒になってしまうので、
2054 //パネルにあらかじめ曲名とアーティスト名を埋め込んでおく。
2055
2056 if( n番号 < 0 || n番号 > 12 )
2057 return;
2058 try
2059 {
2060 Bitmap b4font;
2061 Bitmap bSongPanel;
2062 Bitmap bCustomSongNameTexture;
2063 Image imgSongPanel;
2064 Image imgCustomSongNameTexture;
2065 Image imgCuttomArtistNameTexture;
2066 SizeF sz曲名;
2067 SizeF szティスト名;
2068
2069 b4font = new Bitmap( 1, 1 );
2070 Graphics graphics = Graphics.FromImage( b4font );
2071 graphics.PageUnit = GraphicsUnit.Pixel;
2072 imgSongPanel = Image.FromFile( CSkin.Path( @"Graphics\5_music panel.png" ) );
2073
2074 bSongPanel = new Bitmap( 223, 279 );
2075
2076 graphics = Graphics.FromImage( bSongPanel );
2077 graphics.DrawImage( imgSongPanel, 0, 0, 223, 279 );
2078 string strPassBefore = this.st情報[ n番号 ].strDTXフォルダのパス;
2079 string strPassAfter = "";
2080 if( this.st情報[ n番号 ].ar譜面情報.Preimage != "" )
2081 strPassAfter = strPassBefore.Replace( this.st情報[ n番号 ].ar譜面情報.Preimage, "" );
2082 string strPath = ( strPassAfter + "TitleTexture.png" );
2083 if( File.Exists( ( strPath ) ) )
2084 {
2085 imgCustomSongNameTexture = Image.FromFile( strPath );
2086 graphics.DrawImage( imgCustomSongNameTexture, 4, -1, 223, 33 );
2087 }
2088 if( File.Exists( ( strPassAfter + "ArtistTexture.png" ) ) )
2089 {
2090 imgCuttomArtistNameTexture = Image.FromFile( strPassAfter + "ArtistTexture.png" );
2091 graphics.DrawImage( imgCuttomArtistNameTexture, 0, 252, 223, 26 );
2092 }
2093
2094
2095 #region [ 曲名表示に必要となるサイズを取得する。]
2096 //-----------------
2097 using( var bmpDummy = new Bitmap( 1, 1 ) )
2098 {
2099 var g = Graphics.FromImage( bmpDummy );
2100 g.PageUnit = GraphicsUnit.Pixel;
2101 sz曲名 = g.MeasureString( str曲名, this.ft曲リスト用フォント );
2102 szティスト名 = g.MeasureString( strティスト名, this.ft曲リスト用フォント );
2103 this.st情報[ n番号 ].nタイトル名テクスチャの長さdot = (int) g.MeasureString( strティスト名, new Font( CDTXMania.ConfigIni.str選曲リストフォント, 16 ) ).Width;
2104 }
2105 //-----------------
2106 #endregion
2107
2108 int n最大幅px = 200;
2109 int height = 25;
2110 int width = (int) ( ( sz曲名.Width + 2 ) );
2111 if( width > ( CDTXMania.app.Device.Capabilities.MaxTextureWidth ) )
2112 width = CDTXMania.app.Device.Capabilities.MaxTextureWidth; // 右端断ち切れ仕方ないよね
2113
2114 float f拡大率X = ( width <= n最大幅px ) ? 1 : ( ( (float) n最大幅px / (float) width ) ); // 長い文字列は横方向に圧縮。
2115
2116 using( var bmp = new Bitmap( width, height, PixelFormat.Format32bppArgb ) ) // 2倍(面積4倍)のBitmapを確保。(0.5倍で表示する前提。)
2117 using( var g = Graphics.FromImage( bmp ) )
2118 {
2119 graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
2120 float y = ( ( ( float ) bmp.Height ) ) - ( ( CDTXMania.ConfigIni.n選曲リストフォントのサイズdot ) );
2121 //graphics.DrawString( str曲名, this.ft曲リスト用フォント, new SolidBrush( this.color文字影 ), (float) 2f, (float) ( y + 2f ) );
2122 if( File.Exists( ( strPath ) ) == false )
2123 graphics.DrawString( str曲名, new Font( CDTXMania.ConfigIni.str選曲リストフォント, 16 ), new SolidBrush( color ), 5f, y - 2 );
2124 if( File.Exists( ( strPassAfter + "ArtistTexture.png" ) ) == false )
2125 graphics.DrawString( strティスト名, new Font( CDTXMania.ConfigIni.str選曲リストフォント, 16 ), new SolidBrush( Color.White ), (float)218f - this.st情報[ n番号 ].nタイトル名テクスチャの長さdot, 255f);
2126 //graphics.DrawString( strアーティスト名, this.ft曲リスト用フォント, new SolidBrush( Color.White ), 234f, 258f );
2127
2128 CDTXMania.t安全にDisposeする( ref this.st情報[ n番号 ].txパネル );
2129
2130 this.st情報[ n番号 ].txパネル = new CTexture( CDTXMania.app.Device, bSongPanel, CDTXMania.TextureFormat, false );
2131 }
2132
2133
2134 }
2135 catch( CTextureCreateFailedException )
2136 {
2137 Trace.TraceError( "曲名テクスチャの作成に失敗しました。[{0}]", str曲名 );
2138 this.st情報[ n番号 ].txパネル = null;
2139 }
2140
2141 }
2142 private void t曲名バの生成( int n番号, string str曲名, Color color )
2143 {
2144 if( n番号 < 0 || n番号 > 12 )
2145 return;
2146
2147 try
2148 {
2149 SizeF sz曲名;
2150
2151 #region [ 曲名表示に必要となるサイズを取得する。]
2152 //-----------------
2153 using( var bmpDummy = new Bitmap( 1, 1 ) )
2154 {
2155 var g = Graphics.FromImage( bmpDummy );
2156 g.PageUnit = GraphicsUnit.Pixel;
2157 sz曲名 = g.MeasureString( str曲名, this.ft曲リスト用フォント );
2158 this.st情報[ n番号 ].nタイトル名テクスチャの長さdot = (int) g.MeasureString( str曲名, this.ft曲リスト用フォント ).Width;
2159 }
2160 //-----------------
2161 #endregion
2162
2163 int n最大幅px = 200;
2164 int height = 25;
2165 int width = (int) ( ( sz曲名.Width + 2 ) * 0.5f );
2166 if( width > ( CDTXMania.app.Device.Capabilities.MaxTextureWidth / 2 ) )
2167 width = CDTXMania.app.Device.Capabilities.MaxTextureWidth / 2; // 右端断ち切れ仕方ないよね
2168
2169 float f拡大率X = ( width <= n最大幅px ) ? 0.5f : ( ( (float) n最大幅px / (float) width ) * 0.5f ); // 長い文字列は横方向に圧縮。
2170
2171 using( var bmp = new Bitmap( width * 2, height * 2, PixelFormat.Format32bppArgb ) ) // 2倍(面積4倍)のBitmapを確保。(0.5倍で表示する前提。)
2172 using( var g = Graphics.FromImage( bmp ) )
2173 {
2174 g.TextRenderingHint = TextRenderingHint.AntiAlias;
2175 float y = ( ( ( float ) bmp.Height ) / 2f ) - ( ( CDTXMania.ConfigIni.n選曲リストフォントのサイズdot * 2f ) / 2f );
2176 g.DrawString( str曲名, this.ft曲リスト用フォント, new SolidBrush( this.color文字影 ), (float) 2f, (float) ( y + 2f ) );
2177 g.DrawString( str曲名, this.ft曲リスト用フォント, new SolidBrush( color ), 0f, y );
2178
2179 CDTXMania.t安全にDisposeする( ref this.st情報[ n番号 ].txタイトル名 );
2180
2181 this.st情報[ n番号 ].txタイトル名 = new CTexture( CDTXMania.app.Device, bmp, CDTXMania.TextureFormat, false );
2182 this.st情報[ n番号 ].txタイトル名.vc拡大縮小倍率 = new Vector3( f拡大率X, 0.5f, 1f );
2183 }
2184 }
2185 catch( CTextureCreateFailedException )
2186 {
2187 Trace.TraceError( "曲名テクスチャの作成に失敗しました。[{0}]", str曲名 );
2188 this.st情報[ n番号 ].txタイトル名 = null;
2189 }
2190 }
2191 private void tティスト名テクスチャの生成( int n番号, string strティスト名 )
2192 {
2193 if( n番号 < 0 || n番号 > 12 )
2194 return;
2195
2196 try
2197 {
2198 SizeF szティスト名;
2199
2200 #region [ 曲名表示に必要となるサイズを取得する。]
2201 //-----------------
2202 using( var bmpDummy = new Bitmap( 1, 1 ) )
2203 {
2204 var g = Graphics.FromImage( bmpDummy );
2205 g.PageUnit = GraphicsUnit.Pixel;
2206 szティスト名 = g.MeasureString( strティスト名, this.ft曲リスト用フォント );
2207 }
2208 //-----------------
2209 #endregion
2210
2211 int n最大幅px = 210;
2212 int height = 25;
2213 int width = (int) ( ( szティスト名.Width + 2 ) * 0.5f );
2214 if( width > ( CDTXMania.app.Device.Capabilities.MaxTextureWidth / 2 ) )
2215 width = CDTXMania.app.Device.Capabilities.MaxTextureWidth / 2; // 右端断ち切れ仕方ないよね
2216
2217 float f拡大率X = ( width <= n最大幅px ) ? 0.5f : ( ( (float) n最大幅px / (float) width ) * 0.5f ); // 長い文字列は横方向に圧縮。
2218
2219 using( var bmp = new Bitmap( width * 2, height * 2, PixelFormat.Format32bppArgb ) ) // 2倍(面積4倍)のBitmapを確保。(0.5倍で表示する前提。)
2220 using( var g = Graphics.FromImage( bmp ) )
2221 {
2222 g.TextRenderingHint = TextRenderingHint.AntiAlias;
2223 float y = ( ( ( float ) bmp.Height ) / 2f ) - ( ( CDTXMania.ConfigIni.n選曲リストフォントのサイズdot * 2f ) / 2f );
2224 g.DrawString( strティスト名, this.ft曲リスト用フォント, new SolidBrush( this.color文字影 ), (float)2f, (float)(y + 2f));
2225 g.DrawString( strティスト名, this.ft曲リスト用フォント, new SolidBrush( Color.White ), 0f, y );
2226
2227 CDTXMania.t安全にDisposeする( ref this.st情報[ n番号 ].txティスト名 );
2228 this.st情報[ n番号 ].nティスト名テクスチャの長さdot = (int)((g.MeasureString(strティスト名, this.ft曲リスト用フォント).Width) * f拡大率X);
2229 this.st情報[ n番号 ].txティスト名 = new CTexture( CDTXMania.app.Device, bmp, CDTXMania.TextureFormat, false );
2230 this.st情報[ n番号 ].txティスト名.vc拡大縮小倍率 = new Vector3( f拡大率X, 0.5f, 1f );
2231 }
2232 }
2233 catch( CTextureCreateFailedException )
2234 {
2235 Trace.TraceError( "曲名テクスチャの作成に失敗しました。[{0}]", strティスト名 );
2236 this.st情報[ n番号 ].txティスト名 = null;
2237 }
2238 }
2239 private void tアイテム数の描画()
2240 {
2241 string s = nCurrentPosition.ToString() + "/" + nNumOfItems.ToString();
2242 int x = 1150;
2243 int y = 200;
2244
2245 for (int p = s.Length - 1; p >= 0; p--)
2246 {
2247 tアイテム数の描画・1桁描画(x, y, s[p]);
2248 x -= 16;
2249 }
2250 }
2251 private void tアイテム数の描画・1桁描画(int x, int y, char s数値)
2252 {
2253 int dx, dy;
2254 if (s数値 == '/')
2255 {
2256 dx = 96;
2257 dy = 0;
2258 }
2259 else
2260 {
2261 int n = (int)s数値 - (int)'0';
2262 dx = (n % 6) * 16;
2263 dy = (n / 6) * 16;
2264 }
2265 if (this.txアイテム数数字 != null)
2266 {
2267 this.txアイテム数数字.t2D描画(CDTXMania.app.Device, x, y, new Rectangle(dx, dy, 16, 16));
2268 }
2269 }
2270 //-----------------
2271 #endregion
2272 }
2273 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26