Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 510 - (hide annotations) (download)
Thu Dec 31 03:55:27 2015 UTC (8 years, 3 months ago) by kairera0467
File size: 122913 byte(s)
#30763 スクロール時のアニメーション実装。表示される曲パネルの枚数を13枚(内部では15枚)に増やした。
#xxxxx カードネーム・ネームカラー・グループ名を、各パートごとに指定できるようにした。
#xxxxx CONFIG画面のRDPositionの位置を変更。
#xxxxx 本家DTXMのゴースト機能のフォーク準備。途中まで完了したがリリースに間に合わないため機能は封印している。
#xxxxx バージョン情報の更新
1 kairera0467 2 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 kairera0467 186 using System.IO;
11 kairera0467 2 using SlimDX;
12     using FDK;
13    
14     namespace DTXMania
15     {
16 kairera0467 186 //ここをXG風にする際に使ったコードはSSTから拝借、改造している。
17 kairera0467 2 internal class CActSelect曲リスト : CActivity
18     {
19 kairera0467 186
20 kairera0467 2 // プロパティ
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 kairera0467 186
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 kairera0467 2 }
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 kairera0467 186 /// <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 kairera0467 2 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 kairera0467 186 // 何もしない;
208 kairera0467 2 }
209     else
210     {
211 kairera0467 186 // CDTXMania.Songs管理.t曲リストのソート3_演奏回数の多い順( songList, eInst, order );
212 kairera0467 2 sf( songList, eInst, order, p );
213 kairera0467 186 // this.r現在選択中の曲 = CDTXMania
214 kairera0467 2 this.t現在選択中の曲を元に曲バを再構成する();
215     }
216     }
217    
218     public bool tBOXに入る()
219     {
220 kairera0467 186 //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 kairera0467 2 bool ret = false;
229     if ( CSkin.GetSkinName( CDTXMania.Skin.GetCurrentSkinSubfolderFullName( false ) ) != CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath )
230     && CSkin.bUseBoxDefSkin )
231     {
232     ret = true;
233 kairera0467 186 // BOXに入るときは、スキン変更発生時のみboxdefスキン設定の更新を行う
234     CDTXMania.Skin.SetCurrentSkinSubfolderFullName(
235     CDTXMania.Skin.GetSkinSubfolderFullNameFromSkinName( CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath ) ), false );
236 kairera0467 2 }
237    
238 kairera0467 186 //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 kairera0467 197 this.tx選択されている曲の曲名 = null;
246     }
247     if( this.tx選択されている曲のアティスト名 != null )
248     {
249 kairera0467 186 this.tx選択されている曲のアティスト名.Dispose();
250     this.tx選択されている曲のアティスト名 = null;
251     }
252 kairera0467 2 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 kairera0467 186 //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 kairera0467 2 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 kairera0467 186 // スキン変更が発生しなくても、boxdef圏外に出る場合は、boxdefスキン設定の更新が必要
277     // (ユーザーがboxdefスキンをConfig指定している場合への対応のために必要)
278     // tBoxに入る()とは処理が微妙に異なるので注意
279 kairera0467 2 CDTXMania.Skin.SetCurrentSkinSubfolderFullName(
280     ( this.r現在選択中の曲.strSkinPath == "" ) ? "" : CDTXMania.Skin.GetSkinSubfolderFullNameFromSkinName( CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath ) ), false );
281 kairera0467 186 //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 kairera0467 197 this.tx選択されている曲の曲名 = null;
289     }
290     if( this.tx選択されている曲のアティスト名 != null )
291     {
292 kairera0467 186 this.tx選択されている曲のアティスト名.Dispose();
293     this.tx選択されている曲のアティスト名 = null;
294     }
295     if ( this.r現在選択中の曲.r親ノ != null )
296 kairera0467 2 {
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 kairera0467 510 for( int i = 0; i < 15; i++ )
307 kairera0467 2 {
308     this.t曲名バの生成( i, this.st情報[ i ].strタイトル文字列, this.st情報[ i ].col文字色 );
309 kairera0467 186 this.tティスト名テクスチャの生成( i, this.st情報[ i ].strティスト名 );
310 kairera0467 223 this.tパネルの生成( i, this.st情報[ i ].strタイトル文字列, this.st情報[ i ].strティスト名, this.st情報[ i ].col文字色 );
311 kairera0467 411 if( !this.dicThumbnail.ContainsKey( this.st情報[ i ].strPreimageのパス ) )
312 kairera0467 186 {
313     //txTumbnail = this.tサムネイルテクスチャを作成する( Path.GetDirectoryName( song.ScoreFile ) );
314 kairera0467 411 this.tパスを指定してサムネイル画像を生成する( i, this.st情報[ i ].strPreimageのパス, this.st情報[ i ].e種別 );
315     this.dicThumbnail.Add( this.st情報[ i ].strPreimageのパス, this.txTumbnail[ i ] );
316 kairera0467 186 }
317 kairera0467 411 txTumbnail[ i ] = this.dicThumbnail[ this.st情報[ i ].strPreimageのパス ];
318 kairera0467 2 }
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 kairera0467 510 for( int i = this.n現在の選択行 - 7; i < ( ( this.n現在の選択行 - 7 ) + 15 ); i++ )
359 kairera0467 2 {
360 kairera0467 510 int index = ( i + 15 ) % 15;
361 kairera0467 2 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 kairera0467 186 this.tラベル名からステタスパネルを決定する( this.r現在選択中の曲.ar難易度ラベル[ this.n現在選択中の曲の現在の難易度レベル ] );
369 kairera0467 2
370 kairera0467 186 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 kairera0467 2 // 選曲ステージに変更通知を発出し、関係Activityの対応を行ってもらう。
427    
428     CDTXMania.stage選曲.t選択曲変更通知();
429     }
430    
431 kairera0467 186
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 kairera0467 2
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 kairera0467 199
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 kairera0467 2 }
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 kairera0467 186 //this.prvFont = new CPrivateFont( new FontFamily( CDTXMania.ConfigIni.str選曲リストフォント ), 28, FontStyle.Regular );
573 kairera0467 2
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 kairera0467 197 if( this.prvFont != null )
595     this.prvFont.Dispose();
596 kairera0467 2
597 kairera0467 510 for( int i = 0; i < 15; i++ )
598 kairera0467 2 this.ct登場アニメ用[ i ] = null;
599    
600     base.On非活性化();
601     }
602     public override void OnManagedリソスの作成()
603     {
604     if( this.b活性化してない )
605     return;
606    
607 kairera0467 494 this.tx選曲パネル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_image_panel_guitar.png" ) );
608 ron1120 248
609     if ( this.tx選曲パネル == null || CDTXMania.ConfigIni.bDrums有効 )
610     this.tx選曲パネル = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_image_panel.png"));
611    
612 kairera0467 186 this.txパネル = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_music panel.png"));
613 kairera0467 494 //this.tx帯 = CDTXMania.tテクスチャの生成Af( CSkin.Path( @"Graphics\5_backpanel.png" ) );
614     this.txパネル帯 = CDTXMania.tテクスチャの生成Af( CSkin.Path( @"Graphics\5_Backbar.png" ) );
615     //this.tx色帯 = CDTXMania.tテクスチャの生成Af( CSkin.Path( @"Graphics\5_ColorBar.png" ) );
616     //this.txランプ用帯 = CDTXMania.tテクスチャの生成( CSkin.Path(@"Graphics\5_lamppanel.png" ));
617 kairera0467 197
618 kairera0467 186 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 kairera0467 2
626 kairera0467 186 //ここは最初に表示される画像の復元に必要。
627 kairera0467 510 for (int i = 0; i < 15; i++)
628 kairera0467 186 {
629     this.t曲名バの生成(i, this.st情報[i].strタイトル文字列, this.st情報[i].col文字色);
630     this.tティスト名テクスチャの生成( i, this.st情報[ i ].strティスト名 );
631 kairera0467 223 this.tパネルの生成( i, this.st情報[ i ].strタイトル文字列, this.st情報[ i ].strティスト名, this.st情報[ i ].col文字色 );
632 kairera0467 186 //this.tパスを指定してサムネイル画像を生成する(i, this.stバー情報[i].strDTXフォルダのパス, this.stバー情報[i].eバー種別);
633 kairera0467 411 if( this.st情報[ i ].strPreimageのパス != null )
634 kairera0467 186 {
635 kairera0467 411 if( !this.dicThumbnail.ContainsKey( this.st情報[ i ].strPreimageのパス ) )
636 kairera0467 186 {
637     //txTumbnail = this.tサムネイルテクスチャを作成する( Path.GetDirectoryName( song.ScoreFile ) );
638 kairera0467 411 this.tパスを指定してサムネイル画像を生成する( i, this.st情報[ i ].strPreimageのパス, this.st情報[ i ].e種別 );
639     this.dicThumbnail.Add( this.st情報[ i ].strPreimageのパス, this.txTumbnail[ i ] );
640 kairera0467 186 }
641 kairera0467 411 txTumbnail[ i ] = this.dicThumbnail[ this.st情報[ i ].strPreimageのパス ];
642 kairera0467 186 }
643     }
644     #endregion
645    
646    
647 kairera0467 2 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 kairera0467 186 using ( Bitmap image = new Bitmap( 640, 96 ) )
679 kairera0467 2 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 ron1120 351 this.txアイテム数数字 = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_skill number on gauge etc.png"), false);
701 kairera0467 2 #endregion
702 kairera0467 186
703     base.OnManagedリソスの作成();
704 kairera0467 2 }
705     public override void OnManagedリソスの解放()
706     {
707     if( this.b活性化してない )
708     return;
709    
710     CDTXMania.t安全にDisposeする( ref this.txアイテム数数字 );
711    
712 kairera0467 510 for ( int i = 0; i < 15; i++ )
713 kairera0467 186 {
714     CDTXMania.t安全にDisposeする( ref this.st情報[ i ].txタイトル名 );
715     CDTXMania.t安全にDisposeする( ref this.st情報[ i ].txティスト名 );
716 kairera0467 412 CDTXMania.t安全にDisposeする( ref this.st情報[ i ].txカスタム曲名テクスチャ );
717     CDTXMania.t安全にDisposeする( ref this.st情報[ i ].txカスタムアティスト名テクスチャ );
718 kairera0467 186 }
719 kairera0467 2
720 kairera0467 199 if( this.tx選択されている曲の曲名 != null )
721     {
722     this.tx選択されている曲の曲名.Dispose();
723 kairera0467 186 this.tx選択されている曲の曲名 = null;
724 kairera0467 199 }
725     if( this.tx選択されている曲のアティスト名 != null )
726     {
727     this.tx選択されている曲のアティスト名.Dispose();
728 kairera0467 186 this.tx選択されている曲のアティスト名 = null;
729     }
730     #region[ ジャケット画像の解放 ]
731     int nKeys = this.dicThumbnail.Count;
732     string[] keys = new string[ nKeys ];
733     this.dicThumbnail.Keys.CopyTo( keys, 0 );
734     foreach( var key in keys )
735     {
736     C共通.tDisposeする( this.dicThumbnail[ key ] );
737     this.dicThumbnail[ key ] = null;
738     }
739     #endregion
740    
741 kairera0467 2 CDTXMania.t安全にDisposeする( ref this.txEnumeratingSongs );
742     CDTXMania.t安全にDisposeする( ref this.txSongNotFound );
743 kairera0467 186 CDTXMania.t安全にDisposeする( ref this.tx選曲パネル );
744     CDTXMania.t安全にDisposeする( ref this.txパネル );
745     CDTXMania.t安全にDisposeする( ref this.txクリアランプ );
746 kairera0467 494 //CDTXMania.t安全にDisposeする( ref this.tx帯 );
747     CDTXMania.t安全にDisposeする( ref this.txパネル帯 );
748     //CDTXMania.t安全にDisposeする( ref this.tx色帯 );
749     //CDTXMania.t安全にDisposeする( ref this.txランプ用帯 );
750 kairera0467 2
751     base.OnManagedリソスの解放();
752     }
753     public override int On進行描画()
754     {
755     if( this.b活性化してない )
756     return 0;
757    
758     #region [ 初めての進行描画 ]
759     //-----------------
760     if( this.b初めての進行描画 )
761     {
762 kairera0467 510 for( int i = 0; i < 15; i++ )
763 kairera0467 2 this.ct登場アニメ用[ i ] = new CCounter( -i * 10, 100, 3, CDTXMania.Timer );
764    
765     this.nスクロルタイマ = CSound管理.rc演奏用タイマ.n現在時刻;
766     CDTXMania.stage選曲.t選択曲変更通知();
767    
768     base.b初めての進行描画 = false;
769     }
770     //-----------------
771     #endregion
772    
773    
774     // まだ選択中の曲が決まってなければ、曲ツリールートの最初の曲にセットする。
775    
776     if( ( this.r現在選択中の曲 == null ) && ( CDTXMania.Songs管理.list曲ル.Count > 0 ) )
777     this.r現在選択中の曲 = CDTXMania.Songs管理.list曲ル[ 0 ];
778    
779    
780     // 本ステージは、(1)登場アニメフェーズ → (2)通常フェーズ と二段階にわけて進む。
781     // 2つしかフェーズがないので CStage.eフェーズID を使ってないところがまた本末転倒。
782    
783    
784     // 進行。
785    
786     if( !this.b登場アニメ全部完了 )
787     {
788     #region [ (1) 登場アニメフェーズの進行。]
789     //-----------------
790 kairera0467 510 for( int i = 0; i < 15; i++ ) // パネルは全13枚。
791 kairera0467 2 {
792     this.ct登場アニメ用[ i ].t進行();
793    
794     if( this.ct登場アニメ用[ i ].b終了値に達した )
795     this.ct登場アニメ用[ i ].t停止();
796     }
797    
798     // 全部の進行が終わったら、this.b登場アニメ全部完了 を true にする。
799    
800     this.b登場アニメ全部完了 = true;
801 kairera0467 510 for( int i = 0; i < 15; i++ ) // パネルは全13枚。
802 kairera0467 2 {
803     if( this.ct登場アニメ用[ i ].b進行中 )
804     {
805     this.b登場アニメ全部完了 = false; // まだ進行中のアニメがあるなら false のまま。
806     break;
807     }
808     }
809     //-----------------
810     #endregion
811     }
812     else
813     {
814     #region [ (2) 通常フェーズの進行。]
815     //-----------------
816 kairera0467 186 long n現在時刻 = CSound管理.rc演奏用タイマ.n現在時刻;
817 kairera0467 2
818     if( n現在時刻 < this.nスクロルタイマ ) // 念のため
819     this.nスクロルタイマ = n現在時刻;
820    
821     const int nアニメ間隔 = 2;
822     while( ( n現在時刻 - this.nスクロルタイマ ) >= nアニメ間隔 )
823     {
824     int n加速度 = 1;
825     int n残距離 = Math.Abs( (int) ( this.n目標のスクロルカウンタ - this.n現在のスクロルカウンタ ) );
826    
827     #region [ 残距離が遠いほどスクロールを速くする(=n加速度を多くする)。]
828     //-----------------
829     if( n残距離 <= 100 )
830     {
831     n加速度 = 2;
832     }
833     else if( n残距離 <= 300 )
834     {
835     n加速度 = 3;
836     }
837     else if( n残距離 <= 500 )
838     {
839     n加速度 = 4;
840     }
841     else
842     {
843     n加速度 = 8;
844     }
845     //-----------------
846     #endregion
847    
848     #region [ 加速度を加算し、現在のスクロールカウンタを目標のスクロールカウンタまで近づける。 ]
849     //-----------------
850     if( this.n現在のスクロルカウンタ < this.n目標のスクロルカウンタ ) // (A) 正の方向に未達の場合:
851     {
852     this.n現在のスクロルカウンタ += n加速度; // カウンタを正方向に移動する。
853    
854     if( this.n現在のスクロルカウンタ > this.n目標のスクロルカウンタ )
855     this.n現在のスクロルカウンタ = this.n目標のスクロルカウンタ; // 到着!スクロール停止!
856     }
857    
858     else if( this.n現在のスクロルカウンタ > this.n目標のスクロルカウンタ ) // (B) 負の方向に未達の場合:
859     {
860     this.n現在のスクロルカウンタ -= n加速度; // カウンタを負方向に移動する。
861    
862     if( this.n現在のスクロルカウンタ < this.n目標のスクロルカウンタ ) // 到着!スクロール停止!
863     this.n現在のスクロルカウンタ = this.n目標のスクロルカウンタ;
864     }
865     //-----------------
866     #endregion
867    
868     if( this.n現在のスクロルカウンタ >= 100 ) // 1行=100カウント。
869     {
870     #region [ パネルを1行上にシフトする。]
871     //-----------------
872    
873     // 選択曲と選択行を1つ下の行に移動。
874    
875     this.r現在選択中の曲 = this.r次の曲( this.r現在選択中の曲 );
876 kairera0467 510 this.n現在の選択行 = ( this.n現在の選択行 + 1 ) % 15;
877 kairera0467 2
878     // 選択曲から7つ下のパネル(=新しく最下部に表示されるパネル。消えてしまう一番上のパネルを再利用する)に、新しい曲の情報を記載する。
879    
880     C曲リストノ song = this.r現在選択中の曲;
881     for( int i = 0; i < 7; i++ )
882     song = this.r次の曲( song );
883    
884 kairera0467 510 int index = ( this.n現在の選択行 + 7 ) % 15; // 新しく最下部に表示されるパネルのインデックス(0~12)。
885 kairera0467 2 this.st情報[ index ].strタイトル文字列 = song.strタイトル;
886 kairera0467 186 this.st情報[ index ].strティスト名 = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.ティスト名;
887 kairera0467 2 this.st情報[ index ].col文字色 = song.col文字色;
888 kairera0467 411 this.st情報[ index ].strDTXフォルダのパス = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].ファイル情報.フォルダの絶対パス;
889     this.st情報[ index ].strPreimageのパス = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].ファイル情報.フォルダの絶対パス + song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.Preimage;
890 kairera0467 2 this.t曲名バの生成( index, this.st情報[ index ].strタイトル文字列, this.st情報[ index ].col文字色 );
891 kairera0467 186 this.tティスト名テクスチャの生成( index, this.st情報[ index ].strティスト名 );
892 kairera0467 223 this.tパネルの生成( index, this.st情報[ index ].strタイトル文字列, this.st情報[ index ].strティスト名, this.st情報[ index ].col文字色 );
893 kairera0467 2
894 kairera0467 411 if( !this.dicThumbnail.ContainsKey( this.st情報[ index ].strPreimageのパス ) )
895 kairera0467 186 {
896     //txTumbnail = this.tサムネイルテクスチャを作成する( Path.GetDirectoryName( song.ScoreFile ) );
897 kairera0467 411 this.tパスを指定してサムネイル画像を生成する( index, this.st情報[ index ].strPreimageのパス, this.st情報[ index ].e種別 );
898     this.dicThumbnail.Add( this.st情報[ index ].strPreimageのパス, this.txTumbnail[ index ] );
899 kairera0467 186 }
900 kairera0467 411 txTumbnail[ index ] = this.dicThumbnail[ this.st情報[ index ].strPreimageのパス ];
901 kairera0467 2
902 kairera0467 186
903 kairera0467 2 // stバー情報[] の内容を1行ずつずらす。
904    
905     C曲リストノ song2 = this.r現在選択中の曲;
906 kairera0467 510 for( int i = 0; i < 7; i++ )
907 kairera0467 2 song2 = this.r前の曲( song2 );
908    
909 kairera0467 510 for( int i = 0; i < 15; i++ )
910 kairera0467 2 {
911 kairera0467 510 int n = ( ( ( this.n現在の選択行 - 7 ) + i ) + 15 ) % 15;
912 kairera0467 2 this.st情報[ n ].e種別 = this.e曲のバ種別を返す( song2 );
913     song2 = this.r次の曲( song2 );
914     }
915    
916    
917     // 新しく最下部に表示されるパネル用のスキル値を取得。
918    
919     for( int i = 0; i < 3; i++ )
920     this.st情報[ index ].nスキル値[ i ] = (int) song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.最大スキル[ i ];
921    
922     // 1行(100カウント)移動完了。
923    
924     this.n現在のスクロルカウンタ -= 100;
925     this.n目標のスクロルカウンタ -= 100;
926    
927 kairera0467 199 this.t選択曲が変更された( false ); // スクロールバー用に今何番目を選択しているかを更新
928     if( this.tx選択されている曲の曲名 != null )
929 kairera0467 186 {
930     this.tx選択されている曲の曲名.Dispose();
931 kairera0467 199 this.tx選択されている曲の曲名 = null;
932     }
933     if( this.tx選択されている曲のアティスト名 != null )
934     {
935 kairera0467 186 this.tx選択されている曲のアティスト名.Dispose();
936     this.tx選択されている曲のアティスト名 = null;
937     }
938 kairera0467 2
939     if( this.n目標のスクロルカウンタ == 0 )
940     CDTXMania.stage選曲.t選択曲変更通知(); // スクロール完了=選択曲変更!
941    
942     //-----------------
943     #endregion
944     }
945     else if( this.n現在のスクロルカウンタ <= -100 )
946     {
947     #region [ パネルを1行下にシフトする。]
948     //-----------------
949    
950     // 選択曲と選択行を1つ上の行に移動。
951    
952     this.r現在選択中の曲 = this.r前の曲( this.r現在選択中の曲 );
953 kairera0467 510 this.n現在の選択行 = ( ( this.n現在の選択行 - 1 ) + 15 ) % 15;
954 kairera0467 2
955     // 選択曲から5つ上のパネル(=新しく最上部に表示されるパネル。消えてしまう一番下のパネルを再利用する)に、新しい曲の情報を記載する。
956    
957     C曲リストノ song = this.r現在選択中の曲;
958 kairera0467 510 for( int i = 0; i < 7; i++ )
959 kairera0467 2 song = this.r前の曲( song );
960    
961 kairera0467 510 int index = ( ( this.n現在の選択行 - 7 ) + 15 ) % 15; // 新しく最上部に表示されるパネルのインデックス(0~12)。
962 kairera0467 2 this.st情報[ index ].strタイトル文字列 = song.strタイトル;
963 kairera0467 186 this.st情報[ index ].strティスト名 = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song) ].譜面情報.ティスト名;
964 kairera0467 2 this.st情報[ index ].col文字色 = song.col文字色;
965 kairera0467 411 this.st情報[ index ].strDTXフォルダのパス = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].ファイル情報.フォルダの絶対パス;
966     this.st情報[ index ].strPreimageのパス = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].ファイル情報.フォルダの絶対パス + song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.Preimage;
967 kairera0467 2 this.t曲名バの生成( index, this.st情報[ index ].strタイトル文字列, this.st情報[ index ].col文字色 );
968 kairera0467 186 this.tティスト名テクスチャの生成( index, this.st情報[ index ].strティスト名 );
969 kairera0467 223 this.tパネルの生成( index, this.st情報[ index ].strタイトル文字列, this.st情報[ index ].strティスト名, this.st情報[ index ].col文字色 );
970 kairera0467 2
971 kairera0467 411 if( !this.dicThumbnail.ContainsKey( this.st情報[ index ].strPreimageのパス ) )
972 kairera0467 186 {
973     //txTumbnail = this.tサムネイルテクスチャを作成する( Path.GetDirectoryName( song.ScoreFile ) );
974 kairera0467 411 this.tパスを指定してサムネイル画像を生成する( index, this.st情報[ index ].strPreimageのパス, this.st情報[ index ].e種別 );
975     this.dicThumbnail.Add( this.st情報[ index ].strPreimageのパス, this.txTumbnail[ index ] );
976 kairera0467 186 }
977 kairera0467 411 txTumbnail[ index ] = this.dicThumbnail[ this.st情報[ index ].strPreimageのパス ];
978 kairera0467 2
979 kairera0467 186
980 kairera0467 2 // stバー情報[] の内容を1行ずつずらす。
981    
982     C曲リストノ song2 = this.r現在選択中の曲;
983 kairera0467 510 for( int i = 0; i < 7; i++ )
984 kairera0467 2 song2 = this.r前の曲( song2 );
985    
986 kairera0467 510 for( int i = 0; i < 15; i++ )
987 kairera0467 2 {
988 kairera0467 510 int n = ( ( ( this.n現在の選択行 - 7 ) + i ) + 15 ) % 15;
989 kairera0467 2 this.st情報[ n ].e種別 = this.e曲のバ種別を返す( song2 );
990     song2 = this.r次の曲( song2 );
991     }
992    
993    
994     // 新しく最上部に表示されるパネル用のスキル値を取得。
995    
996     for( int i = 0; i < 3; i++ )
997     this.st情報[ index ].nスキル値[ i ] = (int) song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.最大スキル[ i ];
998    
999    
1000     // 1行(100カウント)移動完了。
1001    
1002     this.n現在のスクロルカウンタ += 100;
1003     this.n目標のスクロルカウンタ += 100;
1004    
1005 kairera0467 186
1006     this.t選択曲が変更された( false ); // スクロールバー用に今何番目を選択しているかを更新
1007 kairera0467 199 if( this.tx選択されている曲の曲名 != null )
1008 kairera0467 186 {
1009     this.tx選択されている曲の曲名.Dispose();
1010 kairera0467 199 this.tx選択されている曲の曲名 = null;
1011     }
1012     if( this.tx選択されている曲のアティスト名 != null )
1013     {
1014 kairera0467 186 this.tx選択されている曲のアティスト名.Dispose();
1015     this.tx選択されている曲のアティスト名 = null;
1016     }
1017 kairera0467 2
1018     if( this.n目標のスクロルカウンタ == 0 )
1019     CDTXMania.stage選曲.t選択曲変更通知(); // スクロール完了=選択曲変更!
1020     //-----------------
1021     #endregion
1022     }
1023    
1024     this.nスクロルタイマ += nアニメ間隔;
1025     }
1026     //-----------------
1027     #endregion
1028     }
1029    
1030    
1031     // 描画。
1032    
1033     if( this.r現在選択中の曲 == null )
1034     {
1035     #region [ 曲が1つもないなら「Songs not found.」を表示してここで帰れ。]
1036     //-----------------
1037     if ( bIsEnumeratingSongs )
1038     {
1039     if ( this.txEnumeratingSongs != null )
1040     {
1041 kairera0467 203 this.txEnumeratingSongs.t2D描画( CDTXMania.app.Device, 530, 240 );
1042 kairera0467 2 }
1043     }
1044     else
1045     {
1046     if ( this.txSongNotFound != null )
1047 kairera0467 203 this.txSongNotFound.t2D描画( CDTXMania.app.Device, 500, 190 );
1048 kairera0467 2 }
1049     //-----------------
1050     #endregion
1051    
1052     return 0;
1053     }
1054 kairera0467 186 var bar = SlimDX.Matrix.Identity;
1055 kairera0467 494
1056 kairera0467 186 var barL = SlimDX.Matrix.Identity;
1057 kairera0467 2
1058 kairera0467 494 Matrix[] barC = new Matrix[2];
1059     Matrix[] barLa = new Matrix[2];
1060     Matrix[] barU = new Matrix[2];
1061 kairera0467 186
1062 kairera0467 494 #region[ビルボードの実験コード。「ここでするなよ...」とか言わないであげて...]
1063     //Z座標はプラス方向にすると動かなくなるので注意。
1064    
1065     //共通
1066     Vector3 VecCam = new Vector3( 0.0f, 0.0f, -1.0f ); //Zをマイナス方向にしないと描画されない(?)
1067     Vector3 VecTarg = new Vector3( 0.0f, 0.0f, 0.0f );
1068     Vector3 VecUp = new Vector3( 0.0f, 1.0f, 0.0f );
1069    
1070     bar *= SlimDX.Matrix.LookAtLH( VecCam, VecTarg, VecUp );
1071     barL *= SlimDX.Matrix.LookAtLH( VecCam, VecTarg, VecUp );
1072    
1073     bar *= SlimDX.Matrix.RotationYawPitchRoll( -0.40f, 0.0f, 0.0f ); ////通常のRotationと何が違うのかわからない(Axisから倍率を抜いただけ?)
1074     barL *= SlimDX.Matrix.RotationYawPitchRoll( 0.40f, 0.0f, 0.0f );
1075    
1076    
1077     //bar *= SlimDX.Matrix.PerspectiveFovLH( C変換.DegreeToRadian(45), 1280.0f/720.0f, 1.0f, 500000.0f ); //カメラの視野角など調整
1078    
1079     //ワールド変換とか意味ワカンネ
1080     #endregion
1081    
1082     //bar *= SlimDX.Matrix.RotationY(-0.415f);
1083     //barL *= SlimDX.Matrix.RotationY(0.415f);
1084     //bar *= SlimDX.Matrix.Translation(540f, 20f, -24f);
1085     bar *= SlimDX.Matrix.Translation(600f, 121f, 190f);
1086     barL *= SlimDX.Matrix.Translation(-600f, 121f, 190f);
1087     //barL *= SlimDX.Matrix.Translation(-540f, 20f, -24f);
1088     //bar *= SlimDX.Matrix.Scaling(1.0f, 0.65f, 1.0f);
1089     //bar *= SlimDX.Matrix.Scaling( 1.0f, 1.0f, 1.0f );
1090     //barL *= SlimDX.Matrix.Scaling(1.0f, 0.65f, 1.0f);
1091    
1092     //bar *= SlimDX.Matrix.RotationAxis( new Vector3( 0f, -0.415f, 0f ), 0.5f );
1093    
1094     for( int i = 0; i < 2; i++ )
1095     {
1096     float fRate = 1.0f;
1097     if( i == 0 ) fRate = -1.0f;
1098    
1099     barC[ i ] = Matrix.Identity;
1100     barC[ i ] *= SlimDX.Matrix.LookAtLH( VecCam, VecTarg, VecUp );
1101     barC[ i ] *= SlimDX.Matrix.RotationYawPitchRoll( -0.41f * fRate, 0.0f, 0.0f );
1102     barC[ i ] *= SlimDX.Matrix.Translation( 592f * fRate, 148f, 186f);
1103    
1104     barLa[ i ] = Matrix.Identity;
1105     barLa[ i ] *= SlimDX.Matrix.LookAtLH( VecCam, VecTarg, VecUp );
1106     barLa[ i ] *= SlimDX.Matrix.RotationYawPitchRoll( -0.41f * fRate, 0.0f, 0.0f );
1107     barLa[ i ] *= SlimDX.Matrix.Translation( 592f * fRate, 100f, 186f);
1108    
1109     barU[ i ] = Matrix.Identity;
1110     barU[ i ] *= SlimDX.Matrix.LookAtLH( VecCam, VecTarg, VecUp );
1111     barU[ i ] *= SlimDX.Matrix.RotationYawPitchRoll( -0.41f * fRate, 0.0f, 0.0f );
1112     barU[ i ] *= SlimDX.Matrix.Translation( 592f * fRate, -106f, 186f);
1113     }
1114    
1115    
1116     this.txパネル帯.t3D描画( CDTXMania.app.Device, barU[ 0 ], new Rectangle( 2, 74, 1000, 30 ) );
1117     this.txパネル帯.t3D描画( CDTXMania.app.Device, barU[ 1 ], new Rectangle( 2, 74, 1000, 30 ) );
1118     this.txパネル帯.t3D描画( CDTXMania.app.Device, bar, new Rectangle( 2, 38, 1000, 30 ) ); //右の帯。
1119     this.txパネル帯.t3D描画( CDTXMania.app.Device, barL, new Rectangle( 2, 38, 1000, 30 ) ); //左の帯。
1120     //this.tx帯.t3D描画(CDTXMania.app.Device, barL); //左の帯。
1121     //this.txパネル帯.n透明度 = 155 + this.ct登場アニメ用[10].n現在の値;
1122     this.txパネル帯.t3D描画( CDTXMania.app.Device, barC[ 0 ], new Rectangle( 2, 2, 1000, 30 ) );
1123     this.txパネル帯.t3D描画( CDTXMania.app.Device, barC[ 1 ], new Rectangle( 2, 2, 1000, 30 ) );
1124    
1125 kairera0467 186 #region [ デバッグ補助 ]
1126     //-----------------
1127     /*
1128     stマトリックス座標 = new ST中心点[] {
1129 kairera0467 431 new ST中心点() { x = -980.0000f, y = 4f, z = 350f, rotY = 0.4000f },
1130     new ST中心点() { x = -780.0000f, y = 4f, z = 264f, rotY = 0.4000f },
1131     new ST中心点() { x = -590.0000f, y = 4f, z = 174f, rotY = 0.4000f },
1132     new ST中心点() { x = -400.0000f, y = 4f, z = 92f, rotY = 0.4000f },
1133     new ST中心点() { x = -210.0000f, y = 4f, z = 10f, rotY = 0.4000f },
1134 kairera0467 186 new ST中心点() { x = 6.00002622683f, y = 2f, z = 0f, rotY = 0f },
1135 kairera0467 431 new ST中心点() { x = 210.0000f, y = 2f, z = 10f, rotY = -0.4000f },
1136     new ST中心点() { x = 400.0000f, y = 2f, z = 92f, rotY = -0.4f },
1137     new ST中心点() { x = 590.0000f, y = 2f, z = 174f, rotY = -0.4f },
1138     new ST中心点() { x = 780.0000f, y = 2f, z = 264f, rotY = -0.4f },
1139     new ST中心点() { x = 980.0000f, y = 2f, z = 350f, rotY = -0.4f },
1140     new ST中心点() { x = 1200.0000f, y = 2f, z = 450f, rotY = -0.4f },
1141     new ST中心点() { x = 1500.0000f, y = 2f, z = -289.5575f, rotY = -0.9279888f },
1142     new ST中心点() { x = 1500.0000f, y = 2f, z = -289.5575f, rotY = -0.9279888f },
1143 kairera0467 186 };
1144     */
1145     //-----------------
1146     #endregion
1147    
1148 kairera0467 494 #region[ ジャケット画像のMatrix配列 ]
1149     //パネル1枚1枚にMatrixを割り当ててみる。
1150     //とりあえず構造の最適化無しで地味に作ってみる。
1151 kairera0467 510 Matrix[] matSongPanel = new SlimDX.Matrix[ 15 ];
1152     Matrix[] matJacket = new SlimDX.Matrix[ 15 ];
1153 kairera0467 494 ST中心点[] st3D座標 = new ST中心点[] {
1154     #region [ 計算なんてしていない。 ]
1155 kairera0467 510 //-----------------
1156     //new ST中心点() { x = -1100.0000f, y = 8f, z = 400.0f, rotY = 0.410f },
1157     new ST中心点() { x = -2000.0000f, y = 8f, z = 400.0f, rotY = 0.410f },
1158     new ST中心点() { x = -990.0000f, y = 8f, z = 344.0f, rotY = 0.410f },
1159 kairera0467 494 new ST中心点() { x = -820.0000f, y = 8f, z = 264f, rotY = 0.410f },
1160     new ST中心点() { x = -666.0000f, y = 8f, z = 198f, rotY = 0.410f },
1161     new ST中心点() { x = -506.0000f, y = 8f, z = 127f, rotY = 0.410f },
1162     new ST中心点() { x = -350.0000f, y = 8f, z = 60f, rotY = 0.410f },
1163     new ST中心点() { x = -194.0000f, y = 8f, z = -6f, rotY = 0.410f },
1164 kairera0467 510 new ST中心点() { x = 6.00002622683f, y = 8f, z = 0f, rotY = 0.0f }, //7
1165 kairera0467 494 new ST中心点() { x = 208.0000f, y = 8f, z = 0f, rotY = -0.410f },
1166     new ST中心点() { x = 362.0000f, y = 8f, z = 66f, rotY = -0.410f },
1167     new ST中心点() { x = 518.0000f, y = 8f, z = 132f, rotY = -0.410f },
1168     new ST中心点() { x = 676.0000f, y = 8f, z = 200.0f, rotY = -0.410f },
1169     new ST中心点() { x = 837.0000f, y = 8f, z = 270.0f, rotY = -0.410f },
1170 kairera0467 510 new ST中心点() { x = 1010.0000f, y = 8f, z = 350.0f, rotY = -0.410f },
1171     new ST中心点() { x = 2000.0000f, y = 8f, z = 450.0f, rotY = -0.410f }
1172     //new ST中心点() { x = 1190.0000f, y = 8f, z = 450.0f, rotY = -0.410f }
1173    
1174 kairera0467 494 //-----------------
1175     #endregion
1176     };
1177 kairera0467 186
1178 kairera0467 510 for( int i = 0; i < 15; i++ )
1179 kairera0467 494 {
1180     matSongPanel[ i ] = Matrix.Identity;
1181     matSongPanel[ i ] *= SlimDX.Matrix.LookAtLH( VecCam, VecTarg, VecUp );
1182     matSongPanel[ i ] *= SlimDX.Matrix.Scaling(0.62f, 0.88f, 1.0f);
1183 kairera0467 497 //matSongPanel[ i ] *= SlimDX.Matrix.RotationYawPitchRoll( st3D座標[ i ].rotY, 0.0f, 0.0f );
1184     //matSongPanel[ i ] *= SlimDX.Matrix.Translation( st3D座標[ i ].x, st3D座標[ i ].y, st3D座標[ i ].z );
1185 kairera0467 494
1186    
1187     matJacket[ i ] = Matrix.Identity;
1188     matJacket[ i ] *= SlimDX.Matrix.LookAtLH( VecCam, VecTarg, VecUp );
1189     //matJacket[ i ] *= SlimDX.Matrix.RotationYawPitchRoll( st3D座標[ i ].rotY, 0.0f, 0.0f ); //ジャケット画像は計算順序を変える。
1190    
1191     //matJacket[ i ] *= SlimDX.Matrix.Translation( st3D座標[ i ].x, 0f, st3D座標[ i ].z );
1192     }
1193     #endregion
1194    
1195 kairera0467 2 if( !this.b登場アニメ全部完了 )
1196     {
1197     #region [ (1) 登場アニメフェーズの描画。]
1198     //-----------------
1199 kairera0467 510 for( int i = 0; i < 15; i++ ) // パネルは全13枚。
1200 kairera0467 2 {
1201     if( this.ct登場アニメ用[ i ].n現在の値 >= 0 )
1202     {
1203 kairera0467 510 int nパネル番号 = ( ( ( this.n現在の選択行 - 7 ) + i ) + 15 ) % 15;
1204 kairera0467 186
1205 kairera0467 510 if( i == 8 )
1206 kairera0467 186 {
1207     #region [ ジャケット画像の描画 ]
1208     //-----------------
1209 kairera0467 412 if( this.st情報[ nパネル番号 ].txパネル != null )
1210 kairera0467 186 {
1211 kairera0467 497 matSongPanel[ i ] *= SlimDX.Matrix.RotationYawPitchRoll( st3D座標[ i ].rotY, 0.0f, 0.0f );
1212     matSongPanel[ i ] *= SlimDX.Matrix.Translation( st3D座標[ i ].x, st3D座標[ i ].y, st3D座標[ i ].z );
1213 kairera0467 494 this.st情報[ nパネル番号 ].txパネル.t3D描画( CDTXMania.app.Device, matSongPanel[ i ] );
1214 kairera0467 186 }
1215 kairera0467 194 if( this.txTumbnail[nパネル番号] != null )
1216 kairera0467 186 {
1217 kairera0467 510 float f拡大率 = (float)172.0 / this.txTumbnail[ nパネル番号 ].szテクスチャサイズ.Width;
1218     float f拡大率2 = (float)172.0 / this.txTumbnail[ nパネル番号 ].szテクスチャサイズ.Height;
1219    
1220 kairera0467 494 matJacket[ i ] *= SlimDX.Matrix.Scaling( f拡大率 * CTexture.f画面比率 - 0.084f, f拡大率2 * CTexture.f画面比率 + 0.05f, 1.0f );
1221     matJacket[ i ] *= SlimDX.Matrix.RotationYawPitchRoll( st3D座標[ i ].rotY, 0.0f, 0.0f );
1222 kairera0467 497 matJacket[ i ] *= SlimDX.Matrix.Translation( st3D座標[ i ].x, st3D座標[ i ].y - 1.5f, st3D座標[ i ].z );
1223 kairera0467 494
1224     this.txTumbnail[ nパネル番号 ].t3D描画(CDTXMania.app.Device, matJacket[ i ] );
1225 kairera0467 186 }
1226     //-----------------
1227     #endregion
1228     #region [ タイトル名テクスチャを描画。]
1229     //-----------------
1230 kairera0467 194 if( this.st情報[nパネル番号].txタイトル名 != null )
1231 kairera0467 186 {
1232     var mat = SlimDX.Matrix.Identity;
1233 kairera0467 194 mat *= SlimDX.Matrix.Scaling( 0.35f, 0.45f, 1.0f );
1234     mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[ i ].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1235 kairera0467 186 mat *= SlimDX.Matrix.Translation(
1236     (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1237     (this.stマトリックス座標[i].y + 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1238     (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1239     }
1240     if (this.st情報[nパネル番号].txティスト名 != null)
1241     {
1242     var mat = SlimDX.Matrix.Identity;
1243     mat *= SlimDX.Matrix.Scaling(0.35f, 0.45f, 1.0f);
1244     mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1245     mat *= SlimDX.Matrix.Translation(
1246     (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1247     (this.stマトリックス座標[i].y - 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1248     (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1249     }
1250     //-----------------
1251     #endregion
1252 kairera0467 194 if( this.tx選曲パネル != null )
1253     this.tx選曲パネル.t2D描画( CDTXMania.app.Device, 761, 233, new Rectangle( 304, 70, 59, 242 ) );
1254 kairera0467 186 }
1255 kairera0467 510 else if( i == 7 )
1256 kairera0467 2 {
1257     }
1258     else
1259     {
1260     // (B) その他のパネルの描画。
1261 kairera0467 186 #region [ ジャケット画像の描画 ]
1262     //-----------------
1263 kairera0467 412 if( this.st情報[ nパネル番号 ].txパネル != null )
1264 kairera0467 186 {
1265 kairera0467 497 matSongPanel[ i ] *= SlimDX.Matrix.RotationYawPitchRoll( st3D座標[ i ].rotY, 0.0f, 0.0f );
1266     matSongPanel[ i ] *= SlimDX.Matrix.Translation( st3D座標[ i ].x, st3D座標[ i ].y, st3D座標[ i ].z );
1267     this.st情報[ nパネル番号 ].txパネル.t3D描画( CDTXMania.app.Device, matSongPanel[ i ] );
1268 kairera0467 186 }
1269 kairera0467 494 if( this.txTumbnail[nパネル番号] != null )
1270 kairera0467 186 {
1271 kairera0467 494 float f拡大率 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Width ;
1272 kairera0467 186 float f拡大率2 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Height;
1273 kairera0467 494
1274     matJacket[ i ] *= SlimDX.Matrix.Scaling( f拡大率 * CTexture.f画面比率 - 0.084f, f拡大率2 * CTexture.f画面比率 + 0.05f, 1.0f );
1275     matJacket[ i ] *= SlimDX.Matrix.RotationYawPitchRoll( st3D座標[ i ].rotY, 0.0f, 0.0f );
1276 kairera0467 497 matJacket[ i ] *= SlimDX.Matrix.Translation( st3D座標[ i ].x, st3D座標[ i ].y - 1.5f, st3D座標[ i ].z );
1277 kairera0467 494
1278     this.txTumbnail[nパネル番号].t3D描画( CDTXMania.app.Device, matJacket[ i ] );
1279 kairera0467 186 }
1280     //-----------------
1281     #endregion
1282 kairera0467 2 }
1283     }
1284     }
1285 kairera0467 510
1286     int n選択曲のパネル番号 = ( ( ( this.n現在の選択行 - 7 ) + 7 ) + 15 ) % 15;
1287     #region[ ランプ帯 ]
1288     if( this.txパネル帯 != null )
1289     {
1290     this.txパネル帯.t3D描画( CDTXMania.app.Device, barLa[ 0 ], new Rectangle( 2, 110, 1000, 20 ) );
1291     this.txパネル帯.t3D描画( CDTXMania.app.Device, barLa[ 1 ], new Rectangle( 2, 110, 1000, 20 ) );
1292     }
1293     #endregion
1294     #region[ 中央パネル ]
1295     if( this.tx選曲パネル != null )
1296     this.tx選曲パネル.t2D描画(CDTXMania.app.Device, 457, 163, new Rectangle( 0, 0, 363, 368 ) );
1297     #endregion
1298     #region[ クリアランプ ]
1299     for( int la = 0; la < 5 ; la++ )
1300     {
1301     if( this.txクリアランプ != null && CDTXMania.stage選曲.r現在選択中の曲.ar難易度ラベル[ la ] != null && CDTXMania.stage選曲.r現在選択中の曲.arスコア[ la ] != null )
1302     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 ));
1303     }
1304     #endregion
1305     #region[ ジャケット画像 ]
1306     if ( this.txTumbnail[ n選択曲のパネル番号 ] != null )
1307     {
1308     float f拡大率 = (float)218.0 / this.txTumbnail[ n選択曲のパネル番号 ].szテクスチャサイズ.Width;
1309     float f拡大率2 = (float)218.0 / this.txTumbnail[ n選択曲のパネル番号 ].szテクスチャサイズ.Height;
1310     this.txTumbnail[ n選択曲のパネル番号 ].vc拡大縮小倍率 = new Vector3( f拡大率, f拡大率2, 1.0f );
1311     this.txTumbnail[ n選択曲のパネル番号 ].t2D描画(CDTXMania.app.Device, 537, 249 );
1312     this.txTumbnail[ n選択曲のパネル番号 ].vc拡大縮小倍率 = new Vector3( 1.0f, 1.0f, 1.0f );
1313     }
1314     #endregion
1315     #region[ タイトル・アーティスト名 ]
1316     if( File.Exists( this.st情報[ n選択曲のパネル番号 ].strDTXフォルダのパス + "TitleTexture.png" ) && this.tx選択されている曲の曲名 == null )
1317     {
1318     this.tx選択されている曲の曲名 = this.tカスタム曲名の生成( n選択曲のパネル番号 );
1319     }
1320     else
1321     {
1322     if( this.st情報[ n選択曲のパネル番号 ].strタイトル文字列 != "" && this.st情報[ n選択曲のパネル番号 ].strタイトル文字列 != null && this.tx選択されている曲の曲名 == null )
1323     this.tx選択されている曲の曲名 = this.t指定された文字テクスチャを生成する( this.st情報[ n選択曲のパネル番号 ].strタイトル文字列 );
1324     }
1325     if( File.Exists( this.st情報[ n選択曲のパネル番号 ].strDTXフォルダのパス + "ArtistTexture.png" ) && this.tx選択されている曲のアティスト名 == null )
1326     {
1327     this.tx選択されている曲のアティスト名 = this.tカスタムアティスト名テクスチャの生成( n選択曲のパネル番号 );
1328     if (this.tx選択されている曲のアティスト名 != null)
1329     this.tx選択されている曲のアティスト名.t2D描画(CDTXMania.app.Device, 552, 470);
1330     }
1331     else
1332     {
1333     if( this.st情報[ n選択曲のパネル番号 ].strティスト名 != "" && this.st情報[ n選択曲のパネル番号 ].strティスト名 != null && this.tx選択されている曲のアティスト名 == null )
1334     this.tx選択されている曲のアティスト名 = this.t指定された文字テクスチャを生成する( this.st情報[ n選択曲のパネル番号 ].strティスト名 );
1335     }
1336    
1337     if( this.tx選択されている曲の曲名 != null )
1338     this.tx選択されている曲の曲名.t2D描画( CDTXMania.app.Device, 552, 210 );
1339     if( this.tx選択されている曲のアティスト名 != null )
1340     this.tx選択されている曲のアティスト名.t2D描画( CDTXMania.app.Device, 770 - this.st情報[ n選択曲のパネル番号 ].nティスト名テクスチャの長さdot, 470 );
1341     #endregion
1342 kairera0467 2 //-----------------
1343     #endregion
1344 kairera0467 186
1345 kairera0467 2 }
1346     else
1347     {
1348 kairera0467 497 //CDTXMania.act文字コンソール.tPrint( 0, 0, C文字コンソール.Eフォント種別.白, this.n現在のスクロールカウンタ.ToString() );
1349 kairera0467 2 #region [ (2) 通常フェーズの描画。]
1350     //-----------------
1351 kairera0467 510 for( int i = 0; i < 15; i++ ) // パネルは全13枚。
1352 kairera0467 2 {
1353 kairera0467 510 int nパネル番号 = ( ( ( this.n現在の選択行 - 7 ) + i ) + 15 ) % 15;
1354 kairera0467 2 int n見た目の行番号 = i;
1355 kairera0467 510 int n次のパネル番号 = ( this.n現在のスクロルカウンタ <= 0 ) ? ( ( i + 1 ) % 15 ) : ( ( ( i - 1 ) + 15 ) % 15 );
1356 kairera0467 2 int x = this.ptの基本座標[ n見た目の行番号 ].X + ( (int) ( ( this.ptの基本座標[ n次のパネル番号 ].X - this.ptの基本座標[ n見た目の行番号 ].X ) * ( ( (double) Math.Abs( this.n現在のスクロルカウンタ ) ) / 100.0 ) ) );
1357     int y = this.ptの基本座標[ n見た目の行番号 ].Y + ( (int) ( ( this.ptの基本座標[ n次のパネル番号 ].Y - this.ptの基本座標[ n見た目の行番号 ].Y ) * ( ( (double) Math.Abs( this.n現在のスクロルカウンタ ) ) / 100.0 ) ) );
1358 kairera0467 497 float fX = this.n現在のスクロルカウンタ <= 0 ? st3D座標[ n見た目の行番号 ].x + ( ( ( st3D座標[ n次のパネル番号 ].x - st3D座標[ n見た目の行番号 ].x ) * ( Math.Abs( this.n現在のスクロルカウンタ ) ) / 100.0f ) ) :
1359     st3D座標[ n見た目の行番号 ].x + ( ( ( st3D座標[ n次のパネル番号 ].x - st3D座標[ n見た目の行番号 ].x ) * ( Math.Abs( this.n現在のスクロルカウンタ ) ) / 100.0f ) );
1360 kairera0467 186
1361 kairera0467 497 float fY = this.n現在のスクロルカウンタ <= 0 ? st3D座標[ n見た目の行番号 ].y + ( ( ( st3D座標[ n次のパネル番号 ].y + st3D座標[ n見た目の行番号 ].y ) * ( Math.Abs( this.n現在のスクロルカウンタ ) ) / 100.0f ) ) :
1362     st3D座標[ n見た目の行番号 ].y + ( ( ( st3D座標[ n次のパネル番号 ].y + st3D座標[ n見た目の行番号 ].y ) * ( Math.Abs( this.n現在のスクロルカウンタ ) ) / 100.0f ) );
1363 kairera0467 494
1364 kairera0467 497 float fZ = this.n現在のスクロルカウンタ <= 0 ? st3D座標[ n見た目の行番号 ].z + ( ( ( st3D座標[ n次のパネル番号 ].z - st3D座標[ n見た目の行番号 ].z ) * ( Math.Abs( this.n現在のスクロルカウンタ ) ) / 100.0f ) ) :
1365     st3D座標[ n見た目の行番号 ].z + ( ( ( st3D座標[ n次のパネル番号 ].z - st3D座標[ n見た目の行番号 ].z ) * ( Math.Abs( this.n現在のスクロルカウンタ ) ) / 100.0f ) );
1366 kairera0467 494
1367 kairera0467 497 float fR = this.n現在のスクロルカウンタ <= 0 ? st3D座標[ n見た目の行番号 ].rotY + ( ( ( st3D座標[ n次のパネル番号 ].rotY - st3D座標[ n見た目の行番号 ].rotY ) * ( Math.Abs( this.n現在のスクロルカウンタ ) ) / 100.0f ) ) :
1368     st3D座標[ n見た目の行番号 ].rotY + ( ( ( st3D座標[ n次のパネル番号 ].rotY - st3D座標[ n見た目の行番号 ].rotY ) * ( Math.Abs( this.n現在のスクロルカウンタ ) ) / 100.0f ) );
1369    
1370 kairera0467 510 //デバッグ用
1371     //if( i == 7 ){
1372     // CDTXMania.act文字コンソール.tPrint( 0, 16 * i, C文字コンソール.Eフォント種別.赤, i.ToString() + " " + this.stバー情報[ nパネル番号 ].strタイトル文字列.ToString() );
1373     //}else{
1374     // CDTXMania.act文字コンソール.tPrint( 0, 16 * i, C文字コンソール.Eフォント種別.白, i.ToString() + " " + this.stバー情報[ nパネル番号 ].strタイトル文字列.ToString() );
1375     //}
1376 kairera0467 497
1377 kairera0467 510
1378    
1379     if( i == 8 )
1380 kairera0467 186 {
1381     #region [ ジャケット画像の描画 ]
1382     //-----------------
1383 kairera0467 412 if( this.st情報[ nパネル番号 ].txパネル != null )
1384 kairera0467 186 {
1385 kairera0467 497 matSongPanel[ i ] *= SlimDX.Matrix.RotationYawPitchRoll( fR, 0.0f, 0.0f );
1386     matSongPanel[ i ] *= SlimDX.Matrix.Translation( fX, st3D座標[ i ].y, fZ );
1387 kairera0467 494 this.st情報[ nパネル番号 ].txパネル.t3D描画( CDTXMania.app.Device, matSongPanel[ i ] );
1388 kairera0467 186 }
1389 kairera0467 494 if (this.txTumbnail[ nパネル番号 ] != null)
1390 kairera0467 186 {
1391     float f拡大率 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Width;
1392     float f拡大率2 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Height;
1393 kairera0467 494
1394     matJacket[ i ] *= SlimDX.Matrix.Scaling( f拡大率 * CTexture.f画面比率 - 0.084f, f拡大率2 * CTexture.f画面比率 + 0.05f, 1.0f );
1395 kairera0467 497 matJacket[ i ] *= SlimDX.Matrix.RotationYawPitchRoll( fR, 0.0f, 0.0f );
1396     matJacket[ i ] *= SlimDX.Matrix.Translation( fX, st3D座標[ i ].y - 1.5f, fZ );
1397 kairera0467 494
1398     this.txTumbnail[ nパネル番号 ].t3D描画(CDTXMania.app.Device, matJacket[ i ] );
1399 kairera0467 186 }
1400     //-----------------
1401     #endregion
1402     #region [ タイトル名テクスチャを描画。]
1403     //-----------------
1404     if (this.st情報[nパネル番号].txタイトル名 != null)
1405     {
1406     var mat = SlimDX.Matrix.Identity;
1407     mat *= SlimDX.Matrix.Scaling(0.35f, 0.45f, 1.0f);
1408     mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1409     mat *= SlimDX.Matrix.Translation(
1410     (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1411     (this.stマトリックス座標[i].y + 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1412     (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1413     }
1414     if (this.st情報[nパネル番号].txティスト名 != null)
1415     {
1416     var mat = SlimDX.Matrix.Identity;
1417     mat *= SlimDX.Matrix.Scaling(0.35f, 0.45f, 1.0f);
1418     mat *= SlimDX.Matrix.RotationY(this.stマトリックス座標[i].rotY + (this.stマトリックス座標[i].rotY - this.stマトリックス座標[i].rotY));
1419     mat *= SlimDX.Matrix.Translation(
1420     (this.stマトリックス座標[i].x + (int)((this.stマトリックス座標[i].x - this.stマトリックス座標[i].x))) * CTexture.f画面比率,
1421     (this.stマトリックス座標[i].y - 110 + (int)((this.stマトリックス座標[i].y - this.stマトリックス座標[i].y))) * CTexture.f画面比率,
1422     (this.stマトリックス座標[i].z + (int)((this.stマトリックス座標[i].z - this.stマトリックス座標[i].z))) * CTexture.f画面比率);
1423     }
1424     //-----------------
1425     #endregion
1426     }
1427 kairera0467 510 else if( i == 7 || i == 0 || i == 14)
1428 kairera0467 186 {
1429 kairera0467 510 //選択曲、画面外の曲のジャケット画像は表示しない。
1430 kairera0467 2 }
1431 kairera0467 186 else
1432     {
1433     #region [ ジャケット画像の描画 ]
1434     //-----------------
1435 kairera0467 412 if( this.st情報[ nパネル番号 ].txパネル != null )
1436 kairera0467 186 {
1437 kairera0467 497 matSongPanel[ i ] *= SlimDX.Matrix.RotationYawPitchRoll( st3D座標[ i ].rotY, 0.0f, 0.0f );
1438     matSongPanel[ i ] *= SlimDX.Matrix.Translation( fX, st3D座標[ i ].y, fZ );
1439 kairera0467 510 this.st情報[ nパネル番号 ].txパネル.t3D描画( CDTXMania.app.Device, matSongPanel[ i ] );
1440 kairera0467 186 }
1441 kairera0467 510 if( this.txTumbnail[ nパネル番号 ] != null )
1442 kairera0467 186 {
1443 kairera0467 510 float f拡大率 = (float)172.0 / this.txTumbnail[ nパネル番号 ].szテクスチャサイズ.Width ;
1444     float f拡大率2 = (float)172.0 / this.txTumbnail[ nパネル番号 ].szテクスチャサイズ.Height;
1445 kairera0467 494
1446     matJacket[ i ] *= SlimDX.Matrix.Scaling( f拡大率 * CTexture.f画面比率 - 0.084f, f拡大率2 * CTexture.f画面比率 + 0.05f, 1.0f );
1447     matJacket[ i ] *= SlimDX.Matrix.RotationYawPitchRoll( st3D座標[ i ].rotY, 0.0f, 0.0f );
1448 kairera0467 497 matJacket[ i ] *= SlimDX.Matrix.Translation( fX, st3D座標[ i ].y - 1.5f, fZ );
1449 kairera0467 494
1450 kairera0467 510 this.txTumbnail[ nパネル番号 ].t3D描画( CDTXMania.app.Device, matJacket[ i ] );
1451 kairera0467 186 }
1452     //-----------------
1453     #endregion
1454     }
1455 kairera0467 2 }
1456 kairera0467 497
1457     //選択中の曲
1458 kairera0467 510 int n選択曲のパネル番号 = ( ( ( this.n現在の選択行 - 7 ) + 7 ) + 15 ) % 15;
1459     #region[ ランプ帯 ]
1460     if( this.txパネル帯 != null )
1461     {
1462     this.txパネル帯.t3D描画( CDTXMania.app.Device, barLa[ 0 ], new Rectangle( 2, 110, 1000, 20 ) );
1463     this.txパネル帯.t3D描画( CDTXMania.app.Device, barLa[ 1 ], new Rectangle( 2, 110, 1000, 20 ) );
1464     }
1465     #endregion
1466 kairera0467 497 #region[ 中央パネル ]
1467     if( this.tx選曲パネル != null )
1468 kairera0467 510 this.tx選曲パネル.t2D描画(CDTXMania.app.Device, 457, 163, new Rectangle( 0, 0, 363, 368 ) );
1469 kairera0467 497 #endregion
1470     #region[ クリアランプ ]
1471     for( int la = 0; la < 5 ; la++ )
1472     {
1473     if( this.txクリアランプ != null && CDTXMania.stage選曲.r現在選択中の曲.ar難易度ラベル[ la ] != null && CDTXMania.stage選曲.r現在選択中の曲.arスコア[ la ] != null )
1474 kairera0467 510 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 ));
1475 kairera0467 497 }
1476     #endregion
1477     #region[ ジャケット画像 ]
1478     if ( this.txTumbnail[ n選択曲のパネル番号 ] != null )
1479     {
1480     float f拡大率 = (float)218.0 / this.txTumbnail[ n選択曲のパネル番号 ].szテクスチャサイズ.Width;
1481     float f拡大率2 = (float)218.0 / this.txTumbnail[ n選択曲のパネル番号 ].szテクスチャサイズ.Height;
1482     this.txTumbnail[ n選択曲のパネル番号 ].vc拡大縮小倍率 = new Vector3( f拡大率, f拡大率2, 1.0f );
1483     this.txTumbnail[ n選択曲のパネル番号 ].t2D描画(CDTXMania.app.Device, 537, 249 );
1484     this.txTumbnail[ n選択曲のパネル番号 ].vc拡大縮小倍率 = new Vector3( 1.0f, 1.0f, 1.0f );
1485     }
1486     #endregion
1487     #region[ タイトル・アーティスト名 ]
1488     if( File.Exists( this.st情報[ n選択曲のパネル番号 ].strDTXフォルダのパス + "TitleTexture.png" ) && this.tx選択されている曲の曲名 == null )
1489     {
1490     this.tx選択されている曲の曲名 = this.tカスタム曲名の生成( n選択曲のパネル番号 );
1491     }
1492     else
1493     {
1494     if( this.st情報[ n選択曲のパネル番号 ].strタイトル文字列 != "" && this.st情報[ n選択曲のパネル番号 ].strタイトル文字列 != null && this.tx選択されている曲の曲名 == null )
1495     this.tx選択されている曲の曲名 = this.t指定された文字テクスチャを生成する( this.st情報[ n選択曲のパネル番号 ].strタイトル文字列 );
1496     }
1497     if( File.Exists( this.st情報[ n選択曲のパネル番号 ].strDTXフォルダのパス + "ArtistTexture.png" ) && this.tx選択されている曲のアティスト名 == null )
1498     {
1499     this.tx選択されている曲のアティスト名 = this.tカスタムアティスト名テクスチャの生成( n選択曲のパネル番号 );
1500     if (this.tx選択されている曲のアティスト名 != null)
1501     this.tx選択されている曲のアティスト名.t2D描画(CDTXMania.app.Device, 552, 470);
1502     }
1503     else
1504     {
1505     if( this.st情報[ n選択曲のパネル番号 ].strティスト名 != "" && this.st情報[ n選択曲のパネル番号 ].strティスト名 != null && this.tx選択されている曲のアティスト名 == null )
1506     this.tx選択されている曲のアティスト名 = this.t指定された文字テクスチャを生成する( this.st情報[ n選択曲のパネル番号 ].strティスト名 );
1507     }
1508    
1509     if( this.tx選択されている曲の曲名 != null )
1510     this.tx選択されている曲の曲名.t2D描画( CDTXMania.app.Device, 552, 210 );
1511     if( this.tx選択されている曲のアティスト名 != null )
1512     this.tx選択されている曲のアティスト名.t2D描画( CDTXMania.app.Device, 770 - this.st情報[ n選択曲のパネル番号 ].nティスト名テクスチャの長さdot, 470 );
1513     #endregion
1514    
1515     //-----------------
1516 kairera0467 2 #endregion
1517 kairera0467 186
1518 kairera0467 2 }
1519     #region [ スクロール地点の計算(描画はCActSelectShowCurrentPositionにて行う) #27648 ]
1520     int py;
1521     double d = 0;
1522     if ( nNumOfItems > 1 )
1523     {
1524 kairera0467 186 d = ( 336 - 8 ) / (double) ( nNumOfItems - 1 );
1525 kairera0467 2 py = (int) ( d * ( nCurrentPosition - 1 ) );
1526     }
1527     else
1528     {
1529     d = 0;
1530     py = 0;
1531     }
1532     int delta = (int) ( d * this.n現在のスクロルカウンタ / 100 );
1533 kairera0467 186 if ( py + delta <= 336 - 8 )
1534 kairera0467 2 {
1535     this.nスクロルバ相対y座標 = py + delta;
1536     }
1537     #endregion
1538    
1539     #region [ アイテム数の描画 #27648 ]
1540     tアイテム数の描画();
1541     #endregion
1542     return 0;
1543     }
1544    
1545    
1546     // その他
1547    
1548     #region [ private ]
1549     //-----------------
1550 kairera0467 186 private enum E種別 { Score, Box, Other, Random, BackBox }
1551 kairera0467 2
1552     private struct ST
1553     {
1554     public CTexture Score;
1555     public CTexture Box;
1556     public CTexture Other;
1557 kairera0467 186 public CTexture Random;
1558     public CTexture BackBox;
1559 kairera0467 2 public CTexture this[ int index ]
1560     {
1561     get
1562     {
1563     switch( index )
1564     {
1565     case 0:
1566     return this.Score;
1567    
1568     case 1:
1569     return this.Box;
1570    
1571     case 2:
1572     return this.Other;
1573 kairera0467 186
1574     case 3:
1575     return this.Random;
1576    
1577     case 4:
1578     return this.BackBox;
1579 kairera0467 2 }
1580     throw new IndexOutOfRangeException();
1581     }
1582     set
1583     {
1584     switch( index )
1585     {
1586     case 0:
1587     this.Score = value;
1588     return;
1589    
1590     case 1:
1591     this.Box = value;
1592     return;
1593    
1594     case 2:
1595     this.Other = value;
1596     return;
1597 kairera0467 186
1598     case 3:
1599     this.Random = value;
1600     return;
1601    
1602     case 4:
1603     this.BackBox = value;
1604     return;
1605 kairera0467 2 }
1606     throw new IndexOutOfRangeException();
1607     }
1608     }
1609     }
1610    
1611     private struct ST情報
1612     {
1613     public CActSelect曲リスト.E種別 e種別;
1614     public string strタイトル文字列;
1615 kairera0467 186 public string strティスト名;
1616 kairera0467 2 public CTexture txタイトル名;
1617 kairera0467 186 public CTexture txティスト名;
1618     public CTexture txパネル;
1619 kairera0467 409 public CTexture txカスタム曲名テクスチャ;
1620 kairera0467 412 public CTexture txカスタムアティスト名テクスチャ;
1621 kairera0467 186 public int nティスト名テクスチャの長さdot;
1622     public int nタイトル名テクスチャの長さdot;
1623 kairera0467 2 public STDGBVALUE<int> nスキル値;
1624     public Color col文字色;
1625 kairera0467 186 public string strDTXフォルダのパス;
1626 kairera0467 411 public string strPreimageのパス;
1627 kairera0467 186 public Cスコア.ST譜面情報 ar譜面情報;
1628 kairera0467 2 }
1629    
1630     private struct ST選曲バ
1631     {
1632     public CTexture Score;
1633     public CTexture Box;
1634     public CTexture Other;
1635     public CTexture this[ int index ]
1636     {
1637     get
1638     {
1639     switch( index )
1640     {
1641     case 0:
1642     return this.Score;
1643    
1644     case 1:
1645     return this.Box;
1646    
1647     case 2:
1648     return this.Other;
1649     }
1650     throw new IndexOutOfRangeException();
1651     }
1652     set
1653     {
1654     switch( index )
1655     {
1656     case 0:
1657     this.Score = value;
1658     return;
1659    
1660     case 1:
1661     this.Box = value;
1662     return;
1663    
1664     case 2:
1665     this.Other = value;
1666     return;
1667     }
1668     throw new IndexOutOfRangeException();
1669     }
1670     }
1671     }
1672    
1673 kairera0467 186 protected struct ST中心点
1674     {
1675     public float x;
1676     public float y;
1677     public float z;
1678     public float rotY;
1679     }
1680     /// <summary>
1681     /// <para>SSTFファイル絶対パス(key)とサムネイル画像(value)との辞書。</para>
1682     /// <para>アプリの起動から終了まで単純に増加を続け、要素が減ることはない。</para>
1683     /// </summary>
1684     protected Dictionary<string, CTexture> dicThumbnail = new Dictionary<string, CTexture>();
1685    
1686     /// <summary>
1687     /// <para>SSTFファイル絶対パス(key)とプロパティ画像(value)との辞書。</para>
1688     /// <para>アプリの起動から終了まで単純に増加を続け、要素が減ることはない。</para>
1689     /// </summary>
1690     protected Dictionary<string, CTexture> dicProperty = new Dictionary<string, CTexture>();
1691    
1692     protected ST中心点[] stマトリックス座標 = new ST中心点[] {
1693     #region [ 実は円弧配置になってない。射影行列間違ってるよスターレインボウ見せる気かよ… ]
1694     //-----------------
1695     new ST中心点() { x = -940.0000f, y = 4f, z = 320f, rotY = 0.4150f },
1696     new ST中心点() { x = -740.0000f, y = 4f, z = 230f, rotY = 0.4150f },
1697     new ST中心点() { x = -550.0000f, y = 4f, z = 150f, rotY = 0.4150f },
1698     new ST中心点() { x = -370.0000f, y = 4f, z = 70f, rotY = 0.4150f },
1699     new ST中心点() { x = -194.0000f, y = 4f, z = -6f, rotY = 0.4150f },
1700     new ST中心点() { x = 6.00002622683f, y = 2f, z = 0f, rotY = 0f },
1701     new ST中心点() { x = 204.0000f, y = 4f, z = 0f, rotY = -0.4150f },
1702     new ST中心点() { x = 362.0000f, y = 4f, z = 70f, rotY = -0.4150f },
1703     new ST中心点() { x = 528.0000f, y = 4f, z = 146f, rotY = -0.4150f },
1704     new ST中心点() { x = 686.0000f, y = 4f, z = 212f, rotY = -0.4150f },
1705     new ST中心点() { x = 848.0000f, y = 4f, z = 282f, rotY = -0.4150f },
1706     new ST中心点() { x = 1200.0000f, y = 4f, z = 450f, rotY = -0.4150f },
1707     new ST中心点() { x = 1500.0000f, y = 4f, z = -289.5575f, rotY = -0.9279888f },
1708     new ST中心点() { x = 1500.0000f, y = 4f, z = -289.5575f, rotY = -0.9279888f },
1709     //-----------------
1710     #endregion
1711     };
1712    
1713     protected readonly ST中心点[] stマトリックス曲名座標 = new ST中心点[] {
1714     #region [ 実は円弧配置になってない。射影行列間違ってるよスターレインボウ見せる気かよ… ]
1715     //-----------------
1716 kairera0467 431 new ST中心点() { x = -980.0000f, y = 4f, z = 350f, rotY = 0.4000f },
1717     new ST中心点() { x = -780.0000f, y = 4f, z = 264f, rotY = 0.4000f },
1718     new ST中心点() { x = -590.0000f, y = 4f, z = 174f, rotY = 0.4000f },
1719     new ST中心点() { x = -400.0000f, y = 4f, z = 92f, rotY = 0.4000f },
1720     new ST中心点() { x = -210.0000f, y = 4f, z = 10f, rotY = 0.4000f },
1721 kairera0467 186 new ST中心点() { x = 6.00002622683f, y = 2f, z = 0f, rotY = 0f },
1722 kairera0467 431 new ST中心点() { x = 210.0000f, y = 2f, z = 10f, rotY = -0.4000f },
1723     new ST中心点() { x = 400.0000f, y = 2f, z = 92f, rotY = -0.4f },
1724     new ST中心点() { x = 590.0000f, y = 2f, z = 174f, rotY = -0.4f },
1725     new ST中心点() { x = 780.0000f, y = 2f, z = 264f, rotY = -0.4f },
1726     new ST中心点() { x = 980.0000f, y = 2f, z = 350f, rotY = -0.4f },
1727 kairera0467 186 new ST中心点() { x = 1200.0000f, y = 2f, z = 450f, rotY = -0.4f },
1728     new ST中心点() { x = 1500.0000f, y = 2f, z = -289.5575f, rotY = -0.9279888f },
1729     new ST中心点() { x = 1500.0000f, y = 2f, z = -289.5575f, rotY = -0.9279888f },
1730     //-----------------
1731     #endregion
1732     };
1733     [StructLayout(LayoutKind.Sequential)]
1734     public struct STATUSPANEL
1735     {
1736     public string label;
1737     public int status;
1738     }
1739     public int nIndex;
1740     public STATUSPANEL[] stパネルマップ;
1741    
1742     public bool b登場アニメ全部完了;
1743 kairera0467 2 private Color color文字影 = Color.FromArgb( 0x40, 10, 10, 10 );
1744 kairera0467 510 public CCounter[] ct登場アニメ用 = new CCounter[ 15 ];
1745 kairera0467 2 private Font ft曲リスト用フォント;
1746     private long nスクロルタイマ;
1747     private int n現在のスクロルカウンタ;
1748     private int n現在の選択行;
1749     private int n目標のスクロルカウンタ;
1750 kairera0467 510 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), new Point(0x3e4, 0x282), new Point(0x500, 0x2b5) };
1751     private ST情報[] st情報 = new ST情報[ 15 ];
1752 kairera0467 2 private CTexture txSongNotFound, txEnumeratingSongs;
1753     private CTexture txアイテム数数字;
1754 kairera0467 510 private CTexture[] txTumbnail = new CTexture[15];
1755 kairera0467 186 private CTexture tx選曲パネル;
1756     private CTexture txパネル;
1757 kairera0467 494 private CTexture txパネル帯;
1758 kairera0467 186 private CTexture tx選択されている曲の曲名;
1759     private CTexture tx選択されている曲のアティスト名;
1760     private CTexture txクリアランプ;
1761     //CPrivateFont prvFont;
1762 kairera0467 223 private CPrivateFastFont prvFont;
1763 kairera0467 2
1764     private int nCurrentPosition = 0;
1765     private int nNumOfItems = 0;
1766    
1767     //private string strBoxDefSkinPath = "";
1768     private E種別 e曲のバ種別を返す( C曲リストノ song )
1769     {
1770     if( song != null )
1771     {
1772     switch( song.eド種別 )
1773     {
1774     case C曲リストノ.Eド種別.SCORE:
1775     case C曲リストノ.Eド種別.SCORE_MIDI:
1776     return E種別.Score;
1777    
1778     case C曲リストノ.Eド種別.BOX:
1779     return E種別.Box;
1780 kairera0467 186
1781     case C曲リストノ.Eド種別.BACKBOX:
1782     return E種別.BackBox;
1783    
1784     case C曲リストノ.Eド種別.RANDOM:
1785     return E種別.Random;
1786 kairera0467 2 }
1787     }
1788     return E種別.Other;
1789     }
1790     private C曲リストノ r次の曲( C曲リストノ song )
1791     {
1792     if( song == null )
1793     return null;
1794    
1795     List<C曲リストノ> list = ( song.r親ノ != null ) ? song.r親ノ.list子リスト : CDTXMania.Songs管理.list曲ル;
1796