X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=DTXMania%2F%E3%82%B3%E3%83%BC%E3%83%89%2F%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8%2F05.%E9%81%B8%E6%9B%B2%2FCActSelectPreimage%E3%83%91%E3%83%8D%E3%83%AB.cs;fp=DTXMania%2F%E3%82%B3%E3%83%BC%E3%83%89%2F%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8%2F05.%E9%81%B8%E6%9B%B2%2FCActSelectPreimage%E3%83%91%E3%83%8D%E3%83%AB.cs;h=05faff985ae575c898f8006a8d8f5b858a0e4296;hb=7bf3e650c7c6f5afac463ea6e288fcd3fad4387b;hp=0000000000000000000000000000000000000000;hpb=296446998eeba408353da55a275458b590e4ebf5;p=dtxmania%2Fdtxmania.git diff --git a/DTXMania/コード/ステージ/05.選曲/CActSelectPreimageパネル.cs b/DTXMania/コード/ステージ/05.選曲/CActSelectPreimageパネル.cs new file mode 100644 index 00000000..05faff98 --- /dev/null +++ b/DTXMania/コード/ステージ/05.選曲/CActSelectPreimageパネル.cs @@ -0,0 +1,584 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; +using System.IO; +using System.Diagnostics; +using SharpDX; +using SharpDX.Direct3D9; +using FDK; + +using Rectangle = System.Drawing.Rectangle; + +namespace DTXMania +{ + internal class CActSelectPreimageパネル : CActivity + { + // メソッド + + public CActSelectPreimageパネル() + { + base.b活性化してない = true; + } + public void t選択曲が変更された() + { + this.ct遅延表示 = new CCounter(-CDTXMania.Instance.ConfigIni.nPreImageWeightMs, 100, 1, CDTXMania.Instance.Timer); + this.b新しいプレビューファイルを読み込んだ = false; + } + + public bool bIsPlayingPremovie // #27060 + { + get + { + return (this.rAVI != null); + } + } + public CAct演奏AVI actAVI + { + get; + set; + } + + // CActivity 実装 + + public override void On活性化() + { + this.n本体X = (int)(8 * Scale.X); + this.n本体Y = (int)(0x39 * Scale.Y); + this.r表示するプレビュー画像 = this.txプレビュー画像がないときの画像; + this.str現在のファイル名 = ""; + this.b新しいプレビューファイルを読み込んだ = false; + base.On活性化(); + + this.actAVI.bIsPreviewMovie = true; + this.actAVI.On活性化(); + } + public override void On非活性化() + { + this.ct登場アニメ用 = null; + this.ct遅延表示 = null; + if (this.rAVI != null) + { + this.rAVI.Dispose(); + this.rAVI = null; + } + base.On非活性化(); + this.actAVI.On非活性化(); + } + public override void OnManagedリソースの作成() + { + if (!base.b活性化してない) + { + this.txパネル本体 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect preimage panel.png"), false); + this.txセンサ = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect sensor.png"), false); + this.txセンサ光 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect sensor light.png"), false); + this.txプレビュー画像 = null; + this.txプレビュー画像がないときの画像 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect preimage default.png"), false); + //this.sfAVI画像 = Surface.CreateOffscreenPlain( CDTXMania.Instance.app.Device, 0xcc, 0x10d, CDTXMania.Instance.app.GraphicsDeviceManager.CurrentSettings.BackBufferFormat, Pool.SystemMemory ); + //this.sfAVI画像 = Surface.CreateOffscreenPlain( CDTXMania.Instance.app.Device, 192, 269, CDTXMania.Instance.app.GraphicsDeviceManager.CurrentSettings.BackBufferFormat, Pool.Default ); + //this.nAVI再生開始時刻 = -1; + //this.n前回描画したフレーム番号 = -1; + //this.b動画フレームを作成した = false; + //this.pAVIBmp = IntPtr.Zero; + this.tプレビュー画像_動画の変更(); + base.OnManagedリソースの作成(); + + this.actAVI.OnManagedリソースの作成(); + } + } + public override void OnManagedリソースの解放() + { + if (!base.b活性化してない) + { + TextureFactory.tテクスチャの解放(ref this.txパネル本体); + TextureFactory.tテクスチャの解放(ref this.txセンサ); + TextureFactory.tテクスチャの解放(ref this.txセンサ光); + TextureFactory.tテクスチャの解放(ref this.txプレビュー画像); + TextureFactory.tテクスチャの解放(ref this.txプレビュー画像がないときの画像); + //if( this.sfAVI画像 != null ) + //{ + // this.sfAVI画像.Dispose(); + // this.sfAVI画像 = null; + //} + base.OnManagedリソースの解放(); + this.actAVI.OnManagedリソースの解放(); + } + } + public override int On進行描画() + { + if (!base.b活性化してない) + { + if (base.b初めての進行描画) + { + this.ct登場アニメ用 = new CCounter(0, 100, 5, CDTXMania.Instance.Timer); + this.ctセンサ光 = new CCounter(0, 100, 30, CDTXMania.Instance.Timer); + this.ctセンサ光.n現在の値 = 70; + base.b初めての進行描画 = false; + } + this.ct登場アニメ用.t進行(); + this.ctセンサ光.t進行Loop(); + if ((!CDTXMania.Instance.stage選曲.bスクロール中 && (this.ct遅延表示 != null)) && this.ct遅延表示.b進行中) + { + this.ct遅延表示.t進行(); + if ((this.ct遅延表示.n現在の値 >= 0) && this.b新しいプレビューファイルをまだ読み込んでいない) + { + this.tプレビュー画像_動画の変更(); + CDTXMania.Instance.Timer.t更新(); + this.ct遅延表示.n現在の経過時間ms = CDTXMania.Instance.Timer.n現在時刻; + this.b新しいプレビューファイルを読み込んだ = true; + } + else if (this.ct遅延表示.b終了値に達した && this.ct遅延表示.b進行中) + { + this.ct遅延表示.t停止(); + } + } + //else if( ( ( this.avi != null ) && ( this.sfAVI画像 != null ) ) && ( this.nAVI再生開始時刻 != -1 ) ) + //{ + // int time = (int) ( ( CDTXMania.Instance.Timer.n現在時刻 - this.nAVI再生開始時刻 ) * ( ( (double) CDTXMania.Instance.ConfigIni.n演奏速度 ) / 20.0 ) ); + // int frameNoFromTime = this.avi.GetFrameNoFromTime( time ); + // if( frameNoFromTime >= this.avi.GetMaxFrameCount() ) + // { + // this.nAVI再生開始時刻 = CDTXMania.Instance.Timer.n現在時刻; + // } + // else if( ( this.n前回描画したフレーム番号 != frameNoFromTime ) && !this.b動画フレームを作成した ) + // { + // this.b動画フレームを作成した = true; + // this.n前回描画したフレーム番号 = frameNoFromTime; + // this.pAVIBmp = this.avi.GetFramePtr( frameNoFromTime ); + // } + //} + this.t描画処理_パネル本体(); + this.t描画処理_ジャンル文字列(); + this.t描画処理_プレビュー画像(); + this.t描画処理_センサ光(); + this.t描画処理_センサ本体(); + + } + return 0; + } + + + // その他 + + #region [ private ] + //----------------- + //private CAvi avi; + private CDTX.CAVI rAVI; + + //private bool b動画フレームを作成した; + private CCounter ctセンサ光; + private CCounter ct遅延表示; + private CCounter ct登場アニメ用; + //private long nAVI再生開始時刻; + //private int n前回描画したフレーム番号; + private int n本体X; + private int n本体Y; + //private IntPtr pAVIBmp; + private readonly Rectangle rcセンサ光 = new Rectangle((int)(0 * Scale.X), (int)(0xc0 * Scale.Y), (int)(0x40 * Scale.X), (int)(0x40 * Scale.Y)); + private readonly Rectangle rcセンサ本体下半分 = new Rectangle((int)(0x40 * Scale.X), (int)(0 * Scale.Y), (int)(0x40 * Scale.X), (int)(0x80 * Scale.Y)); + private readonly Rectangle rcセンサ本体上半分 = new Rectangle((int)(0 * Scale.X), (int)(0 * Scale.Y), (int)(0x40 * Scale.X), (int)(0x80 * Scale.Y)); + private CTexture r表示するプレビュー画像; + //private Surface sfAVI画像; + private string str現在のファイル名; + private CTexture txセンサ; + private CTexture txセンサ光; + private CTexture txパネル本体; + private CTexture txプレビュー画像; + private CTexture txプレビュー画像がないときの画像; + private bool b新しいプレビューファイルを読み込んだ; + private bool b新しいプレビューファイルをまだ読み込んでいない + { + get + { + return !this.b新しいプレビューファイルを読み込んだ; + } + set + { + this.b新しいプレビューファイルを読み込んだ = !value; + } + } + + //private unsafe void tサーフェイスをクリアする( Surface sf ) + //{ + // DataRectangle rectangle = sf.LockRectangle( LockFlags.None ); + // DataStream data = rectangle.Data; + // switch( ( rectangle.Pitch / sf.Description.Width ) ) + // { + // case 4: + // { + // uint* numPtr = (uint*) data.DataPointer.ToPointer(); + // for( int i = 0; i < sf.Description.Height; i++ ) + // { + // for( int j = 0; j < sf.Description.Width; j++ ) + // { + // ( numPtr + ( i * sf.Description.Width ) )[ j ] = 0; + // } + // } + // break; + // } + // case 2: + // { + // ushort* numPtr2 = (ushort*) data.DataPointer.ToPointer(); + // for( int k = 0; k < sf.Description.Height; k++ ) + // { + // for( int m = 0; m < sf.Description.Width; m++ ) + // { + // ( numPtr2 + ( k * sf.Description.Width ) )[ m ] = 0; + // } + // } + // break; + // } + // } + // sf.UnlockRectangle(); + //} + private void tプレビュー画像_動画の変更() + { + this.actAVI.Stop(); + if (this.rAVI != null) + { + this.rAVI.Dispose(); + this.rAVI = null; + } + //this.pAVIBmp = IntPtr.Zero; + //this.nAVI再生開始時刻 = -1; + if (!CDTXMania.Instance.ConfigIni.bStoicMode) + { + if (this.tプレビュー動画の指定があれば構築する()) + { + return; + } + if (this.tプレビュー画像の指定があれば構築する()) + { + return; + } + if (this.t背景画像があればその一部からプレビュー画像を構築する()) + { + return; + } + } + this.r表示するプレビュー画像 = this.txプレビュー画像がないときの画像; + this.str現在のファイル名 = ""; + } + private bool tプレビュー画像の指定があれば構築する() + { + Cスコア cスコア = CDTXMania.Instance.stage選曲.r現在選択中のスコア; + if ((cスコア == null) || string.IsNullOrEmpty(cスコア.譜面情報.Preimage)) + { + return false; + } + string str = cスコア.ファイル情報.フォルダの絶対パス + cスコア.譜面情報.Preimage; + if (!str.Equals(this.str現在のファイル名)) + { + TextureFactory.tテクスチャの解放(ref this.txプレビュー画像); + this.str現在のファイル名 = str; + if (!File.Exists(this.str現在のファイル名)) + { + Trace.TraceWarning("ファイルが存在しません。({0})", new object[] { this.str現在のファイル名 }); + return false; + } + this.txプレビュー画像 = TextureFactory.tテクスチャの生成(this.str現在のファイル名, false); + if (this.txプレビュー画像 != null) + { + this.r表示するプレビュー画像 = this.txプレビュー画像; + } + else + { + this.r表示するプレビュー画像 = this.txプレビュー画像がないときの画像; + } + } + return true; + } + private bool tプレビュー動画の指定があれば構築する() + { + Cスコア cスコア = CDTXMania.Instance.stage選曲.r現在選択中のスコア; + if ((CDTXMania.Instance.ConfigIni.bAVI && (cスコア != null)) && !string.IsNullOrEmpty(cスコア.譜面情報.Premovie)) + { + string filename = cスコア.ファイル情報.フォルダの絶対パス + cスコア.譜面情報.Premovie; + if (filename.Equals(this.str現在のファイル名)) + { + return true; + } + if (this.rAVI != null) + { + this.rAVI.Dispose(); + this.rAVI = null; + } + this.str現在のファイル名 = filename; + if (!File.Exists(this.str現在のファイル名)) + { + Trace.TraceWarning("ファイルが存在しません。({0})", Path.GetFileName(this.str現在のファイル名)); + return false; + } + try + { + this.rAVI = new CDTX.CAVI(00, this.str現在のファイル名, "", CDTXMania.Instance.ConfigIni.nPlaySpeed); + this.rAVI.OnDeviceCreated(); + this.actAVI.Start(EChannel.Movie, rAVI, 204, 269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1); + } + catch (Exception e) + { + Trace.TraceError("動画の生成に失敗しました。({0})", Path.GetFileName(filename)); + Trace.TraceError("例外メッセージ:{0}", e.Message); + Trace.TraceError("  スタックトレース:{0}", e.StackTrace); + this.rAVI = null; + } + } + return false; + } + private bool t背景画像があればその一部からプレビュー画像を構築する() + { + Cスコア cスコア = CDTXMania.Instance.stage選曲.r現在選択中のスコア; + if ((cスコア == null) || string.IsNullOrEmpty(cスコア.譜面情報.Backgound)) + { + return false; + } + string path = cスコア.ファイル情報.フォルダの絶対パス + cスコア.譜面情報.Backgound; + if (!path.Equals(this.str現在のファイル名)) + { + if (!File.Exists(path)) + { + Trace.TraceWarning("ファイルが存在しません。({0})", new object[] { path }); + return false; + } + TextureFactory.tテクスチャの解放(ref this.txプレビュー画像); + this.str現在のファイル名 = path; + Bitmap image = null; + Bitmap bitmap2 = null; + Bitmap bitmap3 = null; + try + { + image = new Bitmap(this.str現在のファイル名); + bitmap2 = new Bitmap(SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height); + Graphics graphics = Graphics.FromImage(bitmap2); + int x = 0; + for (int i = 0; i < SampleFramework.GameWindowSize.Height; i += image.Height) + { + for (x = 0; x < SampleFramework.GameWindowSize.Width; x += image.Width) + { + graphics.DrawImage(image, x, i, image.Width, image.Height); + } + } + graphics.Dispose(); + bitmap3 = new Bitmap(0xcc, 0x10d); + graphics = Graphics.FromImage(bitmap3); + graphics.DrawImage(bitmap2, 5, 5, new Rectangle(0x157, 0x6d, 0xcc, 0x10d), GraphicsUnit.Pixel); + graphics.Dispose(); + this.txプレビュー画像 = new CTexture(CDTXMania.Instance.Device, bitmap3, CDTXMania.Instance.TextureFormat); + this.r表示するプレビュー画像 = this.txプレビュー画像; + } + catch + { + Trace.TraceError("背景画像の読み込みに失敗しました。({0})", new object[] { this.str現在のファイル名 }); + this.r表示するプレビュー画像 = this.txプレビュー画像がないときの画像; + return false; + } + finally + { + if (image != null) + { + image.Dispose(); + } + if (bitmap2 != null) + { + bitmap2.Dispose(); + } + if (bitmap3 != null) + { + bitmap3.Dispose(); + } + } + } + return true; + } + private void t描画処理_ジャンル文字列() + { + C曲リストノード c曲リストノード = CDTXMania.Instance.stage選曲.r現在選択中の曲; + Cスコア cスコア = CDTXMania.Instance.stage選曲.r現在選択中のスコア; + if ((c曲リストノード != null) && (cスコア != null)) + { + string str = ""; + switch (c曲リストノード.eノード種別) + { + case C曲リストノード.Eノード種別.SCORE: + if ((c曲リストノード.strジャンル == null) || (c曲リストノード.strジャンル.Length <= 0)) + { + if ((cスコア.譜面情報.ジャンル != null) && (cスコア.譜面情報.ジャンル.Length > 0)) + { + str = cスコア.譜面情報.ジャンル; + } +#if false // #32644 2013.12.21 yyagi "Unknown"なジャンル表示を削除。DTX/BMSなどの種別表示もしない。 + else + { + switch( cスコア.譜面情報.曲種別 ) + { + case CDTX.E種別.DTX: + str = "DTX"; + break; + + case CDTX.E種別.GDA: + str = "GDA"; + break; + + case CDTX.E種別.G2D: + str = "G2D"; + break; + + case CDTX.E種別.BMS: + str = "BMS"; + break; + + case CDTX.E種別.BME: + str = "BME"; + break; + } + str = "Unknown"; + } +#endif + break; + } + str = c曲リストノード.strジャンル; + break; + + case C曲リストノード.Eノード種別.SCORE_MIDI: + str = "MIDI"; + break; + + case C曲リストノード.Eノード種別.BOX: + str = "MusicBox"; + break; + + case C曲リストノード.Eノード種別.BACKBOX: + str = "BackBox"; + break; + + case C曲リストノード.Eノード種別.RANDOM: + str = "Random"; + break; + + default: + str = "Unknown"; + break; + } + CDTXMania.Instance.act文字コンソール.tPrint( + this.n本体X + (int)(0x12 * Scale.X), + this.n本体Y - (int)(1 * Scale.Y), + C文字コンソール.Eフォント種別.赤細, + str + ); + } + } + private void t描画処理_センサ光() + { + int num = this.ctセンサ光.n現在の値; + if (num < 12) + { + int x = this.n本体X + (int)(0xcc * Scale.X); + int y = this.n本体Y + (int)(0x7b * Scale.Y); + if (this.txセンサ光 != null) + { + this.txセンサ光.vc拡大縮小倍率 = new Vector3(1f, 1f, 1f); + this.txセンサ光.n透明度 = 0xff; + this.txセンサ光.t2D描画( + CDTXMania.Instance.Device, + x, + y, + new Rectangle( + (int)((num % 4) * 0x40 * Scale.X), + (int)((num / 4) * 0x40 * Scale.Y), + (int)(0x40 * Scale.X), + (int)(0x40 * Scale.Y) + ) + ); + } + } + else if (num < 0x18) + { + int num4 = num - 11; + double num5 = ((double)num4) / 11.0; + double num6 = 1.0 + (num5 * 0.5); + int num7 = (int)(64.0 * num6); + int num8 = (int)(64.0 * num6); + int x = ((this.n本体X + (int)(0xcc * Scale.X)) + (int)(0x20 * Scale.X)) - ((int)(num7 * Scale.X) / 2); + int y = ((this.n本体Y + (int)(0x7b * Scale.Y)) + (int)(0x20 * Scale.Y)) - ((int)(num8 * Scale.Y) / 2); + if (this.txセンサ光 != null) + { + this.txセンサ光.vc拡大縮小倍率 = new Vector3((float)num6, (float)num6, 1f); + this.txセンサ光.n透明度 = (int)(255.0 * (1.0 - num5)); + this.txセンサ光.t2D描画( + CDTXMania.Instance.Device, + x, + y, + this.rcセンサ光 + ); + } + } + } + private void t描画処理_センサ本体() + { + int x = this.n本体X + (int)(0xcd * Scale.X); + int y = this.n本体Y - (int)(4 * Scale.Y); + if (this.txセンサ != null) + { + this.txセンサ.t2D描画(CDTXMania.Instance.Device, x, y, this.rcセンサ本体上半分); + y += (int)(0x80 * Scale.Y); + this.txセンサ.t2D描画(CDTXMania.Instance.Device, x, y, this.rcセンサ本体下半分); + } + } + private void t描画処理_パネル本体() + { + if (this.ct登場アニメ用.b終了値に達した || (this.txパネル本体 != null)) + { + this.n本体X = (int)(8 * Scale.X); + this.n本体Y = (int)(0x39 * Scale.Y); + } + else + { + double num = ((double)this.ct登場アニメ用.n現在の値) / 100.0; + double num2 = Math.Cos((1.5 + (0.5 * num)) * Math.PI); + this.n本体X = (int)(8 * Scale.X); + this.n本体Y = (int)(0x39 * Scale.Y) - ((int)(this.txパネル本体.sz画像サイズ.Height * (1.0 - (num2 * num2)))); + } + if (this.txパネル本体 != null) + { + this.txパネル本体.t2D描画(CDTXMania.Instance.Device, this.n本体X, this.n本体Y); + } + } + private unsafe void t描画処理_プレビュー画像() + { + if (!CDTXMania.Instance.stage選曲.bスクロール中 && (((this.ct遅延表示 != null) && (this.ct遅延表示.n現在の値 > 0)) && !this.b新しいプレビューファイルをまだ読み込んでいない)) + { + int x = this.n本体X + (int)(18 * Scale.X); + int y = this.n本体Y + (int)(16 * Scale.Y); + + if (this.rAVI != null) + { + actAVI.t進行描画(x, y, 612, 605); + return; + } + + float f = ((float)this.ct遅延表示.n現在の値) / 100f; + float mag = 0.9f + (0.1f * f); + + #region [ プレビュー画像表示 ] + if (this.r表示するプレビュー画像 != null) + { + CPreviewMagnifier cmg = new CPreviewMagnifier(CPreviewMagnifier.EPreviewType.MusicSelect); + cmg.GetMagnifier(this.r表示するプレビュー画像.sz画像サイズ.Width, this.r表示するプレビュー画像.sz画像サイズ.Height, mag, mag); + + int width = cmg.width; + int height = cmg.height; + this.r表示するプレビュー画像.vc拡大縮小倍率.X = cmg.magX; + this.r表示するプレビュー画像.vc拡大縮小倍率.Y = cmg.magY; + + x += (int)((612 - width * cmg.magX) / 2); + y += (int)((605 - height * cmg.magY) / 2); + this.r表示するプレビュー画像.n透明度 = (int)(255f * f); + this.r表示するプレビュー画像.t2D描画(CDTXMania.Instance.Device, x, y); + } + #endregion + } + } + //----------------- + #endregion + } +}