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

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