2 using System.Collections.Generic;
\r
4 using System.Globalization;
\r
5 using System.Runtime.InteropServices;
\r
6 using System.Drawing;
\r
7 using System.Drawing.Imaging;
\r
8 using System.Diagnostics;
\r
9 using System.Drawing.Text;
\r
16 internal class CActSelect曲リスト : CActivity
\r
20 public bool bIsEnumeratingSongs
\r
29 if (this.n目標のスクロールカウンタ == 0)
\r
31 return (this.n現在のスクロールカウンタ != 0);
\r
36 public int n現在のアンカ難易度レベル
\r
41 public int n現在選択中の曲の現在の難易度レベル
\r
45 return this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(this.r現在選択中の曲);
\r
48 public Cスコア r現在選択中のスコア
\r
52 if (this.r現在選択中の曲 != null)
\r
54 return this.r現在選択中の曲.arスコア[this.n現在選択中の曲の現在の難易度レベル];
\r
59 public C曲リストノード r現在選択中の曲
\r
65 public int nスクロールバー相対y座標
\r
71 // t選択曲が変更された()内で使う、直前の選曲の保持
\r
72 // (前と同じ曲なら選択曲変更に掛かる再計算を省略して高速化するため)
\r
73 private C曲リストノード song_last = null;
\r
78 public CActSelect曲リスト()
\r
80 this.r現在選択中の曲 = null;
\r
81 this.n現在のアンカ難易度レベル = 0;
\r
82 base.b活性化してない = true;
\r
83 this.bIsEnumeratingSongs = false;
\r
89 public int n現在のアンカ難易度レベルに最も近い難易度レベルを返す(C曲リストノード song)
\r
94 return this.n現在のアンカ難易度レベル; // 曲がまったくないよ
\r
96 if (song.arスコア[this.n現在のアンカ難易度レベル] != null)
\r
97 return this.n現在のアンカ難易度レベル; // 難易度ぴったりの曲があったよ
\r
99 if ((song.eノード種別 == C曲リストノード.Eノード種別.BOX) || (song.eノード種別 == C曲リストノード.Eノード種別.BACKBOX))
\r
100 return 0; // BOX と BACKBOX は関係無いよ
\r
103 // 現在のアンカレベルから、難易度上向きに検索開始。
\r
105 int n最も近いレベル = this.n現在のアンカ難易度レベル;
\r
107 for (int i = 0; i < 5; i++)
\r
109 if (song.arスコア[n最も近いレベル] != null)
\r
112 n最も近いレベル = (n最も近いレベル + 1) % 5; // 曲がなかったので次の難易度レベルへGo。(5以上になったら0に戻る。)
\r
116 // 見つかった曲がアンカより下のレベルだった場合……
\r
117 // アンカから下向きに検索すれば、もっとアンカに近い曲があるんじゃね?
\r
119 if (n最も近いレベル < this.n現在のアンカ難易度レベル)
\r
121 // 現在のアンカレベルから、難易度下向きに検索開始。
\r
123 n最も近いレベル = this.n現在のアンカ難易度レベル;
\r
125 for (int i = 0; i < 5; i++)
\r
127 if (song.arスコア[n最も近いレベル] != null)
\r
130 n最も近いレベル = ((n最も近いレベル - 1) + 5) % 5; // 曲がなかったので次の難易度レベルへGo。(0未満になったら4に戻る。)
\r
136 public C曲リストノード r指定された曲が存在するリストの先頭の曲(C曲リストノード song)
\r
138 List<C曲リストノード> songList = GetSongListWithinMe(song);
\r
139 return (songList == null) ? null : songList[0];
\r
141 public C曲リストノード r指定された曲が存在するリストの末尾の曲(C曲リストノード song)
\r
143 List<C曲リストノード> songList = GetSongListWithinMe(song);
\r
144 return (songList == null) ? null : songList[songList.Count - 1];
\r
147 private List<C曲リストノード> GetSongListWithinMe(C曲リストノード song)
\r
149 if (song.r親ノード == null) // root階層のノートだったら
\r
151 return CDTXMania.Instance.Songs管理.list曲ルート; // rootのリストを返す
\r
155 if ((song.r親ノード.list子リスト != null) && (song.r親ノード.list子リスト.Count > 0))
\r
157 return song.r親ノード.list子リスト;
\r
167 public delegate void DGSortFunc(List<C曲リストノード> songList, EPart eInst, int order, params object[] p);
\r
169 /// 主にCSong管理.cs内にあるソート機能を、delegateで呼び出す。
\r
171 /// <param name="sf">ソート用に呼び出すメソッド</param>
\r
172 /// <param name="eInst">ソート基準とする楽器</param>
\r
173 /// <param name="order">-1=降順, 1=昇順</param>
\r
174 public void t曲リストのソート(DGSortFunc sf, EPart eInst, int order, params object[] p)
\r
176 List<C曲リストノード> songList = GetSongListWithinMe(this.r現在選択中の曲);
\r
177 if (songList == null)
\r
183 // CDTXMania.Instance.Songs管理.t曲リストのソート3_演奏回数の多い順( songList, eInst, order );
\r
184 sf(songList, eInst, order, p);
\r
185 // this.r現在選択中の曲 = CDTXMania
\r
186 this.t現在選択中の曲を元に曲バーを再構成する();
\r
190 public bool tBOXに入る()
\r
192 //Trace.TraceInformation( "box enter" );
\r
193 //Trace.TraceInformation( "Skin現在Current : " + CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName( false ) );
\r
194 //Trace.TraceInformation( "Skin現在System : " + CSkin.strSystemSkinSubfolderFullName );
\r
195 //Trace.TraceInformation( "Skin現在BoxDef : " + CSkin.strBoxDefSkinSubfolderFullName );
\r
196 //Trace.TraceInformation( "Skin現在: " + CSkin.GetSkinName( CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName( false ) ) );
\r
197 //Trace.TraceInformation( "Skin現pt: " + CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName( false ) );
\r
198 //Trace.TraceInformation( "Skin指定: " + CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath ) );
\r
199 //Trace.TraceInformation( "Skinpath: " + this.r現在選択中の曲.strSkinPath );
\r
201 if (CSkin.GetSkinName(CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName(false)) != CSkin.GetSkinName(this.r現在選択中の曲.strSkinPath)
\r
202 && CSkin.bUseBoxDefSkin)
\r
205 // BOXに入るときは、スキン変更発生時のみboxdefスキン設定の更新を行う
\r
206 CDTXMania.Instance.Skin.SetCurrentSkinSubfolderFullName(this.r現在選択中の曲.strSkinPath, false);
\r
209 //Trace.TraceInformation( "Skin変更: " + CSkin.GetSkinName( CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName( false ) ) );
\r
210 //Trace.TraceInformation( "Skin変更Current : " + CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName( false ) );
\r
211 //Trace.TraceInformation( "Skin変更System : " + CSkin.strSystemSkinSubfolderFullName );
\r
212 //Trace.TraceInformation( "Skin変更BoxDef : " + CSkin.strBoxDefSkinSubfolderFullName );
\r
214 if ((this.r現在選択中の曲.list子リスト != null) && (this.r現在選択中の曲.list子リスト.Count > 0))
\r
216 this.r現在選択中の曲 = this.r現在選択中の曲.list子リスト[0];
\r
217 this.t現在選択中の曲を元に曲バーを再構成する();
\r
218 this.t選択曲が変更された(false); // #27648 項目数変更を反映させる
\r
222 public bool tBOXを出る()
\r
224 //Trace.TraceInformation( "box exit" );
\r
225 //Trace.TraceInformation( "Skin現在Current : " + CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName(false) );
\r
226 //Trace.TraceInformation( "Skin現在System : " + CSkin.strSystemSkinSubfolderFullName );
\r
227 //Trace.TraceInformation( "Skin現在BoxDef : " + CSkin.strBoxDefSkinSubfolderFullName );
\r
228 //Trace.TraceInformation( "Skin現在: " + CSkin.GetSkinName( CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName(false) ) );
\r
229 //Trace.TraceInformation( "Skin現pt: " + CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName(false) );
\r
230 //Trace.TraceInformation( "Skin指定: " + CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath ) );
\r
231 //Trace.TraceInformation( "Skinpath: " + this.r現在選択中の曲.strSkinPath );
\r
233 if (CSkin.GetSkinName(CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName(false)) != CSkin.GetSkinName(this.r現在選択中の曲.strSkinPath)
\r
234 && CSkin.bUseBoxDefSkin)
\r
238 // スキン変更が発生しなくても、boxdef圏外に出る場合は、boxdefスキン設定の更新が必要
\r
239 // (ユーザーがboxdefスキンをConfig指定している場合への対応のために必要)
\r
240 // tBoxに入る()とは処理が微妙に異なるので注意
\r
241 CDTXMania.Instance.Skin.SetCurrentSkinSubfolderFullName(
\r
242 (this.r現在選択中の曲.strSkinPath == "") ? "" : CDTXMania.Instance.Skin.GetSkinSubfolderFullNameFromSkinName(CSkin.GetSkinName(this.r現在選択中の曲.strSkinPath)), false);
\r
243 //Trace.TraceInformation( "SKIN変更: " + CSkin.GetSkinName( CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName(false) ) );
\r
244 //Trace.TraceInformation( "SKIN変更Current : "+ CDTXMania.Instance.Skin.GetCurrentSkinSubfolderFullName(false) );
\r
245 //Trace.TraceInformation( "SKIN変更System : "+ CSkin.strSystemSkinSubfolderFullName );
\r
246 //Trace.TraceInformation( "SKIN変更BoxDef : "+ CSkin.strBoxDefSkinSubfolderFullName );
\r
247 if (this.r現在選択中の曲.r親ノード != null)
\r
249 this.r現在選択中の曲 = this.r現在選択中の曲.r親ノード;
\r
250 this.t現在選択中の曲を元に曲バーを再構成する();
\r
251 this.t選択曲が変更された(false); // #27648 項目数変更を反映させる
\r
255 public void t現在選択中の曲を元に曲バーを再構成する()
\r
258 for (int i = 0; i < 13; i++)
\r
260 this.t曲名バーの生成(i, this.stバー情報[i].strタイトル文字列, this.stバー情報[i].col文字色);
\r
263 public void t次に移動()
\r
265 if (this.r現在選択中の曲 != null)
\r
267 this.n目標のスクロールカウンタ += 100;
\r
270 public void t前に移動()
\r
272 if (this.r現在選択中の曲 != null)
\r
274 this.n目標のスクロールカウンタ -= 100;
\r
277 public void t難易度レベルをひとつ進める()
\r
279 if ((this.r現在選択中の曲 == null) || (this.r現在選択中の曲.nスコア数 <= 1))
\r
280 return; // 曲にスコアが0~1個しかないなら進める意味なし。
\r
283 // 難易度レベルを+1し、現在選曲中のスコアを変更する。
\r
285 this.n現在のアンカ難易度レベル = this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(this.r現在選択中の曲);
\r
287 for (int i = 0; i < 5; i++)
\r
289 this.n現在のアンカ難易度レベル = (this.n現在のアンカ難易度レベル + 1) % 5; // 5以上になったら0に戻る。
\r
290 if (this.r現在選択中の曲.arスコア[this.n現在のアンカ難易度レベル] != null) // 曲が存在してるならここで終了。存在してないなら次のレベルへGo。
\r
295 // 曲毎に表示しているスキル値を、新しい難易度レベルに合わせて取得し直す。(表示されている13曲全部。)
\r
297 C曲リストノード song = this.r現在選択中の曲;
\r
298 for (int i = 0; i < 5; i++)
\r
299 song = this.r前の曲(song);
\r
301 for (int i = this.n現在の選択行 - 5; i < ((this.n現在の選択行 - 5) + 13); i++)
\r
303 int index = (i + 13) % 13;
\r
304 for (EPart m = EPart.Drums; m <= EPart.Bass; m++)
\r
306 this.stバー情報[index].nスキル値[m] = (int)song.arスコア[this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song)].譜面情報.最大スキル[m];
\r
307 this.stバー情報[index].n使用レーン数[m] = (int)song.arスコア[this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song)].譜面情報.使用レーン数[m];
\r
309 song = this.r次の曲(song);
\r
313 // 選曲ステージに変更通知を発出し、関係Activityの対応を行ってもらう。
\r
315 CDTXMania.Instance.stage選曲.t選択曲変更通知();
\r
322 /// <param name="cs"></param>
\r
323 public void Refresh(CSongs管理 cs, bool bRemakeSongTitleBar) // #26070 2012.2.28 yyagi
\r
327 if (cs != null && cs.list曲ルート.Count > 0) // 新しい曲リストを検索して、1曲以上あった
\r
329 CDTXMania.Instance.Songs管理 = cs;
\r
331 if (this.r現在選択中の曲 != null) // r現在選択中の曲==null とは、「最初songlist.dbが無かった or 検索したが1曲もない」
\r
333 this.r現在選択中の曲 = searchCurrentBreadcrumbsPosition(CDTXMania.Instance.Songs管理.list曲ルート, this.r現在選択中の曲.strBreadcrumbs);
\r
334 if (bRemakeSongTitleBar) // 選曲画面以外に居るときには再構成しない (非活性化しているときに実行すると例外となる)
\r
336 this.t現在選択中の曲を元に曲バーを再構成する();
\r
338 #if false // list子リストの中まではmatchしてくれないので、検索ロジックは手書きで実装 (searchCurrentBreadcrumbs())
\r
339 string bc = this.r現在選択中の曲.strBreadcrumbs;
\r
340 Predicate<C曲リストノード> match = delegate( C曲リストノード c )
\r
342 return ( c.strBreadcrumbs.Equals( bc ) );
\r
344 int nMatched = CDTXMania.Instance.Songs管理.list曲ルート.FindIndex( match );
\r
346 this.r現在選択中の曲 = ( nMatched == -1 ) ? null : CDTXMania.Instance.Songs管理.list曲ルート[ nMatched ];
\r
347 this.t現在選択中の曲を元に曲バーを再構成する();
\r
353 this.r現在選択中の曲 = null;
\r
359 /// 現在選曲している位置を検索する
\r
360 /// (曲一覧クラスを新しいものに入れ替える際に用いる)
\r
362 /// <param name="ln">検索対象のList</param>
\r
363 /// <param name="bc">検索するパンくずリスト(文字列)</param>
\r
364 /// <returns></returns>
\r
365 private C曲リストノード searchCurrentBreadcrumbsPosition(List<C曲リストノード> ln, string bc)
\r
367 foreach (C曲リストノード n in ln)
\r
369 if (n.strBreadcrumbs == bc)
\r
373 else if (n.list子リスト != null && n.list子リスト.Count > 0) // 子リストが存在するなら、再帰で探す
\r
375 C曲リストノード r = searchCurrentBreadcrumbsPosition(n.list子リスト, bc);
\r
376 if (r != null) return r;
\r
383 /// BOXのアイテム数と、今何番目を選択しているかをセットする
\r
385 public void t選択曲が変更された(bool bForce) // #27648
\r
387 C曲リストノード song = CDTXMania.Instance.stage選曲.r現在選択中の曲;
\r
390 if (song == song_last && bForce == false)
\r
394 List<C曲リストノード> list = (song.r親ノード != null) ? song.r親ノード.list子リスト : CDTXMania.Instance.Songs管理.list曲ルート;
\r
395 int index = list.IndexOf(song) + 1;
\r
398 nCurrentPosition = nNumOfItems = 0;
\r
402 nCurrentPosition = index;
\r
403 nNumOfItems = list.Count;
\r
409 public override void On活性化()
\r
414 this.e楽器パート = EPart.Drums;
\r
415 this.b登場アニメ全部完了 = false;
\r
416 this.n目標のスクロールカウンタ = 0;
\r
417 this.n現在のスクロールカウンタ = 0;
\r
418 this.nスクロールタイマ = -1;
\r
421 // 曲リスト文字は2倍(面積4倍)でテクスチャに描画してから縮小表示するので、フォントサイズは2倍とする。
\r
423 FontStyle regular = FontStyle.Regular;
\r
424 if (CDTXMania.Instance.ConfigIni.bItalicFontSongSelect) regular |= FontStyle.Italic;
\r
425 if (CDTXMania.Instance.ConfigIni.bBoldFontSongSelect) regular |= FontStyle.Bold;
\r
426 this.ft曲リスト用フォント = new Font(
\r
427 CDTXMania.Instance.ConfigIni.strFontSongSelect,
\r
428 (float)(CDTXMania.Instance.ConfigIni.nFontSizeDotSongSelect * 2 * Scale.Y), // 後でScale.Yを掛けないように直すこと(Config.ini初期値変更)
\r
434 // 現在選択中の曲がない(=はじめての活性化)なら、現在選択中の曲をルートの先頭ノードに設定する。
\r
436 if ((this.r現在選択中の曲 == null) && (CDTXMania.Instance.Songs管理.list曲ルート.Count > 0))
\r
437 this.r現在選択中の曲 = CDTXMania.Instance.Songs管理.list曲ルート[0];
\r
446 this.t選択曲が変更された(true); // #27648 2012.3.31 yyagi 選曲画面に入った直後の 現在位置/全アイテム数 の表示を正しく行うため
\r
448 public override void On非活性化()
\r
453 TextureFactory.t安全にDisposeする(ref this.ft曲リスト用フォント);
\r
455 for (int i = 0; i < 13; i++)
\r
456 this.ct登場アニメ用[i] = null;
\r
460 public override void OnManagedリソースの作成()
\r
465 this.tx曲名バー.Score = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect bar score.png"), false);
\r
466 this.tx曲名バー.Box = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect bar box.png"), false);
\r
467 this.tx曲名バー.Other = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect bar other.png"), false);
\r
469 this.tx選曲バー.Score = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect bar score selected.png"), false);
\r
470 this.tx選曲バー.Box = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect bar box selected.png"), false);
\r
471 this.tx選曲バー.Other = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect bar other selected.png"), false);
\r
473 this.txスキル数字 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect skill number on list.png"), false);
\r
474 this.tx使用レーン数数字 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect skill number on gauge etc.png"), false);
\r
475 for (int i = 0; i < 13; i++)
\r
476 this.t曲名バーの生成(i, this.stバー情報[i].strタイトル文字列, this.stバー情報[i].col文字色);
\r
478 int c = (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ? 0 : 1;
\r
479 #region [ Songs not found画像 ]
\r
482 using (Bitmap image = new Bitmap(SampleFramework.GameWindowSize.Width, (int)(128 * Scale.Y)))
\r
483 using (Graphics graphics = Graphics.FromImage(image))
\r
485 string[] s1 = { "曲データが見つかりません。", "Songs not found." };
\r
486 string[] s2 = { "曲データをDTXManiaGR.exe以下の", "You need to install songs." };
\r
487 string[] s3 = { "フォルダにインストールして下さい。", "" };
\r
488 graphics.DrawString(s1[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float)(2f * Scale.X), (float)(2f * Scale.Y));
\r
489 graphics.DrawString(s1[c], this.ft曲リスト用フォント, Brushes.White, (float)0f, (float)0f);
\r
490 graphics.DrawString(s2[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float)(2f * Scale.X), (float)(44f * Scale.Y));
\r
491 graphics.DrawString(s2[c], this.ft曲リスト用フォント, Brushes.White, (float)0f, (float)(42f * Scale.Y));
\r
492 graphics.DrawString(s3[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float)(2f * Scale.X), (float)(86f * Scale.Y));
\r
493 graphics.DrawString(s3[c], this.ft曲リスト用フォント, Brushes.White, (float)0f, (float)(84f * Scale.Y));
\r
495 this.txSongNotFound = new CTexture(CDTXMania.Instance.Device, image, CDTXMania.Instance.TextureFormat);
\r
497 this.txSongNotFound.vc拡大縮小倍率 = new Vector3(0.5f, 0.5f, 1f); // 半分のサイズで表示する。
\r
500 catch (CTextureCreateFailedException)
\r
502 Trace.TraceError("SoungNotFoundテクスチャの作成に失敗しました。");
\r
503 this.txSongNotFound = null;
\r
506 #region [ "曲データを検索しています"画像 ]
\r
509 using (Bitmap image = new Bitmap(SampleFramework.GameWindowSize.Width, (int)(96 * Scale.Y)))
\r
510 using (Graphics graphics = Graphics.FromImage(image))
\r
512 string[] s1 = { "曲データを検索しています。", "Now enumerating songs." };
\r
513 string[] s2 = { "そのまましばらくお待ち下さい。", "Please wait..." };
\r
514 graphics.DrawString(s1[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float)(2f * Scale.X), (float)(2f * Scale.Y));
\r
515 graphics.DrawString(s1[c], this.ft曲リスト用フォント, Brushes.White, (float)0f, (float)0f);
\r
516 graphics.DrawString(s2[c], this.ft曲リスト用フォント, Brushes.DarkGray, (float)(2f * Scale.X), (float)(44f * Scale.Y));
\r
517 graphics.DrawString(s2[c], this.ft曲リスト用フォント, Brushes.White, (float)0f, (float)(42f * Scale.Y));
\r
519 this.txEnumeratingSongs = new CTexture(CDTXMania.Instance.Device, image, CDTXMania.Instance.TextureFormat);
\r
521 this.txEnumeratingSongs.vc拡大縮小倍率 = new Vector3(0.5f, 0.5f, 1f); // 半分のサイズで表示する。
\r
524 catch (CTextureCreateFailedException)
\r
526 Trace.TraceError("txEnumeratingSongsテクスチャの作成に失敗しました。");
\r
527 this.txEnumeratingSongs = null;
\r
531 this.txアイテム数数字 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect skill number on gauge etc.png"), false);
\r
533 base.OnManagedリソースの作成();
\r
535 public override void OnManagedリソースの解放()
\r
540 TextureFactory.t安全にDisposeする(ref this.txアイテム数数字);
\r
542 for (int i = 0; i < 13; i++)
\r
543 TextureFactory.t安全にDisposeする(ref this.stバー情報[i].txタイトル名);
\r
545 TextureFactory.t安全にDisposeする(ref this.txスキル数字);
\r
546 TextureFactory.t安全にDisposeする(ref this.tx使用レーン数数字);
\r
547 TextureFactory.t安全にDisposeする(ref this.txEnumeratingSongs);
\r
548 TextureFactory.t安全にDisposeする(ref this.txSongNotFound);
\r
549 TextureFactory.t安全にDisposeする(ref this.tx曲名バー.Score);
\r
550 TextureFactory.t安全にDisposeする(ref this.tx曲名バー.Box);
\r
551 TextureFactory.t安全にDisposeする(ref this.tx曲名バー.Other);
\r
552 TextureFactory.t安全にDisposeする(ref this.tx選曲バー.Score);
\r
553 TextureFactory.t安全にDisposeする(ref this.tx選曲バー.Box);
\r
554 TextureFactory.t安全にDisposeする(ref this.tx選曲バー.Other);
\r
556 base.OnManagedリソースの解放();
\r
558 public override int On進行描画()
\r
563 #region [ 初めての進行描画 ]
\r
564 //-----------------
\r
565 if (this.b初めての進行描画)
\r
567 for (int i = 0; i < 13; i++)
\r
568 this.ct登場アニメ用[i] = new CCounter(-i * 10, 100, 3, CDTXMania.Instance.Timer);
\r
570 this.nスクロールタイマ = CSound管理.rc演奏用タイマ.n現在時刻;
\r
571 CDTXMania.Instance.stage選曲.t選択曲変更通知();
\r
573 base.b初めての進行描画 = false;
\r
575 //-----------------
\r
579 // まだ選択中の曲が決まってなければ、曲ツリールートの最初の曲にセットする。
\r
581 if ((this.r現在選択中の曲 == null) && (CDTXMania.Instance.Songs管理.list曲ルート.Count > 0))
\r
582 this.r現在選択中の曲 = CDTXMania.Instance.Songs管理.list曲ルート[0];
\r
585 // 本ステージは、(1)登場アニメフェーズ → (2)通常フェーズ と二段階にわけて進む。
\r
586 // 2つしかフェーズがないので CStage.eフェーズID を使ってないところがまた本末転倒。
\r
591 if (!this.b登場アニメ全部完了)
\r
593 #region [ (1) 登場アニメフェーズの進行。]
\r
594 //-----------------
\r
595 for (int i = 0; i < 13; i++) // パネルは全13枚。
\r
597 this.ct登場アニメ用[i].t進行();
\r
599 if (this.ct登場アニメ用[i].b終了値に達した)
\r
600 this.ct登場アニメ用[i].t停止();
\r
603 // 全部の進行が終わったら、this.b登場アニメ全部完了 を true にする。
\r
605 this.b登場アニメ全部完了 = true;
\r
606 for (int i = 0; i < 13; i++) // パネルは全13枚。
\r
608 if (this.ct登場アニメ用[i].b進行中)
\r
610 this.b登場アニメ全部完了 = false; // まだ進行中のアニメがあるなら false のまま。
\r
614 //-----------------
\r
619 #region [ (2) 通常フェーズの進行。]
\r
620 //-----------------
\r
621 long n現在時刻 = CSound管理.rc演奏用タイマ.n現在時刻;
\r
623 if (n現在時刻 < this.nスクロールタイマ) // 念のため
\r
624 this.nスクロールタイマ = n現在時刻;
\r
626 const int nアニメ間隔 = 2;
\r
627 while ((n現在時刻 - this.nスクロールタイマ) >= nアニメ間隔)
\r
630 int n残距離 = Math.Abs((int)(this.n目標のスクロールカウンタ - this.n現在のスクロールカウンタ));
\r
632 #region [ 残距離が遠いほどスクロールを速くする(=n加速度を多くする)。]
\r
633 //-----------------
\r
638 else if (n残距離 <= 300)
\r
642 else if (n残距離 <= 500)
\r
650 //-----------------
\r
653 #region [ 加速度を加算し、現在のスクロールカウンタを目標のスクロールカウンタまで近づける。 ]
\r
654 //-----------------
\r
655 if (this.n現在のスクロールカウンタ < this.n目標のスクロールカウンタ) // (A) 正の方向に未達の場合:
\r
657 this.n現在のスクロールカウンタ += n加速度; // カウンタを正方向に移動する。
\r
659 if (this.n現在のスクロールカウンタ > this.n目標のスクロールカウンタ)
\r
660 this.n現在のスクロールカウンタ = this.n目標のスクロールカウンタ; // 到着!スクロール停止!
\r
663 else if (this.n現在のスクロールカウンタ > this.n目標のスクロールカウンタ) // (B) 負の方向に未達の場合:
\r
665 this.n現在のスクロールカウンタ -= n加速度; // カウンタを負方向に移動する。
\r
667 if (this.n現在のスクロールカウンタ < this.n目標のスクロールカウンタ) // 到着!スクロール停止!
\r
668 this.n現在のスクロールカウンタ = this.n目標のスクロールカウンタ;
\r
670 //-----------------
\r
673 if (this.n現在のスクロールカウンタ >= 100) // 1行=100カウント。
\r
675 #region [ パネルを1行上にシフトする。]
\r
676 //-----------------
\r
678 // 選択曲と選択行を1つ下の行に移動。
\r
680 this.r現在選択中の曲 = this.r次の曲(this.r現在選択中の曲);
\r
681 this.n現在の選択行 = (this.n現在の選択行 + 1) % 13;
\r
684 // 選択曲から7つ下のパネル(=新しく最下部に表示されるパネル。消えてしまう一番上のパネルを再利用する)に、新しい曲の情報を記載する。
\r
686 C曲リストノード song = this.r現在選択中の曲;
\r
687 for (int i = 0; i < 7; i++)
\r
688 song = this.r次の曲(song);
\r
690 int index = (this.n現在の選択行 + 7) % 13; // 新しく最下部に表示されるパネルのインデックス(0~12)。
\r
691 this.stバー情報[index].strタイトル文字列 = song.strタイトル;
\r
692 this.stバー情報[index].col文字色 = song.col文字色;
\r
693 this.t曲名バーの生成(index, this.stバー情報[index].strタイトル文字列, this.stバー情報[index].col文字色);
\r
696 // stバー情報[] の内容を1行ずつずらす。
\r
698 C曲リストノード song2 = this.r現在選択中の曲;
\r
699 for (int i = 0; i < 5; i++)
\r
700 song2 = this.r前の曲(song2);
\r
702 for (int i = 0; i < 13; i++)
\r
704 int n = (((this.n現在の選択行 - 5) + i) + 13) % 13;
\r
705 this.stバー情報[n].eバー種別 = this.e曲のバー種別を返す(song2);
\r
706 song2 = this.r次の曲(song2);
\r
710 // 新しく最下部に表示されるパネル用のスキル値を取得。
\r
712 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
\r
714 this.stバー情報[index].nスキル値[i] = (int)song.arスコア[this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song)].譜面情報.最大スキル[i];
\r
715 this.stバー情報[index].n使用レーン数[i] = (int)song.arスコア[this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song)].譜面情報.使用レーン数[i];
\r
718 // 1行(100カウント)移動完了。
\r
720 this.n現在のスクロールカウンタ -= 100;
\r
721 this.n目標のスクロールカウンタ -= 100;
\r
723 this.t選択曲が変更された(false); // スクロールバー用に今何番目を選択しているかを更新
\r
725 if (this.n目標のスクロールカウンタ == 0)
\r
726 CDTXMania.Instance.stage選曲.t選択曲変更通知(); // スクロール完了=選択曲変更!
\r
728 //-----------------
\r
731 else if (this.n現在のスクロールカウンタ <= -100)
\r
733 #region [ パネルを1行下にシフトする。]
\r
734 //-----------------
\r
736 // 選択曲と選択行を1つ上の行に移動。
\r
738 this.r現在選択中の曲 = this.r前の曲(this.r現在選択中の曲);
\r
739 this.n現在の選択行 = ((this.n現在の選択行 - 1) + 13) % 13;
\r
742 // 選択曲から5つ上のパネル(=新しく最上部に表示されるパネル。消えてしまう一番下のパネルを再利用する)に、新しい曲の情報を記載する。
\r
744 C曲リストノード song = this.r現在選択中の曲;
\r
745 for (int i = 0; i < 5; i++)
\r
746 song = this.r前の曲(song);
\r
748 int index = ((this.n現在の選択行 - 5) + 13) % 13; // 新しく最上部に表示されるパネルのインデックス(0~12)。
\r
749 this.stバー情報[index].strタイトル文字列 = song.strタイトル;
\r
750 this.stバー情報[index].col文字色 = song.col文字色;
\r
751 this.t曲名バーの生成(index, this.stバー情報[index].strタイトル文字列, this.stバー情報[index].col文字色);
\r
754 // stバー情報[] の内容を1行ずつずらす。
\r
756 C曲リストノード song2 = this.r現在選択中の曲;
\r
757 for (int i = 0; i < 5; i++)
\r
758 song2 = this.r前の曲(song2);
\r
760 for (int i = 0; i < 13; i++)
\r
762 int n = (((this.n現在の選択行 - 5) + i) + 13) % 13;
\r
763 this.stバー情報[n].eバー種別 = this.e曲のバー種別を返す(song2);
\r
764 song2 = this.r次の曲(song2);
\r
768 // 新しく最上部に表示されるパネル用のスキル値を取得。
\r
770 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
\r
772 this.stバー情報[index].nスキル値[i] = (int)song.arスコア[this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song)].譜面情報.最大スキル[i];
\r
773 this.stバー情報[index].n使用レーン数[i] = (int)song.arスコア[this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song)].譜面情報.使用レーン数[i];
\r
777 // 1行(100カウント)移動完了。
\r
779 this.n現在のスクロールカウンタ += 100;
\r
780 this.n目標のスクロールカウンタ += 100;
\r
782 this.t選択曲が変更された(false); // スクロールバー用に今何番目を選択しているかを更新
\r
784 if (this.n目標のスクロールカウンタ == 0)
\r
785 CDTXMania.Instance.stage選曲.t選択曲変更通知(); // スクロール完了=選択曲変更!
\r
786 //-----------------
\r
790 this.nスクロールタイマ += nアニメ間隔;
\r
792 //-----------------
\r
799 if (this.r現在選択中の曲 == null)
\r
801 #region [ 曲が1つもないなら「Songs not found.」を表示してここで帰れ。]
\r
802 //-----------------
\r
803 if (bIsEnumeratingSongs)
\r
805 if (this.txEnumeratingSongs != null)
\r
807 this.txEnumeratingSongs.t2D描画(
\r
808 CDTXMania.Instance.Device,
\r
816 if (this.txSongNotFound != null)
\r
817 this.txSongNotFound.t2D描画(
\r
818 CDTXMania.Instance.Device,
\r
823 //-----------------
\r
829 if (!this.b登場アニメ全部完了)
\r
831 #region [ (1) 登場アニメフェーズの描画。]
\r
832 //-----------------
\r
833 for (int i = 0; i < 13; i++) // パネルは全13枚。
\r
835 if (this.ct登場アニメ用[i].n現在の値 >= 0)
\r
837 double db割合0to1 = ((double)this.ct登場アニメ用[i].n現在の値) / 100.0;
\r
838 double db回転率 = Math.Sin(Math.PI * 3 / 5 * db割合0to1);
\r
839 int nパネル番号 = (((this.n現在の選択行 - 5) + i) + 13) % 13;
\r
845 #region [ バーテクスチャを描画。]
\r
846 //-----------------
\r
847 int width = (int)((425.0 - 0.8f) * Scale.X / Math.Sin(Math.PI * 3 / 5));
\r
848 //int width = (int) ( ( (double) ( ( SampleFramework.GameWindowSize.Width - this.ptバーの基本座標[ i ].X ) + 1 ) ) / Math.Sin( Math.PI * 3 / 5 ) );
\r
849 int x = SampleFramework.GameWindowSize.Width - ((int)(width * db回転率));
\r
851 this.tバーの描画(x, y, this.stバー情報[nパネル番号].eバー種別, true);
\r
852 //-----------------
\r
854 #region [ タイトル名テクスチャを描画。]
\r
855 //-----------------
\r
856 if (this.stバー情報[nパネル番号].txタイトル名 != null)
\r
857 this.stバー情報[nパネル番号].txタイトル名.t2D描画(
\r
858 CDTXMania.Instance.Device,
\r
859 (x + (int)(44 * Scale.X)) + (int)((16f + 0.5f) * Scale.X),
\r
861 //( y + (int) ( 0 * Scale.Y ) ) + (int) ( 16 * Scale.Y )
\r
862 // ( y + (int) ( 5 * Scale.Y ) ) + (int) ( (16f-2f) * Scale.Y)
\r
864 //-----------------
\r
866 #region [ スキル値を描画。]
\r
867 //-----------------
\r
868 if ((this.stバー情報[nパネル番号].eバー種別 == Eバー種別.Score) && (this.e楽器パート != EPart.Unknown))
\r
869 this.tスキル値の描画(x + (int)(28 * Scale.X), y + (int)(59), this.stバー情報[nパネル番号].nスキル値[this.e楽器パート]);
\r
870 //-----------------
\r
872 #region [ 使用レーン数を描画。]
\r
873 //-----------------
\r
874 if ((this.stバー情報[nパネル番号].eバー種別 == Eバー種別.Score) && (this.e楽器パート != EPart.Unknown))
\r
875 this.t使用レーン数の描画(x + (int)(0 * Scale.X), y + (int)53, this.stバー情報[nパネル番号].n使用レーン数[this.e楽器パート]);
\r
876 //-----------------
\r
883 #region [ バーテクスチャの描画。]
\r
884 //-----------------
\r
885 int width = (int)(((double)((SampleFramework.GameWindowSize.Width - this.ptバーの基本座標[i].X) + 1)) / Math.Sin(Math.PI * 3 / 5));
\r
886 int x = SampleFramework.GameWindowSize.Width - ((int)(width * db回転率));
\r
887 int y = this.ptバーの基本座標[i].Y;
\r
888 this.tバーの描画(x, y, this.stバー情報[nパネル番号].eバー種別, false);
\r
889 //-----------------
\r
891 #region [ タイトル名テクスチャを描画。]
\r
892 //-----------------
\r
893 if (this.stバー情報[nパネル番号].txタイトル名 != null)
\r
894 this.stバー情報[nパネル番号].txタイトル名.t2D描画(
\r
895 CDTXMania.Instance.Device,
\r
896 x + (int)(44 * Scale.X),
\r
899 //-----------------
\r
901 #region [ スキル値を描画。]
\r
902 //-----------------
\r
903 if ((this.stバー情報[nパネル番号].eバー種別 == Eバー種別.Score) && (this.e楽器パート != EPart.Unknown))
\r
904 this.tスキル値の描画(x + (int)(14 * Scale.X), y + (int)(14 * Scale.Y), this.stバー情報[nパネル番号].nスキル値[this.e楽器パート]);
\r
905 //-----------------
\r
907 #region [ 使用レーン数を描画。]
\r
908 //-----------------
\r
909 if ((this.stバー情報[nパネル番号].eバー種別 == Eバー種別.Score) && (this.e楽器パート != EPart.Unknown))
\r
910 this.t使用レーン数の描画(x + (int)(-14 * Scale.X), y + (int)(11 * Scale.Y), this.stバー情報[nパネル番号].n使用レーン数[this.e楽器パート]);
\r
911 //-----------------
\r
916 //-----------------
\r
921 #region [ (2) 通常フェーズの描画。]
\r
922 //-----------------
\r
923 for (int i = 0; i < 13; i++) // パネルは全13枚。
\r
925 if ((i == 0 && this.n現在のスクロールカウンタ > 0) || // 最上行は、上に移動中なら表示しない。
\r
926 (i == 12 && this.n現在のスクロールカウンタ < 0)) // 最下行は、下に移動中なら表示しない。
\r
929 int nパネル番号 = (((this.n現在の選択行 - 5) + i) + 13) % 13;
\r
931 int n次のパネル番号 = (this.n現在のスクロールカウンタ <= 0) ? ((i + 1) % 13) : (((i - 1) + 13) % 13);
\r
932 int x = this.ptバーの基本座標[n見た目の行番号].X + ((int)((this.ptバーの基本座標[n次のパネル番号].X - this.ptバーの基本座標[n見た目の行番号].X) * (((double)Math.Abs(this.n現在のスクロールカウンタ)) / 100.0)));
\r
933 int y = this.ptバーの基本座標[n見た目の行番号].Y + ((int)((this.ptバーの基本座標[n次のパネル番号].Y - this.ptバーの基本座標[n見た目の行番号].Y) * (((double)Math.Abs(this.n現在のスクロールカウンタ)) / 100.0)));
\r
935 if ((i == 5) && (this.n現在のスクロールカウンタ == 0))
\r
937 // (A) スクロールが停止しているときの選択曲バーの描画。
\r
939 #region [ バーテクスチャを描画。]
\r
940 //-----------------
\r
941 this.tバーの描画((int)(216 * Scale.X), (int)(415), this.stバー情報[nパネル番号].eバー種別, true);
\r
942 //-----------------
\r
944 #region [ タイトル名テクスチャを描画。]
\r
945 //-----------------
\r
946 if (this.stバー情報[nパネル番号].txタイトル名 != null)
\r
947 this.stバー情報[nパネル番号].txタイトル名.t2D描画(
\r
948 CDTXMania.Instance.Device,
\r
950 //(0xc9 - 1)* Scale.Y
\r
951 (x + ((44f + 0.5f) * Scale.X)),
\r
954 //-----------------
\r
956 #region [ スキル値を描画。]
\r
957 //-----------------
\r
958 if ((this.stバー情報[nパネル番号].eバー種別 == Eバー種別.Score) && (this.e楽器パート != EPart.Unknown))
\r
960 (int)(0xf4 * Scale.X),
\r
961 (int)(0xd3 * Scale.Y),
\r
962 this.stバー情報[nパネル番号].nスキル値[this.e楽器パート]
\r
964 //-----------------
\r
966 #region [ 使用レーン数を描画。]
\r
967 //-----------------
\r
968 if ((this.stバー情報[nパネル番号].eバー種別 == Eバー種別.Score) && (this.e楽器パート != EPart.Unknown))
\r
970 (int)(216 * Scale.X),
\r
971 (int)(208 * Scale.Y),
\r
972 this.stバー情報[nパネル番号].n使用レーン数[this.e楽器パート]
\r
974 //-----------------
\r
979 // (B) スクロール中の選択曲バー、またはその他のバーの描画。
\r
981 #region [ バーテクスチャを描画。]
\r
982 //-----------------
\r
983 this.tバーの描画(x, y, this.stバー情報[nパネル番号].eバー種別, false);
\r
984 //-----------------
\r
986 #region [ タイトル名テクスチャを描画。]
\r
987 //-----------------
\r
988 if (this.stバー情報[nパネル番号].txタイトル名 != null)
\r
989 this.stバー情報[nパネル番号].txタイトル名.t2D描画(
\r
990 CDTXMania.Instance.Device,
\r
991 x + (int)(44 * Scale.X),
\r
994 //-----------------
\r
996 #region [ スキル値を描画。]
\r
997 //-----------------
\r
998 if ((this.stバー情報[nパネル番号].eバー種別 == Eバー種別.Score) && (this.e楽器パート != EPart.Unknown))
\r
999 this.tスキル値の描画(x + (int)(14 * Scale.X), y + (int)(14 * Scale.Y), this.stバー情報[nパネル番号].nスキル値[this.e楽器パート]);
\r
1000 //-----------------
\r
1002 #region [ 使用レーン数を描画。]
\r
1003 //-----------------
\r
1004 if ((this.stバー情報[nパネル番号].eバー種別 == Eバー種別.Score) && (this.e楽器パート != EPart.Unknown))
\r
1005 this.t使用レーン数の描画(x + (int)(-14 * Scale.X), y + (int)(11 * Scale.Y), this.stバー情報[nパネル番号].n使用レーン数[this.e楽器パート]);
\r
1006 //-----------------
\r
1010 //-----------------
\r
1013 #region [ スクロール地点の計算(描画はCActSelectShowCurrentPositionにて行う) #27648 ]
\r
1016 if (nNumOfItems > 1)
\r
1018 d = ((int)(336 * Scale.Y) - 6 - 8) / (double)(nNumOfItems - 1);
\r
1019 py = (int)(d * (nCurrentPosition - 1));
\r
1026 int delta = (int)(d * this.n現在のスクロールカウンタ / 100);
\r
1027 if (py + delta <= (int)(336 * Scale.Y) - 6 - 8)
\r
1029 this.nスクロールバー相対y座標 = py + delta;
\r
1033 #region [ アイテム数の描画 #27648 ]
\r
1042 #region [ private ]
\r
1043 //-----------------
\r
1044 private enum Eバー種別 { Score, Box, Other }
\r
1046 private struct STバー
\r
1048 public CTexture Score;
\r
1049 public CTexture Box;
\r
1050 public CTexture Other;
\r
1051 public CTexture this[int index]
\r
1058 return this.Score;
\r
1064 return this.Other;
\r
1066 throw new IndexOutOfRangeException();
\r
1073 this.Score = value;
\r
1081 this.Other = value;
\r
1084 throw new IndexOutOfRangeException();
\r
1089 private struct STバー情報
\r
1091 public CActSelect曲リスト.Eバー種別 eバー種別;
\r
1092 public string strタイトル文字列;
\r
1093 public CTexture txタイトル名;
\r
1094 public STDGBSValue<int> nスキル値;
\r
1095 public STDGBSValue<int> n使用レーン数;
\r
1096 public Color col文字色;
\r
1099 private struct ST選曲バー
\r
1101 public CTexture Score;
\r
1102 public CTexture Box;
\r
1103 public CTexture Other;
\r
1104 public CTexture this[int index]
\r
1111 return this.Score;
\r
1117 return this.Other;
\r
1119 throw new IndexOutOfRangeException();
\r
1126 this.Score = value;
\r
1134 this.Other = value;
\r
1137 throw new IndexOutOfRangeException();
\r
1142 private bool b登場アニメ全部完了;
\r
1143 private Color color文字影 = Color.FromArgb(0x40, 10, 10, 10);
\r
1144 private CCounter[] ct登場アニメ用 = new CCounter[13];
\r
1145 private EPart e楽器パート;
\r
1146 private Font ft曲リスト用フォント;
\r
1147 private long nスクロールタイマ;
\r
1148 private int n現在のスクロールカウンタ;
\r
1149 private int n現在の選択行;
\r
1150 private int n目標のスクロールカウンタ;
\r
1151 private readonly Point[] ptバーの基本座標 = new Point[] {
\r
1152 new Point( (int)(0x162 * Scale.X), (int)(20 * Scale.Y) ),
\r
1153 new Point( (int)(0x139 * Scale.X), (int)(0x36 * Scale.Y) ),
\r
1154 new Point( (int)(0x121 * Scale.X), (int)(0x58 * Scale.Y) ),
\r
1155 new Point( (int)(0x111 * Scale.X), (int)(0x7a * Scale.Y) ),
\r
1156 new Point( (int)(0x108 * Scale.X), (int)(0x9c * Scale.Y) ),
\r
1157 new Point( (int)(0xe8 * Scale.X), (int)(0xc5 * Scale.Y) ),
\r
1158 new Point( (int)(0x112 * Scale.X), (int)(0x102 * Scale.Y) ),
\r
1159 new Point( (int)(0x121 * Scale.X), (int)(0x124 * Scale.Y) ),
\r
1160 new Point( (int)(0x138 * Scale.X), (int)(0x146 * Scale.Y) ),
\r
1161 new Point( (int)(0x157 * Scale.X), (int)(360 * Scale.Y) ),
\r
1162 new Point( (int)(0x18a * Scale.X), (int)(0x18a * Scale.Y) ),
\r
1163 new Point( (int)(0x1f2 * Scale.X), (int)(0x1ac * Scale.Y) ),
\r
1164 new Point( (int)(640 * Scale.X), (int)(0x1ce * Scale.Y) )
\r
1166 private STバー情報[] stバー情報 = new STバー情報[13];
\r
1167 private CTexture txSongNotFound, txEnumeratingSongs;
\r
1168 private CTexture txスキル数字;
\r
1169 private CTexture tx使用レーン数数字;
\r
1170 private CTexture txアイテム数数字;
\r
1171 private STバー tx曲名バー;
\r
1172 private ST選曲バー tx選曲バー;
\r
1174 private int nCurrentPosition = 0;
\r
1175 private int nNumOfItems = 0;
\r
1177 //private string strBoxDefSkinPath = "";
\r
1178 private Eバー種別 e曲のバー種別を返す(C曲リストノード song)
\r
1182 switch (song.eノード種別)
\r
1184 case C曲リストノード.Eノード種別.SCORE:
\r
1185 case C曲リストノード.Eノード種別.SCORE_MIDI:
\r
1186 return Eバー種別.Score;
\r
1188 case C曲リストノード.Eノード種別.BOX:
\r
1189 case C曲リストノード.Eノード種別.BACKBOX:
\r
1193 return Eバー種別.Other;
\r
1195 private C曲リストノード r次の曲(C曲リストノード song)
\r
1200 List<C曲リストノード> list = (song.r親ノード != null) ? song.r親ノード.list子リスト : CDTXMania.Instance.Songs管理.list曲ルート;
\r
1202 int index = list.IndexOf(song);
\r
1207 if (index == (list.Count - 1))
\r
1210 return list[index + 1];
\r
1212 private C曲リストノード r前の曲(C曲リストノード song)
\r
1217 List<C曲リストノード> list = (song.r親ノード != null) ? song.r親ノード.list子リスト : CDTXMania.Instance.Songs管理.list曲ルート;
\r
1219 int index = list.IndexOf(song);
\r
1225 return list[list.Count - 1];
\r
1227 return list[index - 1];
\r
1229 private void tスキル値の描画(int x, int y, int nスキル値)
\r
1231 if (nスキル値 <= 0 || nスキル値 > 100) // スキル値 0 = 未プレイ なので表示しない。
\r
1234 int color = (nスキル値 == 100) ? 3 : (nスキル値 / 25);
\r
1236 int n百の位 = nスキル値 / 100;
\r
1237 int n十の位 = (nスキル値 % 100) / 10;
\r
1238 int n一の位 = (nスキル値 % 100) % 10;
\r
1244 this.tスキル値の描画_1桁描画(x, y, n百の位, color);
\r
1249 if (n百の位 != 0 || n十の位 != 0)
\r
1250 this.tスキル値の描画_1桁描画(x + (int)(8 * Scale.X), y, n十の位, color);
\r
1255 this.tスキル値の描画_1桁描画(x + (int)(16 * Scale.X), y, n一の位, color);
\r
1257 private void tスキル値の描画_1桁描画(int x, int y, int n数値, int color)
\r
1259 int dx = (n数値 % 5) * (int)(9 * Scale.X);
\r
1260 int dy = (n数値 / 5) * (int)(12 * Scale.Y);
\r
1265 if (this.txスキル数字 != null)
\r
1266 this.txスキル数字.t2D描画(CDTXMania.Instance.Device, x, y, new Rectangle((int)(45 * Scale.X) + dx, (int)(24 * Scale.Y) + dy, (int)(9 * Scale.X), (int)(12 * Scale.Y)));
\r
1270 if (this.txスキル数字 != null)
\r
1271 this.txスキル数字.t2D描画(CDTXMania.Instance.Device, x, y, new Rectangle((int)(45 * Scale.X) + dx, dy, (int)(9 * Scale.X), (int)(12 * Scale.Y)));
\r
1275 if (this.txスキル数字 != null)
\r
1276 this.txスキル数字.t2D描画(CDTXMania.Instance.Device, x, y, new Rectangle(dx, (int)(24 * Scale.Y) + dy, (int)(9 * Scale.X), (int)(12 * Scale.Y)));
\r
1280 if (this.txスキル数字 != null)
\r
1281 this.txスキル数字.t2D描画(CDTXMania.Instance.Device, x, y, new Rectangle(dx, dy, (int)(9 * Scale.X), (int)(12 * Scale.Y)));
\r
1285 private void tバーの初期化()
\r
1287 C曲リストノード song = this.r現在選択中の曲;
\r
1292 for (int i = 0; i < 5; i++)
\r
1293 song = this.r前の曲(song);
\r
1295 for (int i = 0; i < 13; i++)
\r
1297 this.stバー情報[i].strタイトル文字列 = song.strタイトル;
\r
1298 this.stバー情報[i].col文字色 = song.col文字色;
\r
1299 this.stバー情報[i].eバー種別 = this.e曲のバー種別を返す(song);
\r
1301 for (EPart j = EPart.Drums; j <= EPart.Bass; j++)
\r
1303 this.stバー情報[i].nスキル値[j] = (int)song.arスコア[this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song)].譜面情報.最大スキル[j];
\r
1304 this.stバー情報[i].n使用レーン数[j] = (int)song.arスコア[this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(song)].譜面情報.使用レーン数[j];
\r
1307 song = this.r次の曲(song);
\r
1312 private void tバーの描画(int x, int y, Eバー種別 type, bool b選択曲)
\r
1314 if (x >= SampleFramework.GameWindowSize.Width || y >= SampleFramework.GameWindowSize.Height)
\r
1319 #region [ (A) 選択曲の場合 ]
\r
1320 //-----------------
\r
1321 if (this.tx選曲バー[(int)type] != null)
\r
1322 this.tx選曲バー[(int)type].t2D描画(
\r
1323 CDTXMania.Instance.Device,
\r
1329 256, //(int)(128 * Scale.X),
\r
1330 128 //(int)(64 * Scale.Y)
\r
1333 x += this.tx選曲バー[(int)type].sz画像サイズ.Width;
\r
1335 var rc = new Rectangle(
\r
1336 128, //(int)(64 * Scale.X),
\r
1338 128, //(int)(64 * Scale.X),
\r
1339 128 //(int)(64 * Scale.Y)
\r
1341 while (x < SampleFramework.GameWindowSize.Width)
\r
1343 if (this.tx選曲バー[(int)type] != null)
\r
1344 this.tx選曲バー[(int)type].t2D描画(
\r
1345 CDTXMania.Instance.Device,
\r
1349 ); // 胴体;64pxずつ横につなげていく。
\r
1350 x += 128; //(int)(64 * Scale.Y);
\r
1352 //-----------------
\r
1357 #region [ (B) その他の場合 ]
\r
1358 //-----------------
\r
1359 if (this.tx曲名バー[(int)type] != null)
\r
1360 this.tx曲名バー[(int)type].t2D描画(
\r
1361 CDTXMania.Instance.Device,
\r
1367 128, //(int) ( 64 * Scale.X ),
\r
1368 69 //(int) ( 32 * Scale.Y )
\r
1369 //(int)(64 * Scale.X),
\r
1370 //(int)(32 * Scale.Y)
\r
1373 x += 64; //(int) ( 64 * Scale.X );
\r
1375 var rc = new Rectangle(
\r
1381 //(int)(32 * Scale.Y),
\r
1382 //(int)(64 * Scale.X),
\r
1383 //(int)(32 * Scale.Y)
\r
1386 //0, //(int)(32 * Scale.Y),
\r
1387 //128, //(int)(64 * Scale.X),
\r
1388 //128 //(int)(32 * Scale.Y)
\r
1390 while (x < SampleFramework.GameWindowSize.Width)
\r
1392 if (this.tx曲名バー[(int)type] != null)
\r
1393 this.tx曲名バー[(int)type].t2D描画(
\r
1394 CDTXMania.Instance.Device,
\r
1398 ); // 胴体;64pxずつ横につなげていく。
\r
1399 x += 64; // (int) ( 64 * Scale.X );
\r
1401 //-----------------
\r
1405 private void t曲名バーの生成(int nバー番号, string str曲名, Color color)
\r
1407 if (nバー番号 < 0 || nバー番号 > 12)
\r
1414 #region [ 曲名表示に必要となるサイズを取得する。]
\r
1415 //-----------------
\r
1416 using (var bmpDummy = new Bitmap(1, 1))
\r
1418 var g = Graphics.FromImage(bmpDummy);
\r
1419 g.PageUnit = GraphicsUnit.Pixel;
\r
1420 sz曲名 = g.MeasureString(str曲名, this.ft曲リスト用フォント);
\r
1422 //-----------------
\r
1425 int n最大幅px = (int)(392 * Scale.Y);
\r
1426 int height = (int)(25 * Scale.Y);
\r
1427 int width = (int)((sz曲名.Width + 2) * 0.5f);
\r
1428 if (width > (CDTXMania.Instance.Device.Capabilities.MaxTextureWidth / 2))
\r
1429 width = CDTXMania.Instance.Device.Capabilities.MaxTextureWidth / 2; // 右端断ち切れ仕方ないよね
\r
1431 float f拡大率X = (width <= n最大幅px) ? 0.5f : (((float)n最大幅px / (float)width) * 0.5f); // 長い文字列は横方向に圧縮。
\r
1433 using (var bmp = new Bitmap(width * 2, height * 2, PixelFormat.Format32bppArgb)) // 2倍(面積4倍)のBitmapを確保。(0.5倍で表示する前提。)
\r
1434 using (var g = Graphics.FromImage(bmp))
\r
1436 g.TextRenderingHint = TextRenderingHint.AntiAlias;
\r
1437 float y = (((float)bmp.Height) / 2f) - ((CDTXMania.Instance.ConfigIni.nFontSizeDotSongSelect * Scale.Y * 2f) / 2f);
\r
1438 g.DrawString(str曲名, this.ft曲リスト用フォント, new SolidBrush(this.color文字影), (float)2f, (float)(y + 2f));
\r
1439 g.DrawString(str曲名, this.ft曲リスト用フォント, new SolidBrush(color), 0f, y);
\r
1441 TextureFactory.t安全にDisposeする(ref this.stバー情報[nバー番号].txタイトル名);
\r
1443 this.stバー情報[nバー番号].txタイトル名 = new CTexture(CDTXMania.Instance.Device, bmp, CDTXMania.Instance.TextureFormat);
\r
1444 this.stバー情報[nバー番号].txタイトル名.vc拡大縮小倍率 = new Vector3(f拡大率X, 0.5f, 1f);
\r
1447 catch (CTextureCreateFailedException)
\r
1449 Trace.TraceError("曲名テクスチャの作成に失敗しました。[{0}]", str曲名);
\r
1450 this.stバー情報[nバー番号].txタイトル名 = null;
\r
1453 private void tアイテム数の描画()
\r
1455 string s = nCurrentPosition.ToString() + "/" + nNumOfItems.ToString();
\r
1456 int x = (int)(SampleFramework.GameWindowSize.Width - (8 + 12) * Scale.X);
\r
1457 int y = (int)(362 * Scale.Y);
\r
1459 for (int p = s.Length - 1; p >= 0; p--)
\r
1461 tアイテム数の描画_1桁描画(x, y, s[p]);
\r
1462 x -= (int)(8 * Scale.X);
\r
1465 private void tアイテム数の描画_1桁描画(int x, int y, char s数値)
\r
1470 dx = (int)(48 * Scale.X);
\r
1475 int n = (int)s数値 - (int)'0';
\r
1476 dx = (n % 6) * (int)(8 * Scale.X);
\r
1477 dy = (n / 6) * (int)(12 * Scale.Y);
\r
1479 if (this.txアイテム数数字 != null)
\r
1481 this.txアイテム数数字.t2D描画(CDTXMania.Instance.Device, x, y, new Rectangle(dx, dy, (int)(8 * Scale.X), (int)(10 * Scale.Y)));
\r
1485 private void t使用レーン数の描画(int x, int y, int n使用レーン数)
\r
1487 // #36177 使用レーン数の表示 add ikanick 16.03.20
\r
1491 int n十の位 = n使用レーン数 / 10;
\r
1492 int n一の位 = n使用レーン数 % 10;
\r
1496 this.t使用レーン数の描画_1桁描画(x + (int)(8 * Scale.X), y, n十の位);
\r
1499 this.t使用レーン数の描画_1桁描画(x + (int)(13 * Scale.X), y, n一の位);
\r
1501 private void t使用レーン数の描画_1桁描画(int x, int y, int n数値)
\r
1504 dx = (n数値 % 6) * (int)(8 * Scale.X);
\r
1505 dy = (n数値 / 6) * (int)(11 * Scale.Y);
\r
1507 if (this.tx使用レーン数数字 != null)
\r
1509 this.tx使用レーン数数字.t2D描画(CDTXMania.Instance.Device, x, y, new Rectangle(dx, dy, (int)(8 * Scale.X), (int)(10 * Scale.Y)));
\r
1512 //-----------------
\r