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 510 - (show 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 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 < 15; 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 ].strPreimageのパス ) )
312 {
313 //txTumbnail = this.tサムネイルテクスチャを作成する( Path.GetDirectoryName( song.ScoreFile ) );
314 this.tパスを指定してサムネイル画像を生成する( i, this.st情報[ i ].strPreimageのパス, this.st情報[ i ].e種別 );
315 this.dicThumbnail.Add( this.st情報[ i ].strPreimageのパス, this.txTumbnail[ i ] );
316 }
317 txTumbnail[ i ] = this.dicThumbnail[ this.st情報[ i ].strPreimageのパス ];
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現在の選択行 - 7; i < ( ( this.n現在の選択行 - 7 ) + 15 ); i++ )
359 {
360 int index = ( i + 15 ) % 15;
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 < 15; 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\5_image_panel_guitar.png" ) );
608
609 if ( this.tx選曲パネル == null || CDTXMania.ConfigIni.bDrums有効 )
610 this.tx選曲パネル = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_image_panel.png"));
611
612 this.txパネル = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_music panel.png"));
613 //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
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 < 15; 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 ].strPreimageのパス != null )
634 {
635 if( !this.dicThumbnail.ContainsKey( this.st情報[ i ].strPreimageのパス ) )
636 {
637 //txTumbnail = this.tサムネイルテクスチャを作成する( Path.GetDirectoryName( song.ScoreFile ) );
638 this.tパスを指定してサムネイル画像を生成する( i, this.st情報[ i ].strPreimageのパス, this.st情報[ i ].e種別 );
639 this.dicThumbnail.Add( this.st情報[ i ].strPreimageのパス, this.txTumbnail[ i ] );
640 }
641 txTumbnail[ i ] = this.dicThumbnail[ this.st情報[ i ].strPreimageのパス ];
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 < 15; i++ )
713 {
714 CDTXMania.t安全にDisposeする( ref this.st情報[ i ].txタイトル名 );
715 CDTXMania.t安全にDisposeする( ref this.st情報[ i ].txティスト名 );
716 CDTXMania.t安全にDisposeする( ref this.st情報[ i ].txカスタム曲名テクスチャ );
717 CDTXMania.t安全にDisposeする( ref this.st情報[ i ].txカスタムアティスト名テクスチャ );
718 }
719
720 if( this.tx選択されている曲の曲名 != null )
721 {
722 this.tx選択されている曲の曲名.Dispose();
723 this.tx選択されている曲の曲名 = null;
724 }
725 if( this.tx選択されている曲のアティスト名 != null )
726 {
727 this.tx選択されている曲のアティスト名.Dispose();
728 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 CDTXMania.t安全にDisposeする( ref this.txEnumeratingSongs );
742 CDTXMania.t安全にDisposeする( ref this.txSongNotFound );
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 //CDTXMania.t安全にDisposeする( ref this.tx色帯 );
749 //CDTXMania.t安全にDisposeする( ref this.txランプ用帯 );
750
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 for( int i = 0; i < 15; i++ )
763 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 for( int i = 0; i < 15; i++ ) // パネルは全13枚。
791 {
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 for( int i = 0; i < 15; i++ ) // パネルは全13枚。
802 {
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 long n現在時刻 = CSound管理.rc演奏用タイマ.n現在時刻;
817
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 this.n現在の選択行 = ( this.n現在の選択行 + 1 ) % 15;
877
878 // 選択曲から7つ下のパネル(=新しく最下部に表示されるパネル。消えてしまう一番上のパネルを再利用する)に、新しい曲の情報を記載する。
879
880 C曲リストノ song = this.r現在選択中の曲;
881 for( int i = 0; i < 7; i++ )
882 song = this.r次の曲( song );
883
884 int index = ( this.n現在の選択行 + 7 ) % 15; // 新しく最下部に表示されるパネルのインデックス(0~12)。
885 this.st情報[ index ].strタイトル文字列 = song.strタイトル;
886 this.st情報[ index ].strティスト名 = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.ティスト名;
887 this.st情報[ index ].col文字色 = song.col文字色;
888 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 this.t曲名バの生成( index, this.st情報[ index ].strタイトル文字列, this.st情報[ index ].col文字色 );
891 this.tティスト名テクスチャの生成( index, this.st情報[ index ].strティスト名 );
892 this.tパネルの生成( index, this.st情報[ index ].strタイトル文字列, this.st情報[ index ].strティスト名, this.st情報[ index ].col文字色 );
893
894 if( !this.dicThumbnail.ContainsKey( this.st情報[ index ].strPreimageのパス ) )
895 {
896 //txTumbnail = this.tサムネイルテクスチャを作成する( Path.GetDirectoryName( song.ScoreFile ) );
897 this.tパスを指定してサムネイル画像を生成する( index, this.st情報[ index ].strPreimageのパス, this.st情報[ index ].e種別 );
898 this.dicThumbnail.Add( this.st情報[ index ].strPreimageのパス, this.txTumbnail[ index ] );
899 }
900 txTumbnail[ index ] = this.dicThumbnail[ this.st情報[ index ].strPreimageのパス ];
901
902
903 // stバー情報[] の内容を1行ずつずらす。
904
905 C曲リストノ song2 = this.r現在選択中の曲;
906 for( int i = 0; i < 7; i++ )
907 song2 = this.r前の曲( song2 );
908
909 for( int i = 0; i < 15; i++ )
910 {
911 int n = ( ( ( this.n現在の選択行 - 7 ) + i ) + 15 ) % 15;
912 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 this.t選択曲が変更された( false ); // スクロールバー用に今何番目を選択しているかを更新
928 if( this.tx選択されている曲の曲名 != null )
929 {
930 this.tx選択されている曲の曲名.Dispose();
931 this.tx選択されている曲の曲名 = null;
932 }
933 if( this.tx選択されている曲のアティスト名 != null )
934 {
935 this.tx選択されている曲のアティスト名.Dispose();
936 this.tx選択されている曲のアティスト名 = null;
937 }
938
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 this.n現在の選択行 = ( ( this.n現在の選択行 - 1 ) + 15 ) % 15;
954
955 // 選択曲から5つ上のパネル(=新しく最上部に表示されるパネル。消えてしまう一番下のパネルを再利用する)に、新しい曲の情報を記載する。
956
957 C曲リストノ song = this.r現在選択中の曲;
958 for( int i = 0; i < 7; i++ )
959 song = this.r前の曲( song );
960
961 int index = ( ( this.n現在の選択行 - 7 ) + 15 ) % 15; // 新しく最上部に表示されるパネルのインデックス(0~12)。
962 this.st情報[ index ].strタイトル文字列 = song.strタイトル;
963 this.st情報[ index ].strティスト名 = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song) ].譜面情報.ティスト名;
964 this.st情報[ index ].col文字色 = song.col文字色;
965 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 this.t曲名バの生成( index, this.st情報[ index ].strタイトル文字列, this.st情報[ index ].col文字色 );
968 this.tティスト名テクスチャの生成( index, this.st情報[ index ].strティスト名 );
969 this.tパネルの生成( index, this.st情報[ index ].strタイトル文字列, this.st情報[ index ].strティスト名, this.st情報[ index ].col文字色 );
970
971 if( !this.dicThumbnail.ContainsKey( this.st情報[ index ].strPreimageのパス ) )
972 {
973 //txTumbnail = this.tサムネイルテクスチャを作成する( Path.GetDirectoryName( song.ScoreFile ) );
974 this.tパスを指定してサムネイル画像を生成する( index, this.st情報[ index ].strPreimageのパス, this.st情報[ index ].e種別 );
975 this.dicThumbnail.Add( this.st情報[ index ].strPreimageのパス, this.txTumbnail[ index ] );
976 }
977 txTumbnail[ index ] = this.dicThumbnail[ this.st情報[ index ].strPreimageのパス ];
978
979
980 // stバー情報[] の内容を1行ずつずらす。
981
982 C曲リストノ song2 = this.r現在選択中の曲;
983 for( int i = 0; i < 7; i++ )
984 song2 = this.r前の曲( song2 );
985
986 for( int i = 0; i < 15; i++ )
987 {
988 int n = ( ( ( this.n現在の選択行 - 7 ) + i ) + 15 ) % 15;
989 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
1006 this.t選択曲が変更された( false ); // スクロールバー用に今何番目を選択しているかを更新
1007 if( this.tx選択されている曲の曲名 != null )
1008 {
1009 this.tx選択されている曲の曲名.Dispose();
1010 this.tx選択されている曲の曲名 = null;
1011 }
1012 if( this.tx選択されている曲のアティスト名 != null )
1013 {
1014 this.tx選択されている曲のアティスト名.Dispose();
1015 this.tx選択されている曲のアティスト名 = null;
1016 }
1017
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 this.txEnumeratingSongs.t2D描画( CDTXMania.app.Device, 530, 240 );
1042 }
1043 }
1044 else
1045 {
1046 if ( this.txSongNotFound != null )
1047 this.txSongNotFound.t2D描画( CDTXMania.app.Device, 500, 190 );
1048 }
1049 //-----------------
1050 #endregion
1051
1052 return 0;
1053 }
1054 var bar = SlimDX.Matrix.Identity;
1055
1056 var barL = SlimDX.Matrix.Identity;
1057
1058 Matrix[] barC = new Matrix[2];
1059 Matrix[] barLa = new Matrix[2];
1060 Matrix[] barU = new Matrix[2];
1061
1062 #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 #region [ デバッグ補助 ]
1126 //-----------------
1127 /*
1128 stマトリックス座標 = new ST中心点[] {
1129 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 new ST中心点() { x = 6.00002622683f, y = 2f, z = 0f, rotY = 0f },
1135 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 };
1144 */
1145 //-----------------
1146 #endregion
1147
1148 #region[ ジャケット画像のMatrix配列 ]
1149 //パネル1枚1枚にMatrixを割り当ててみる。
1150 //とりあえず構造の最適化無しで地味に作ってみる。
1151 Matrix[] matSongPanel = new SlimDX.Matrix[ 15 ];
1152 Matrix[] matJacket = new SlimDX.Matrix[ 15 ];
1153 ST中心点[] st3D座標 = new ST中心点[] {
1154 #region [ 計算なんてしていない。 ]
1155 //-----------------
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 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 new ST中心点() { x = 6.00002622683f, y = 8f, z = 0f, rotY = 0.0f }, //7
1165 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 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 //-----------------
1175 #endregion
1176 };
1177
1178 for( int i = 0; i < 15; i++ )
1179 {
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 //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
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 if( !this.b登場アニメ全部完了 )
1196 {
1197 #region [ (1) 登場アニメフェーズの描画。]
1198 //-----------------
1199 for( int i = 0; i < 15; i++ ) // パネルは全13枚。
1200 {
1201 if( this.ct登場アニメ用[ i ].n現在の値 >= 0 )
1202 {
1203 int nパネル番号 = ( ( ( this.n現在の選択行 - 7 ) + i ) + 15 ) % 15;
1204
1205 if( i == 8 )
1206 {
1207 #region [ ジャケット画像の描画 ]
1208 //-----------------
1209 if( this.st情報[ nパネル番号 ].txパネル != null )
1210 {
1211 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 this.st情報[ nパネル番号 ].txパネル.t3D描画( CDTXMania.app.Device, matSongPanel[ i ] );
1214 }
1215 if( this.txTumbnail[nパネル番号] != null )
1216 {
1217 float f拡大率 = (float)172.0 / this.txTumbnail[ nパネル番号 ].szテクスチャサイズ.Width;
1218 float f拡大率2 = (float)172.0 / this.txTumbnail[ nパネル番号 ].szテクスチャサイズ.Height;
1219
1220 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 matJacket[ i ] *= SlimDX.Matrix.Translation( st3D座標[ i ].x, st3D座標[ i ].y - 1.5f, st3D座標[ i ].z );
1223
1224 this.txTumbnail[ nパネル番号 ].t3D描画(CDTXMania.app.Device, matJacket[ i ] );
1225 }
1226 //-----------------
1227 #endregion
1228 #region [ タイトル名テクスチャを描画。]
1229 //-----------------
1230 if( this.st情報[nパネル番号].txタイトル名 != null )
1231 {
1232 var mat = SlimDX.Matrix.Identity;
1233 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 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 if( this.tx選曲パネル != null )
1253 this.tx選曲パネル.t2D描画( CDTXMania.app.Device, 761, 233, new Rectangle( 304, 70, 59, 242 ) );
1254 }
1255 else if( i == 7 )
1256 {
1257 }
1258 else
1259 {
1260 // (B) その他のパネルの描画。
1261 #region [ ジャケット画像の描画 ]
1262 //-----------------
1263 if( this.st情報[ nパネル番号 ].txパネル != null )
1264 {
1265 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 }
1269 if( this.txTumbnail[nパネル番号] != null )
1270 {
1271 float f拡大率 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Width ;
1272 float f拡大率2 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Height;
1273
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 matJacket[ i ] *= SlimDX.Matrix.Translation( st3D座標[ i ].x, st3D座標[ i ].y - 1.5f, st3D座標[ i ].z );
1277
1278 this.txTumbnail[nパネル番号].t3D描画( CDTXMania.app.Device, matJacket[ i ] );
1279 }
1280 //-----------------
1281 #endregion
1282 }
1283 }
1284 }
1285
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 //-----------------
1343 #endregion
1344
1345 }
1346 else
1347 {
1348 //CDTXMania.act文字コンソール.tPrint( 0, 0, C文字コンソール.Eフォント種別.白, this.n現在のスクロールカウンタ.ToString() );
1349 #region [ (2) 通常フェーズの描画。]
1350 //-----------------
1351 for( int i = 0; i < 15; i++ ) // パネルは全13枚。
1352 {
1353 int nパネル番号 = ( ( ( this.n現在の選択行 - 7 ) + i ) + 15 ) % 15;
1354 int n見た目の行番号 = i;
1355 int n次のパネル番号 = ( this.n現在のスクロルカウンタ <= 0 ) ? ( ( i + 1 ) % 15 ) : ( ( ( i - 1 ) + 15 ) % 15 );
1356 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 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
1361 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
1364 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
1367 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 //デバッグ用
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
1377
1378
1379 if( i == 8 )
1380 {
1381 #region [ ジャケット画像の描画 ]
1382 //-----------------
1383 if( this.st情報[ nパネル番号 ].txパネル != null )
1384 {
1385 matSongPanel[ i ] *= SlimDX.Matrix.RotationYawPitchRoll( fR, 0.0f, 0.0f );
1386 matSongPanel[ i ] *= SlimDX.Matrix.Translation( fX, st3D座標[ i ].y, fZ );
1387 this.st情報[ nパネル番号 ].txパネル.t3D描画( CDTXMania.app.Device, matSongPanel[ i ] );
1388 }
1389 if (this.txTumbnail[ nパネル番号 ] != null)
1390 {
1391 float f拡大率 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Width;
1392 float f拡大率2 = (float)172.0 / this.txTumbnail[nパネル番号].szテクスチャサイズ.Height;
1393
1394 matJacket[ i ] *= SlimDX.Matrix.Scaling( f拡大率 * CTexture.f画面比率 - 0.084f, f拡大率2 * CTexture.f画面比率 + 0.05f, 1.0f );
1395 matJacket[ i ] *= SlimDX.Matrix.RotationYawPitchRoll( fR, 0.0f, 0.0f );
1396 matJacket[ i ] *= SlimDX.Matrix.Translation( fX, st3D座標[ i ].y - 1.5f, fZ );
1397
1398 this.txTumbnail[ nパネル番号 ].t3D描画(CDTXMania.app.Device, matJacket[ i ] );
1399 }
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 else if( i == 7 || i == 0 || i == 14)
1428 {
1429 //選択曲、画面外の曲のジャケット画像は表示しない。
1430 }
1431 else
1432 {
1433 #region [ ジャケット画像の描画 ]
1434 //-----------------
1435 if( this.st情報[ nパネル番号 ].txパネル != null )
1436 {
1437 matSongPanel[ i ] *= SlimDX.Matrix.RotationYawPitchRoll( st3D座標[ i ].rotY, 0.0f, 0.0f );
1438 matSongPanel[ i ] *= SlimDX.Matrix.Translation( fX, st3D座標[ i ].y, fZ );
1439 this.st情報[ nパネル番号 ].txパネル.t3D描画( CDTXMania.app.Device, matSongPanel[ i ] );
1440 }
1441 if( this.txTumbnail[ nパネル番号 ] != null )
1442 {
1443 float f拡大率 = (float)172.0 / this.txTumbnail[ nパネル番号 ].szテクスチャサイズ.Width ;
1444 float f拡大率2 = (float)172.0 / this.txTumbnail[ nパネル番号 ].szテクスチャサイズ.Height;
1445
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 matJacket[ i ] *= SlimDX.Matrix.Translation( fX, st3D座標[ i ].y - 1.5f, fZ );
1449
1450 this.txTumbnail[ nパネル番号 ].t3D描画( CDTXMania.app.Device, matJacket[ i ] );
1451 }
1452 //-----------------
1453 #endregion
1454 }
1455 }
1456
1457 //選択中の曲
1458 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 #region[ 中央パネル ]
1467 if( this.tx選曲パネル != null )
1468 this.tx選曲パネル.t2D描画(CDTXMania.app.Device, 457, 163, new Rectangle( 0, 0, 363, 368 ) );
1469 #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 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 }
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 #endregion
1517
1518 }
1519 #region [ スクロール地点の計算(描画はCActSelectShowCurrentPositionにて行う) #27648 ]
1520 int py;
1521 double d = 0;
1522 if ( nNumOfItems > 1 )
1523 {
1524 d = ( 336 - 8 ) / (double) ( nNumOfItems - 1 );
1525 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 if ( py + delta <= 336 - 8 )
1534 {
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 private enum E種別 { Score, Box, Other, Random, BackBox }
1551
1552 private struct ST
1553 {
1554 public CTexture Score;
1555 public CTexture Box;
1556 public CTexture Other;
1557 public CTexture Random;
1558 public CTexture BackBox;
1559 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
1574 case 3:
1575 return this.Random;
1576
1577 case 4:
1578 return this.BackBox;
1579 }
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
1598 case 3:
1599 this.Random = value;
1600 return;
1601
1602 case 4:
1603 this.BackBox = value;
1604 return;
1605 }
1606 throw new IndexOutOfRangeException();
1607 }
1608 }
1609 }
1610
1611 private struct ST情報
1612 {
1613 public CActSelect曲リスト.E種別 e種別;
1614 public string strタイトル文字列;
1615 public string strティスト名;
1616 public CTexture txタイトル名;
1617 public CTexture txティスト名;
1618 public CTexture txパネル;
1619 public CTexture txカスタム曲名テクスチャ;
1620 public CTexture txカスタムアティスト名テクスチャ;
1621 public int nティスト名テクスチャの長さdot;
1622 public int nタイトル名テクスチャの長さdot;
1623 public STDGBVALUE<int> nスキル値;
1624 public Color col文字色;
1625 public string strDTXフォルダのパス;
1626 public string strPreimageのパス;
1627 public Cスコア.ST譜面情報 ar譜面情報;
1628 }
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 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 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 new ST中心点() { x = 6.00002622683f, y = 2f, z = 0f, rotY = 0f },
1722 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 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 private Color color文字影 = Color.FromArgb( 0x40, 10, 10, 10 );
1744 public CCounter[] ct登場アニメ用 = new CCounter[ 15 ];
1745 private Font ft曲リスト用フォント;
1746 private long nスクロルタイマ;
1747 private int n現在のスクロルカウンタ;
1748 private int n現在の選択行;
1749 private int n目標のスクロルカウンタ;
1750 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 private CTexture txSongNotFound, txEnumeratingSongs;
1753 private CTexture txアイテム数数字;
1754 private CTexture[] txTumbnail = new CTexture[15];
1755 private CTexture tx選曲パネル;
1756 private CTexture txパネル;
1757 private CTexture txパネル帯;
1758 private CTexture tx選択されている曲の曲名;
1759 private CTexture tx選択されている曲のアティスト名;
1760 private CTexture txクリアランプ;
1761 //CPrivateFont prvFont;
1762 private CPrivateFastFont prvFont;
1763
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
1781 case C曲リストノ.Eド種別.BACKBOX:
1782 return E種別.BackBox;
1783
1784 case C曲リストノ.Eド種別.RANDOM:
1785 return E種別.Random;
1786 }
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
1797 int index = list.IndexOf( song );
1798
1799 if( index < 0 )
1800 return null;
1801
1802 if( index == ( list.Count - 1 ) )
1803 return list[ 0 ];
1804
1805 return list[ index + 1 ];
1806 }
1807 private C曲リストノ r前の曲( C曲リストノ song )
1808 {
1809 if( song == null )
1810 return null;
1811
1812 List<C曲リストノ> list = ( song.r親ノ != null ) ? song.r親ノ.list子リスト : CDTXMania.Songs管理.list曲ル;
1813
1814 int index = list.IndexOf( song );
1815
1816 if( index < 0 )
1817 return null;
1818
1819 if( index == 0 )
1820 return list[ list.Count - 1 ];
1821
1822 return list[ index - 1 ];
1823 }
1824
1825 private void tの初期化()
1826 {
1827 C曲リストノ song = this.r現在選択中の曲;
1828
1829 if( song == null )
1830 return;
1831
1832 for( int i = 0; i < 7; i++ )
1833 song = this.r前の曲( song );
1834
1835 for( int i = 0; i < 15; i++ )
1836 {
1837 this.st情報[ i ].strタイトル文字列 = song.strタイトル;
1838 this.st情報[ i ].strティスト名 = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.ティスト名;
1839 this.st情報[ i ].col文字色 = song.col文字色;
1840 this.st情報[ i ].e種別 = this.e曲のバ種別を返す( song );
1841 this.st情報[ i ].ar譜面情報 = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報;
1842
1843 //for( int n = 0; n < 5; n++ )
1844 {
1845 //this.stバー情報[ i ].ar難易度ラベル[ n ];
1846
1847 //if( this.stバー情報[ i ].ar難易度ラベル[ n ] != null )
1848 //this.stバー情報[ i ].ar難易度ラベル[ n ] = song.ar難易度ラベル[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ];
1849 }
1850
1851 this.st情報[ i ].strDTXフォルダのパス = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].ファイル情報.フォルダの絶対パス;
1852 this.st情報[ i ].strPreimageのパス = song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].ファイル情報.フォルダの絶対パス + song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.Preimage;
1853 this.tパネルの生成(i, song.strタイトル, this.st情報[ i ].strティスト名, song.col文字色);
1854 if( this.st情報[ i ].strPreimageのパス != null )
1855 {
1856 if( !this.dicThumbnail.ContainsKey( this.st情報[ i ].strPreimageのパス ) )
1857 {
1858 //txTumbnail = this.tサムネイルテクスチャを作成する( Path.GetDirectoryName( song.ScoreFile ) );
1859 this.tパスを指定してサムネイル画像を生成する( i, this.st情報[ i ].strPreimageのパス, this.st情報[ i ].e種別 );
1860 this.dicThumbnail.Add( this.st情報[ i ].strPreimageのパス, this.txTumbnail[ i ] );
1861 }
1862 txTumbnail[ i ] = this.dicThumbnail[ this.st情報[ i ].strPreimageのパス ];
1863 }
1864
1865 for( int j = 0; j < 3; j++ )
1866 this.st情報[ i ].nスキル値[ j ] = (int) song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.最大スキル[ j ];
1867
1868 song = this.r次の曲( song );
1869 }
1870
1871 this.n現在の選択行 = 7;
1872 }
1873 private void tパスを指定してサムネイル画像を生成する( int n番号, string strDTXPath, E種別 eType )
1874 {
1875 if( n番号 < 0 || n番号 > 15 )
1876 return;
1877
1878 //try
1879 {
1880 //if ( this.stバー情報[ nバー番号 ].eバー種別 == Eバー種別.Score || this.stバー情報[ nバー番号 ].eバー種別 == Eバー種別.Box)
1881 {
1882 if (!File.Exists(strDTXPath))
1883 {
1884 this.txTumbnail[n番号] = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_preimage default.png"), false);
1885 }
1886 else
1887 {
1888 this.txTumbnail[n番号] = CDTXMania.tテクスチャの生成(strDTXPath);
1889 }
1890 }
1891 //else if( this.stバー情報[ nバー番号 ].eバー種別 == Eバー種別.Random)
1892 //{
1893 // if( this.txジャケットランダム != null )
1894 // this.txTumbnail[ nバー番号 ] = this.txジャケットランダム;
1895 //}
1896 //else if( this.stバー情報[ nバー番号 ].eバー種別 == Eバー種別.BackBox)
1897 //{
1898 // if( this.txジャケットボックスクローズ != null )
1899 // this.txTumbnail[ nバー番号 ] = this.txジャケットボックスクローズ;
1900 //}
1901 }
1902 /*
1903 catch( CTextureCreateFailedException )
1904 {
1905 if ( this.txジャケット指定が無い場合の画像 != null )
1906 {
1907 this.txTumbnail[ nバー番号 ] = this.txジャケット指定が無い場合の画像;
1908 }
1909 else
1910 {
1911 this.txTumbnail[ nバー番号 ] = null;
1912 }
1913 }
1914 */
1915 }
1916 private CTexture tパスを指定してサムネイル画像を生成して返す( int n番号, string strDTXPath, E種別 eType )
1917 {
1918 if (n番号 < 0 || n番号 > 15)
1919 return this.txTumbnail[n番号] = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_preimage default.png"), false);
1920
1921 //try
1922 {
1923 //if (eType == Eバー種別.Score || eType == Eバー種別.Box)
1924 {
1925 if (!File.Exists(strDTXPath))
1926 {
1927 return this.txTumbnail[n番号] = CDTXMania.tテクスチャの生成(CSkin.Path(@"Graphics\5_preimage default.png"), false);
1928 }
1929 else
1930 {
1931 return this.txTumbnail[n番号] = CDTXMania.tテクスチャの生成(strDTXPath);
1932 }
1933 }
1934 //else if (eType == Eバー種別.Random)
1935 {
1936 // if(this.txジャケットランダム != null)
1937 // this.txTumbnail[nバー番号] = this.txジャケットランダム;
1938 }
1939 //else if (eType == Eバー種別.BackBox)
1940 {
1941 // if(this.txジャケットボックスクローズ != null)
1942 // this.txTumbnail[nバー番号] = this.txジャケットボックスクローズ;
1943 }
1944 }
1945 /*
1946 catch( CTextureCreateFailedException )
1947 {
1948 if ( this.txジャケット指定が無い場合の画像 != null )
1949 {
1950 this.txTumbnail[ nバー番号 ] = this.txジャケット指定が無い場合の画像;
1951 }
1952 else
1953 {
1954 this.txTumbnail[ nバー番号 ] = null;
1955 }
1956 }
1957 */
1958 }
1959 private CTexture t指定された文字テクスチャを生成する( string str文字 )
1960 {
1961 //2013.09.05.kairera0467 中央にしか使用することはないので、色は黒固定。
1962 //現在は機能しない(面倒なので実装してない)が、そのうち使用する予定。
1963 //PrivateFontの試験運転も兼ねて。
1964 //CPrivateFastFont
1965 prvFont = new CPrivateFastFont( new FontFamily( CDTXMania.ConfigIni.str選曲リストフォント ), 28, FontStyle.Regular );
1966 Bitmap bmp;
1967
1968 bmp = prvFont.DrawPrivateFont( str文字, Color.Black, Color.Transparent );
1969
1970 SizeF sz曲名;
1971
1972 #region [ 曲名表示に必要となるサイズを取得する。]
1973 //-----------------
1974 using( var bmpDummy = new Bitmap(1, 1) )
1975 {
1976 var g = Graphics.FromImage( bmpDummy );
1977 g.PageUnit = GraphicsUnit.Pixel;
1978 sz曲名 = g.MeasureString( str文字, this.ft曲リスト用フォント);
1979 g.Dispose();
1980 //this.stバー情報[ nバー番号 ].nタイトル名テクスチャの長さdot = (int)g.MeasureString(str文字, this.ft曲リスト用フォント).Width;
1981 }
1982 //-----------------
1983 #endregion
1984 int n最大幅px = 200;
1985 int height = 25;
1986 int width = (int)((sz曲名.Width + 2) * 0.5f);
1987 if (width > (CDTXMania.app.Device.Capabilities.MaxTextureWidth / 2))
1988 width = CDTXMania.app.Device.Capabilities.MaxTextureWidth / 2; // 右端断ち切れ仕方ないよね
1989
1990 float f拡大率X = (width <= n最大幅px) ? 0.5f : (((float)n最大幅px / (float)width) * 0.5f); // 長い文字列は横方向に圧縮。
1991
1992 CTexture tx文字テクスチャ = CDTXMania.tテクスチャの生成( bmp, false );
1993
1994 if( tx文字テクスチャ != null )
1995 tx文字テクスチャ.vc拡大縮小倍率 = new Vector3( f拡大率X, 0.5f, 1f );
1996
1997 //prvFont.Dispose();
1998 bmp.Dispose();
1999
2000 return tx文字テクスチャ;
2001 }
2002 private void tパネルの生成( int n番号, string str曲名, string strティスト名, Color color )
2003 {
2004 //t3D描画の仕様上左詰や右詰が面倒になってしまうので、
2005 //パネルにあらかじめ曲名とアーティスト名を埋め込んでおく。
2006
2007 if( n番号 < 0 || n番号 > 15 )
2008 return;
2009 try
2010 {
2011 Bitmap b4font;
2012 Bitmap bSongPanel;
2013 Image imgSongPanel;
2014 Image imgCustomSongNameTexture;
2015 Image imgCuttomArtistNameTexture;
2016 SizeF sz曲名;
2017 SizeF szティスト名;
2018
2019 bool bFoundTitleTexture = false;
2020 bool bFoundArtistTexture = false;
2021
2022 b4font = new Bitmap( 1, 1 );
2023 Graphics graphics = Graphics.FromImage( b4font );
2024 graphics.PageUnit = GraphicsUnit.Pixel;
2025 imgSongPanel = Image.FromFile( CSkin.Path( @"Graphics\5_music panel.png" ) );
2026
2027 bSongPanel = new Bitmap( 223, 279 );
2028
2029 graphics = Graphics.FromImage( bSongPanel );
2030 graphics.DrawImage( imgSongPanel, 0, 0, 223, 279 );
2031
2032 string strPassBefore = "";
2033 string strPassAfter = "";
2034 try
2035 {
2036 strPassBefore = this.st情報[ n番号 ].strDTXフォルダのパス;
2037 strPassAfter = strPassBefore.Replace( this.st情報[ n番号 ].ar譜面情報.Preimage, "" );
2038 }
2039 catch
2040 {
2041 //Replaceでエラーが出たらここで適切な処理ができるようにしたい。
2042 strPassBefore = "";
2043 strPassAfter = "";
2044
2045 }
2046 string strPath = ( strPassAfter + "TitleTexture.png" );
2047 if( File.Exists( ( strPath ) ) )
2048 {
2049 imgCustomSongNameTexture = Image.FromFile( strPath );
2050 graphics.DrawImage( imgCustomSongNameTexture, 4, -1, 223, 33 );
2051 bFoundTitleTexture = true;
2052 }
2053 if( File.Exists( ( strPassAfter + "ArtistTexture.png" ) ) )
2054 {
2055 imgCuttomArtistNameTexture = Image.FromFile( strPassAfter + "ArtistTexture.png" );
2056 graphics.DrawImage(imgCuttomArtistNameTexture, 0, 252, 223, 26);
2057 bFoundArtistTexture = true;
2058 }
2059
2060
2061 #region [ 曲名表示に必要となるサイズを取得する。]
2062 //-----------------
2063 using( var bmpDummy = new Bitmap( 1, 1 ) )
2064 {
2065 var g = Graphics.FromImage( bmpDummy );
2066 g.PageUnit = GraphicsUnit.Pixel;
2067 sz曲名 = g.MeasureString( str曲名, this.ft曲リスト用フォント );
2068 szティスト名 = g.MeasureString( strティスト名, this.ft曲リスト用フォント );
2069 this.st情報[ n番号 ].nタイトル名テクスチャの長さdot = (int) g.MeasureString( strティスト名, new Font( CDTXMania.ConfigIni.str選曲リストフォント, 16 ) ).Width;
2070 g.Dispose();
2071 }
2072 //-----------------
2073 #endregion
2074
2075 int n最大幅px = 200;
2076 int height = 25;
2077 int width = (int) ( ( sz曲名.Width + 2 ) );
2078 if( width > ( CDTXMania.app.Device.Capabilities.MaxTextureWidth ) )
2079 width = CDTXMania.app.Device.Capabilities.MaxTextureWidth; // 右端断ち切れ仕方ないよね
2080
2081 float f拡大率X = ( width <= n最大幅px ) ? 1 : ( ( (float) n最大幅px / (float) width ) ); // 長い文字列は横方向に圧縮。
2082
2083 using( var bmp = new Bitmap( width, height, PixelFormat.Format32bppArgb ) ) // 2倍(面積4倍)のBitmapを確保。(0.5倍で表示する前提。)
2084 using( var g = Graphics.FromImage( bmp ) )
2085 {
2086 graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
2087 float y = ( ( ( float ) bmp.Height ) ) - ( ( CDTXMania.ConfigIni.n選曲リストフォントのサイズdot ) );
2088 //graphics.DrawString( str曲名, this.ft曲リスト用フォント, new SolidBrush( this.color文字影 ), (float) 2f, (float) ( y + 2f ) );
2089 if( bFoundTitleTexture == false )
2090 graphics.DrawString( str曲名, new Font( CDTXMania.ConfigIni.str選曲リストフォント, 16 ), new SolidBrush( color ), 5f, y - 2 );
2091 if( bFoundArtistTexture == false )
2092 graphics.DrawString( strティスト名, new Font( CDTXMania.ConfigIni.str選曲リストフォント, 16 ), new SolidBrush( Color.White ), (float)218f - this.st情報[ n番号 ].nタイトル名テクスチャの長さdot, 255f);
2093 //graphics.DrawString( strアーティスト名, this.ft曲リスト用フォント, new SolidBrush( Color.White ), 234f, 258f );
2094
2095 CDTXMania.t安全にDisposeする( ref this.st情報[ n番号 ].txパネル );
2096
2097 this.st情報[ n番号 ].txパネル = new CTexture( CDTXMania.app.Device, bSongPanel, CDTXMania.TextureFormat, false );
2098
2099 bmp.Dispose();
2100 g.Dispose();
2101 }
2102
2103 b4font.Dispose();
2104 bSongPanel.Dispose();
2105 imgSongPanel.Dispose();
2106 graphics.Dispose();
2107 }
2108 catch( CTextureCreateFailedException )
2109 {
2110 Trace.TraceError( "曲名テクスチャの作成に失敗しました。[{0}]", str曲名 );
2111 this.st情報[ n番号 ].txパネル = null;
2112 }
2113
2114 }
2115
2116 private CTexture tカスタム曲名の生成( int n番号 )
2117 {
2118 //t3D描画の仕様上左詰や右詰が面倒になってしまうので、
2119 //パネルにあらかじめ曲名とアーティスト名を埋め込んでおく。
2120
2121 Bitmap b4font;
2122 Bitmap bCustomSongNameTexture;
2123 Image imgCustomSongNameTexture;
2124
2125 b4font = new Bitmap( 1, 1 );
2126 Graphics graphicsA = Graphics.FromImage( b4font );
2127
2128 graphicsA.PageUnit = GraphicsUnit.Pixel;
2129
2130 imgCustomSongNameTexture = Image.FromFile( CSkin.Path( @"Graphics\7_Dummy.png" ) );
2131
2132
2133 bCustomSongNameTexture = new Bitmap( 240, 40 );
2134
2135 graphicsA = Graphics.FromImage( bCustomSongNameTexture );
2136 graphicsA.DrawImage( bCustomSongNameTexture, 0, 0, 180, 25 );
2137
2138
2139 string strPassAfter = "";
2140 try
2141 {
2142 strPassAfter = this.st情報[ n番号 ].strDTXフォルダのパス;
2143 }
2144 catch
2145 {
2146 strPassAfter = "";
2147 }
2148
2149 string strPath = ( strPassAfter + "TitleTexture.png" );
2150 if( File.Exists( ( strPath ) ) )
2151 {
2152 imgCustomSongNameTexture = Image.FromFile( strPath );
2153 imgCustomSongNameTexture = this.CreateNegativeImage( imgCustomSongNameTexture );
2154 graphicsA.DrawImage( imgCustomSongNameTexture, 6, 1, 180, 25 );
2155 imgCustomSongNameTexture.Dispose();
2156 }
2157
2158
2159 //CDTXMania.t安全にDisposeする( ref this.stバー情報[ nバー番号 ].txカスタム曲名テクスチャ );
2160 //CDTXMania.t安全にDisposeする( ref this.stバー情報[ nバー番号 ].txカスタムアーティスト名テクスチャ );
2161 CTexture txTex = new CTexture( CDTXMania.app.Device, bCustomSongNameTexture, CDTXMania.TextureFormat, false );
2162
2163 b4font.Dispose();
2164 graphicsA.Dispose();
2165 bCustomSongNameTexture.Dispose();
2166
2167 return txTex;
2168 }
2169 private CTexture tカスタムアティスト名テクスチャの生成( int n番号 )
2170 {
2171 //t3D描画の仕様上左詰や右詰が面倒になってしまうので、
2172 //パネルにあらかじめ曲名とアーティスト名を埋め込んでおく。
2173
2174 Bitmap b4font;
2175 Bitmap bCustomArtistNameTexture;
2176 Image imgCustomArtistNameTexture;
2177
2178 b4font = new Bitmap( 1, 1 );
2179 Graphics graphics = Graphics.FromImage( b4font );
2180
2181 graphics.PageUnit = GraphicsUnit.Pixel;
2182
2183 imgCustomArtistNameTexture = Image.FromFile( CSkin.Path( @"Graphics\7_Dummy.png" ) );
2184
2185
2186 bCustomArtistNameTexture = new Bitmap( 210, 27 );
2187
2188 graphics = Graphics.FromImage( bCustomArtistNameTexture );
2189 graphics.DrawImage( bCustomArtistNameTexture, 0, 0, 196, 27 );
2190
2191
2192 string strPassAfter = "";
2193 try
2194 {
2195 strPassAfter = this.st情報[ n番号 ].strDTXフォルダのパス;
2196 }
2197 catch
2198 {
2199 strPassAfter = "";
2200 }
2201
2202 string strPath = (strPassAfter + "ArtistTexture.png");
2203 if (File.Exists((strPath)))
2204 {
2205 imgCustomArtistNameTexture = Image.FromFile(strPath);
2206 imgCustomArtistNameTexture = this.CreateNegativeImage( imgCustomArtistNameTexture );
2207 graphics.DrawImage(imgCustomArtistNameTexture, 16, 2, 196, 27);
2208 }
2209
2210 //CDTXMania.t安全にDisposeする( ref this.stバー情報[ nバー番号 ].txカスタム曲名テクスチャ );
2211 //CDTXMania.t安全にDisposeする( ref this.stバー情報[ nバー番号 ].txカスタムアーティスト名テクスチャ );
2212 this.st情報[n番号].nティスト名テクスチャの長さdot = 210;
2213 CTexture txTex = new CTexture( CDTXMania.app.Device, bCustomArtistNameTexture, CDTXMania.TextureFormat, false );
2214 return txTex;
2215 }
2216 private void t曲名バの生成( int n番号, string str曲名, Color color )
2217 {
2218 if( n番号 < 0 || n番号 > 15 )
2219 return;
2220
2221 try
2222 {
2223 SizeF sz曲名;
2224
2225 #region [ 曲名表示に必要となるサイズを取得する。]
2226 //-----------------
2227 using( var bmpDummy = new Bitmap( 1, 1 ) )
2228 {
2229 var g = Graphics.FromImage( bmpDummy );
2230 g.PageUnit = GraphicsUnit.Pixel;
2231 sz曲名 = g.MeasureString( str曲名, this.ft曲リスト用フォント );
2232 this.st情報[ n番号 ].nタイトル名テクスチャの長さdot = (int) g.MeasureString( str曲名, this.ft曲リスト用フォント ).Width;
2233 }
2234 //-----------------
2235 #endregion
2236
2237 int n最大幅px = 200;
2238 int height = 25;
2239 int width = (int) ( ( sz曲名.Width + 2 ) * 0.5f );
2240 if( width > ( CDTXMania.app.Device.Capabilities.MaxTextureWidth / 2 ) )
2241 width = CDTXMania.app.Device.Capabilities.MaxTextureWidth / 2; // 右端断ち切れ仕方ないよね
2242
2243 float f拡大率X = ( width <= n最大幅px ) ? 0.5f : ( ( (float) n最大幅px / (float) width ) * 0.5f ); // 長い文字列は横方向に圧縮。
2244
2245 using( var bmp = new Bitmap( width * 2, height * 2, PixelFormat.Format32bppArgb ) ) // 2倍(面積4倍)のBitmapを確保。(0.5倍で表示する前提。)
2246 using( var g = Graphics.FromImage( bmp ) )
2247 {
2248 g.TextRenderingHint = TextRenderingHint.AntiAlias;
2249 float y = ( ( ( float ) bmp.Height ) / 2f ) - ( ( CDTXMania.ConfigIni.n選曲リストフォントのサイズdot * 2f ) / 2f );
2250 g.DrawString( str曲名, this.ft曲リスト用フォント, new SolidBrush( this.color文字影 ), (float) 2f, (float) ( y + 2f ) );
2251 g.DrawString( str曲名, this.ft曲リスト用フォント, new SolidBrush( color ), 0f, y );
2252
2253 CDTXMania.t安全にDisposeする( ref this.st情報[ n番号 ].txタイトル名 );
2254
2255 this.st情報[ n番号 ].txタイトル名 = new CTexture( CDTXMania.app.Device, bmp, CDTXMania.TextureFormat, false );
2256 this.st情報[ n番号 ].txタイトル名.vc拡大縮小倍率 = new Vector3( f拡大率X, 0.5f, 1f );
2257 }
2258 }
2259 catch( CTextureCreateFailedException )
2260 {
2261 Trace.TraceError( "曲名テクスチャの作成に失敗しました。[{0}]", str曲名 );
2262 this.st情報[ n番号 ].txタイトル名 = null;
2263 }
2264 }
2265 private void tティスト名テクスチャの生成( int n番号, string strティスト名 )
2266 {
2267 if( n番号 < 0 || n番号 > 15 )
2268 return;
2269
2270 try
2271 {
2272 SizeF szティスト名;
2273
2274 #region [ 曲名表示に必要となるサイズを取得する。]
2275 //-----------------
2276 using( var bmpDummy = new Bitmap( 1, 1 ) )
2277 {
2278 var g = Graphics.FromImage( bmpDummy );
2279 g.PageUnit = GraphicsUnit.Pixel;
2280 szティスト名 = g.MeasureString( strティスト名, this.ft曲リスト用フォント );
2281 }
2282 //-----------------
2283 #endregion
2284
2285 int n最大幅px = 210;
2286 int height = 25;
2287 int width = (int) ( ( szティスト名.Width + 2 ) * 0.5f );
2288 if( width > ( CDTXMania.app.Device.Capabilities.MaxTextureWidth / 2 ) )
2289 width = CDTXMania.app.Device.Capabilities.MaxTextureWidth / 2; // 右端断ち切れ仕方ないよね
2290
2291 float f拡大率X = ( width <= n最大幅px ) ? 0.5f : ( ( (float) n最大幅px / (float) width ) * 0.5f ); // 長い文字列は横方向に圧縮。
2292
2293 using( var bmp = new Bitmap( width * 2, height * 2, PixelFormat.Format32bppArgb ) ) // 2倍(面積4倍)のBitmapを確保。(0.5倍で表示する前提。)
2294 using( var g = Graphics.FromImage( bmp ) )
2295 {
2296 g.TextRenderingHint = TextRenderingHint.AntiAlias;
2297 float y = ( ( ( float ) bmp.Height ) / 2f ) - ( ( CDTXMania.ConfigIni.n選曲リストフォントのサイズdot * 2f ) / 2f );
2298 g.DrawString( strティスト名, this.ft曲リスト用フォント, new SolidBrush( this.color文字影 ), (float)2f, (float)(y + 2f));
2299 g.DrawString( strティスト名, this.ft曲リスト用フォント, new SolidBrush( Color.White ), 0f, y );
2300
2301 CDTXMania.t安全にDisposeする( ref this.st情報[ n番号 ].txティスト名 );
2302 this.st情報[ n番号 ].nティスト名テクスチャの長さdot = (int)((g.MeasureString(strティスト名, this.ft曲リスト用フォント).Width) * f拡大率X);
2303 this.st情報[ n番号 ].txティスト名 = new CTexture( CDTXMania.app.Device, bmp, CDTXMania.TextureFormat, false );
2304 this.st情報[ n番号 ].txティスト名.vc拡大縮小倍率 = new Vector3( f拡大率X, 0.5f, 1f );
2305 }
2306 }
2307 catch( CTextureCreateFailedException )
2308 {
2309 Trace.TraceError( "曲名テクスチャの作成に失敗しました。[{0}]", strティスト名 );
2310 this.st情報[ n番号 ].txティスト名 = null;
2311 }
2312 }
2313 private void tアイテム数の描画()
2314 {
2315 string s = nCurrentPosition.ToString() + "/" + nNumOfItems.ToString();
2316 int x = 1150;
2317 int y = 200;
2318
2319 for (int p = s.Length - 1; p >= 0; p--)
2320 {
2321 tアイテム数の描画・1桁描画(x, y, s[p]);
2322 x -= 16;
2323 }
2324 }
2325 private void tアイテム数の描画・1桁描画(int x, int y, char s数値)
2326 {
2327 int dx, dy;
2328 if (s数値 == '/')
2329 {
2330 dx = 96;
2331 dy = 0;
2332 }
2333 else
2334 {
2335 int n = (int)s数値 - (int)'0';
2336 dx = (n % 6) * 16;
2337 dy = (n / 6) * 16;
2338 }
2339 if (this.txアイテム数数字 != null)
2340 {
2341 this.txアイテム数数字.t2D描画(CDTXMania.app.Device, x, y, new Rectangle(dx, dy, 16, 16));
2342 }
2343 }
2344
2345
2346 //DOBON.NETから拝借。
2347 //http://dobon.net/vb/dotnet/graphics/drawnegativeimage.html
2348 /// <summary>
2349 /// 指定された画像からネガティブイメージを作成する
2350 /// </summary>
2351 /// <param name="img">基の画像</param>
2352 /// <returns>作成されたネガティブイメージ</returns>
2353 public Image CreateNegativeImage(Image img)
2354 {
2355 //ネガティブイメージの描画先となるImageオブジェクトを作成
2356 Bitmap negaImg = new Bitmap(img.Width, img.Height);
2357 //negaImgのGraphicsオブジェクトを取得
2358 Graphics g = Graphics.FromImage(negaImg);
2359
2360 //ColorMatrixオブジェクトの作成
2361 System.Drawing.Imaging.ColorMatrix cm =
2362 new System.Drawing.Imaging.ColorMatrix();
2363 //ColorMatrixの行列の値を変更して、色が反転されるようにする
2364 cm.Matrix00 = -1;
2365 cm.Matrix11 = -1;
2366 cm.Matrix22 = -1;
2367 cm.Matrix33 = 1;
2368 cm.Matrix40 = cm.Matrix41 = cm.Matrix42 = cm.Matrix44 = 1;
2369
2370 //ImageAttributesオブジェクトの作成
2371 System.Drawing.Imaging.ImageAttributes ia =
2372 new System.Drawing.Imaging.ImageAttributes();
2373 //ColorMatrixを設定する
2374 ia.SetColorMatrix(cm);
2375
2376 //ImageAttributesを使用して色が反転した画像を描画
2377 g.DrawImage(img,
2378 new Rectangle(0, 0, img.Width, img.Height),
2379 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, ia);
2380
2381 //リソースを解放する
2382 g.Dispose();
2383
2384 return negaImg;
2385 }
2386 //-----------------
2387 #endregion
2388 }
2389 }

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