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

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