- Trace.TraceInformation( "----------------------" );\r
- Trace.TraceInformation( "■ 選曲" );\r
- stage選曲.On活性化();\r
- r直前のステージ = r現在のステージ;\r
- r現在のステージ = stage選曲;\r
- this.tガベージコレクションを実行する();\r
- }\r
- //-----------------------------\r
- #endregion\r
- break;\r
-\r
- case CStage.Eステージ.終了:\r
- #region [ *** ]\r
- //-----------------------------\r
- if( this.n進行描画の戻り値 != 0 )\r
- {\r
- base.Exit();\r
- }\r
- //-----------------------------\r
- #endregion\r
- break;\r
- }\r
- }\r
- this.Device.EndScene(); // Present()は game.csのOnFrameEnd()に登録された、GraphicsDeviceManager.game_FrameEnd() 内で実行されるので不要\r
- // (つまり、Present()は、Draw()完了後に実行される)\r
-#if !GPUFlushAfterPresent\r
- actFlushGPU.On進行描画(); // Flush GPU // EndScene()~Present()間 (つまりVSync前) でFlush実行\r
-#endif\r
- if ( Sound管理.GetCurrentSoundDeviceType() != "DirectSound" )\r
- {\r
- Sound管理.t再生中の処理をする(); // サウンドバッファの更新; 画面描画と同期させることで、スクロールをスムーズにする\r
- }\r
-\r
-\r
- #region [ 全画面・ウインドウ切り替え ]\r
- if ( this.b次のタイミングで全画面・ウィンドウ切り替えを行う )\r
- {\r
- ConfigIni.b全画面モード = !ConfigIni.b全画面モード;\r
- app.t全画面・ウィンドウモード切り替え();\r
- this.b次のタイミングで全画面・ウィンドウ切り替えを行う = false;\r
- }\r
- #endregion\r
- #region [ 垂直基線同期切り替え ]\r
- if ( this.b次のタイミングで垂直帰線同期切り替えを行う )\r
- {\r
- bool bIsMaximized = this.Window.IsMaximized; // #23510 2010.11.3 yyagi: to backup current window mode before changing VSyncWait\r
- currentClientSize = this.Window.ClientSize; // #23510 2010.11.3 yyagi: to backup current window size before changing VSyncWait\r
- DeviceSettings currentSettings = app.GraphicsDeviceManager.CurrentSettings;\r
- currentSettings.EnableVSync = ConfigIni.b垂直帰線待ちを行う;\r
- app.GraphicsDeviceManager.ChangeDevice( currentSettings );\r
- this.b次のタイミングで垂直帰線同期切り替えを行う = false;\r
- base.Window.ClientSize = new Size(currentClientSize.Width, currentClientSize.Height); // #23510 2010.11.3 yyagi: to resume window size after changing VSyncWait\r
- if (bIsMaximized)\r
- {\r
- this.Window.WindowState = FormWindowState.Maximized; // #23510 2010.11.3 yyagi: to resume window mode after changing VSyncWait\r
- }\r
- }\r
- #endregion\r
- }\r
-\r
- // その他\r
-\r
- #region [ 汎用ヘルパー ]\r
- //-----------------\r
- #region [ tテクスチャの生成 ]\r
- public static CTexture tテクスチャの生成( string fileName )\r
- {\r
- return tテクスチャの生成( fileName, false );\r
- }\r
- public static CTexture tテクスチャの生成( string fileName, bool b黒を透過する )\r
- {\r
- if ( app == null )\r
- {\r
- return null;\r
- }\r
- try\r
- {\r
- return new CTexture( app.Device, fileName, TextureFormat, b黒を透過する );\r
- }\r
- catch ( CTextureCreateFailedException )\r
- {\r
- Trace.TraceError( "テクスチャの生成に失敗しました。({0})", fileName );\r
- return null;\r
- }\r
- catch ( FileNotFoundException )\r
- {\r
- Trace.TraceError( "テクスチャファイルが見つかりませんでした。({0})", fileName );\r
- return null;\r
- }\r
- }\r
- public static CTextureAf tテクスチャの生成Af( string fileName, bool b黒を透過する )\r
- {\r
- if ( app == null )\r
- {\r
- return null;\r
- }\r
- try\r
- {\r
- return new CTextureAf( app.Device, fileName, TextureFormat, b黒を透過する );\r
- }\r
- catch ( CTextureCreateFailedException )\r
- {\r
- Trace.TraceError( "テクスチャの生成に失敗しました。({0})", fileName );\r
- return null;\r
- }\r
- catch ( FileNotFoundException )\r
- {\r
- Trace.TraceError( "テクスチャファイルが見つかりませんでした。({0})", fileName );\r
- return null;\r
- }\r
- }\r
- public static void tテクスチャの解放( ref CTexture tx )\r
- {\r
- CDTXMania.t安全にDisposeする( ref tx );\r
- }\r
- public static void tテクスチャの解放( ref CTextureAf tx )\r
- {\r
- CDTXMania.t安全にDisposeする( ref tx );\r
- }\r
- public static CTexture tテクスチャの生成( byte[] txData )\r
- {\r
- return tテクスチャの生成( txData, false );\r
- }\r
- public static CTexture tテクスチャの生成( byte[] txData, bool b黒を透過する )\r
- {\r
- if ( app == null )\r
- {\r
- return null;\r
- }\r
- if ( txData == null )\r
- {\r
- Trace.TraceError( "テクスチャの生成に失敗しました。(txData==null)" );\r
- return null;\r
- }\r
- try\r
- {\r
- return new CTexture( app.Device, txData, TextureFormat, b黒を透過する );\r
- }\r
- catch ( CTextureCreateFailedException )\r
- {\r
- Trace.TraceError( "テクスチャの生成に失敗しました。(txData)" );\r
- return null;\r
- }\r
- }\r
-\r
- public static CTexture tテクスチャの生成( Bitmap bitmap )\r
- {\r
- return tテクスチャの生成( bitmap, false );\r
- }\r
- public static CTexture tテクスチャの生成( Bitmap bitmap, bool b黒を透過する )\r
- {\r
- if ( app == null )\r
- {\r
- return null;\r
- }\r
- if ( bitmap == null )\r
- {\r
- Trace.TraceError( "テクスチャの生成に失敗しました。(bitmap==null)" );\r
- return null;\r
- }\r
- try\r
- {\r
- return new CTexture( app.Device, bitmap, TextureFormat, b黒を透過する );\r
- }\r
- catch ( CTextureCreateFailedException )\r
- {\r
- Trace.TraceError( "テクスチャの生成に失敗しました。(bitmap)" );\r
- return null;\r
- }\r
- }\r
- #endregion\r
-\r
- /// <summary>プロパティ、インデクサには ref は使用できないので注意。</summary>\r
- public static void t安全にDisposeする<T>( ref T obj )\r
- {\r
- if ( obj == null )\r
- return;\r
-\r
- var d = obj as IDisposable;\r
-\r
- if ( d != null )\r
- d.Dispose();\r
-\r
- obj = default( T );\r
- }\r
- //-----------------\r
- #endregion\r
-\r
- #region [ private ]\r
- //-----------------\r
- private bool bマウスカーソル表示中 = true;\r
- private bool b終了処理完了済み;\r
- private static CDTX dtx;\r
- private List<CActivity> listトップレベルActivities;\r
- private int n進行描画の戻り値;\r
- private MouseButtons mb = System.Windows.Forms.MouseButtons.Left;\r
- private string strWindowTitle\r
- {\r
- get\r
- {\r
- if ( DTXVmode.Enabled )\r
- {\r
- return "DTXViewer release " + VERSION;\r
- }\r
- else\r
- {\r
- return "DTXMania .NET style release " + VERSION;\r
- }\r
- }\r
- }\r
- private CSound previewSound;\r
-\r
- private void t起動処理()\r
- {\r
- #region [ strEXEのあるフォルダを決定する ]\r
- //-----------------\r
-// BEGIN #23629 2010.11.13 from: デバッグ時は Application.ExecutablePath が ($SolutionDir)/bin/x86/Debug/ などになり System/ の読み込みに失敗するので、カレントディレクトリを採用する。(プロジェクトのプロパティ→デバッグ→作業ディレクトリが有効になる)\r
-#if DEBUG\r
- strEXEのあるフォルダ = Environment.CurrentDirectory + @"\";\r
-#else\r
- strEXEのあるフォルダ = Path.GetDirectoryName( Application.ExecutablePath ) + @"\"; // #23629 2010.11.9 yyagi: set correct pathname where DTXManiaGR.exe is.\r
-#endif\r
-// END #23629 2010.11.13 from\r
- //-----------------\r
- #endregion\r
-\r
- #region [ Config.ini の読込み ]\r
- //---------------------\r
- ConfigIni = new CConfigIni();\r
- string path = strEXEのあるフォルダ + "Config.ini";\r
- if( File.Exists( path ) )\r
- {\r
- try\r
- {\r
- ConfigIni.tファイルから読み込み( path );\r
- }\r
- catch\r
- {\r
- //ConfigIni = new CConfigIni(); // 存在してなければ新規生成\r
- }\r
- }\r
- this.Window.EnableSystemMenu = CDTXMania.ConfigIni.bIsEnabledSystemMenu; // #28200 2011.5.1 yyagi\r
- // 2012.8.22 Config.iniが無いときに初期値が適用されるよう、この設定行をifブロック外に移動\r
-\r
- //---------------------\r
- #endregion\r
- #region [ ログ出力開始 ]\r
- //---------------------\r
- Trace.AutoFlush = true;\r
- if( ConfigIni.bログ出力 )\r
- {\r
- try\r
- {\r
- Trace.Listeners.Add( new CTraceLogListener( new StreamWriter( System.IO.Path.Combine( strEXEのあるフォルダ, "DTXManiaLog.txt" ), false, Encoding.GetEncoding( "Shift_JIS" ) ) ) );\r
- }\r
- catch ( System.UnauthorizedAccessException ) // #24481 2011.2.20 yyagi\r
- {\r
- int c = (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja")? 0 : 1;\r
- string[] mes_writeErr = {\r
- "DTXManiaLog.txtへの書き込みができませんでした。書き込みできるようにしてから、再度起動してください。",\r
- "Failed to write DTXManiaLog.txt. Please set it writable and try again."\r
- };\r
- MessageBox.Show( mes_writeErr[c], "DTXMania boot error", MessageBoxButtons.OK, MessageBoxIcon.Error );\r
- Environment.Exit(1);\r
- }\r
- }\r
- Trace.WriteLine("");\r
- Trace.WriteLine( "DTXMania powered by YAMAHA Silent Session Drums" );\r
- Trace.WriteLine( string.Format( "Release: {0}", VERSION ) );\r
- Trace.WriteLine( "" );\r
- Trace.TraceInformation( "----------------------" );\r
- Trace.TraceInformation( "■ アプリケーションの初期化" );\r
- Trace.TraceInformation( "OS Version: " + Environment.OSVersion );\r
- Trace.TraceInformation( "ProcessorCount: " + Environment.ProcessorCount.ToString() );\r
- Trace.TraceInformation( "CLR Version: " + Environment.Version.ToString() );\r
- //---------------------\r
- #endregion\r
- #region [ DTXVmodeクラス の初期化 ]\r
- //---------------------\r
- //Trace.TraceInformation( "DTXVモードの初期化を行います。" );\r
- //Trace.Indent();\r
- try\r
- {\r
- DTXVmode = new CDTXVmode();\r
- DTXVmode.Enabled = false;\r
- //Trace.TraceInformation( "DTXVモードの初期化を完了しました。" );\r
- }\r
- finally\r
- {\r
- //Trace.Unindent();\r
- }\r
- //---------------------\r
- #endregion\r
- #region [ コンパクトモードスイッチの有無、もしくは、DTXViewerとしての起動 ]\r
- //---------------------\r
- bコンパクトモード = false;\r
- strコンパクトモードファイル = "";\r
- string[] commandLineArgs = Environment.GetCommandLineArgs();\r
- if( ( commandLineArgs != null ) && ( commandLineArgs.Length > 1 ) )\r
- {\r
- bコンパクトモード = true;\r
- string arg = "";\r
-\r
- for ( int i = 1; i < commandLineArgs.Length; i++ )\r
- {\r
- if ( i != 1 )\r
- {\r
- arg += " " + "\"" + commandLineArgs[ i ] + "\"";\r
- }\r
- else\r
- {\r
- arg += commandLineArgs[ i ];\r
- }\r
- }\r
- DTXVmode.ParseArguments( arg );\r
- \r
- if ( DTXVmode.Enabled )\r
- {\r
- DTXVmode.Refreshed = false; // 初回起動時は再読み込みに走らせない\r
- strコンパクトモードファイル = DTXVmode.filename;\r
- switch ( DTXVmode.soundDeviceType ) // サウンド再生方式の設定\r
- {\r
- case ESoundDeviceType.DirectSound:\r
- ConfigIni.nSoundDeviceType = 0;\r
- break;\r
- case ESoundDeviceType.ExclusiveWASAPI:\r
- ConfigIni.nSoundDeviceType = 2;\r
- break;\r
- case ESoundDeviceType.ASIO:\r
- ConfigIni.nSoundDeviceType = 1;\r
- ConfigIni.nASIODevice = DTXVmode.nASIOdevice;\r
- break;\r
- }\r
-\r
- CDTXMania.ConfigIni.b垂直帰線待ちを行う = DTXVmode.VSyncWait;\r
- CDTXMania.ConfigIni.bTimeStretch = DTXVmode.TimeStretch;\r
- CDTXMania.ConfigIni.bDrums有効 = !DTXVmode.GRmode;\r
- CDTXMania.ConfigIni.bGuitar有効 = true;\r
- }\r
- else // 通常のコンパクトモード\r
- {\r
- strコンパクトモードファイル = commandLineArgs[ 1 ];\r
- }\r
-\r
- if ( !File.Exists( strコンパクトモードファイル ) ) // #32985 2014.1.23 yyagi \r
- {\r
- Trace.TraceError( "コンパクトモードで指定されたファイルが見つかりません。DTXManiaを終了します。[{0}]", strコンパクトモードファイル );\r
-#if DEBUG\r
- Environment.Exit( -1 );\r
-#else\r
- if ( strコンパクトモードファイル == "" ) // DTXMania未起動状態で、DTXCで再生停止ボタンを押した場合は、何もせず終了\r
- {\r
- Environment.Exit( -1 );\r
- }\r
- else\r
- {\r
- throw new FileNotFoundException( "コンパクトモードで指定されたファイルが見つかりません。DTXManiaを終了します。", strコンパクトモードファイル );\r
- }\r
-#endif\r
- }\r
- if ( DTXVmode.Enabled )\r
- {\r
- Trace.TraceInformation( "DTXVモードで起動します。[{0}]", strコンパクトモードファイル );\r
- }\r
- else\r
- {\r
- Trace.TraceInformation( "コンパクトモードで起動します。[{0}]", strコンパクトモードファイル );\r
- }\r
- }\r
- //---------------------\r
- #endregion\r
-\r
- #region [ ウィンドウ初期化 ]\r
- //---------------------\r
- base.Window.StartPosition = FormStartPosition.Manual; // #30675 2013.02.04 ikanick add\r
- base.Window.Location = new Point( ConfigIni.n初期ウィンドウ開始位置X, ConfigIni.n初期ウィンドウ開始位置Y ); // #30675 2013.02.04 ikanick add\r
-\r
- base.Window.Text = this.strWindowTitle; // 事前にDTXVmodeの実体を作っておくこと\r
-\r
- base.Window.StartPosition = FormStartPosition.Manual; // #30675 2013.02.04 ikanick add\r
- base.Window.Location = new Point(ConfigIni.n初期ウィンドウ開始位置X, ConfigIni.n初期ウィンドウ開始位置Y); // #30675 2013.02.04 ikanick add\r
-\r
- base.Window.ClientSize = new Size(ConfigIni.nウインドウwidth, ConfigIni.nウインドウheight); // #34510 yyagi 2010.10.31 to change window size got from Config.ini\r
-#if !WindowedFullscreen\r
- if (!ConfigIni.bウィンドウモード) // #23510 2010.11.02 yyagi: add; to recover window size in case bootup with fullscreen mode\r
- { // #30666 2013.02.02 yyagi: currentClientSize should be always made\r
-#endif\r
- currentClientSize = new Size( ConfigIni.nウインドウwidth, ConfigIni.nウインドウheight );\r
-#if !WindowedFullscreen\r
- }\r
-#endif\r
- base.Window.MaximizeBox = true; // #23510 2010.11.04 yyagi: to support maximizing window\r
- base.Window.FormBorderStyle = FormBorderStyle.Sizable; // #23510 2010.10.27 yyagi: changed from FixedDialog to Sizable, to support window resize\r
- // #30666 2013.02.02 yyagi: moved the code to t全画面・ウインドウモード切り替え()\r
- base.Window.ShowIcon = true;\r
- base.Window.Icon = Properties.Resources.dtx;\r
- base.Window.KeyDown += new KeyEventHandler( this.Window_KeyDown );\r
- base.Window.MouseUp +=new MouseEventHandler( this.Window_MouseUp);\r
- base.Window.MouseDoubleClick += new MouseEventHandler(this.Window_MouseDoubleClick); // #23510 2010.11.13 yyagi: to go fullscreen mode\r
- base.Window.ResizeEnd += new EventHandler(this.Window_ResizeEnd); // #23510 2010.11.20 yyagi: to set resized window size in Config.ini\r
- base.Window.ApplicationActivated += new EventHandler(this.Window_ApplicationActivated);\r
- base.Window.ApplicationDeactivated += new EventHandler( this.Window_ApplicationDeactivated );\r
- //---------------------\r
- #endregion\r
- #region [ Direct3D9Exを使うかどうか判定 ]\r
- #endregion\r
- #region [ Direct3D9 デバイスの生成 ]\r
- //---------------------\r
- DeviceSettings settings = new DeviceSettings();\r
-#if WindowedFullscreen\r
- settings.Windowed = true; // #30666 2013.2.2 yyagi: Fullscreenmode is "Maximized window" mode\r
-#else\r
- settings.Windowed = ConfigIni.bウィンドウモード;\r
-#endif\r
- settings.BackBufferWidth = SampleFramework.GameWindowSize.Width;\r
- settings.BackBufferHeight = SampleFramework.GameWindowSize.Height;\r
-// settings.BackBufferCount = 3;\r
- settings.EnableVSync = ConfigIni.b垂直帰線待ちを行う;\r
-// settings.BackBufferFormat = Format.A8R8G8B8;\r
-// settings.MultisampleType = MultisampleType.FourSamples;\r
-// settings.MultisampleQuality = 4;\r
-// settings.MultisampleType = MultisampleType.None;\r
-// settings.MultisampleQuality = 0;\r
- \r
- try\r
- {\r
- base.GraphicsDeviceManager.ChangeDevice(settings);\r
- }\r
- catch (DeviceCreationException e)\r
- {\r
- Trace.TraceError(e.ToString());\r
- MessageBox.Show(e.Message + e.ToString(), "DTXMania failed to boot: DirectX9 Initialize Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
- Environment.Exit(-1);\r
- }\r
- \r
- base.IsFixedTimeStep = false;\r
-// base.TargetElapsedTime = TimeSpan.FromTicks( 10000000 / 75 );\r
- base.Window.ClientSize = new Size(ConfigIni.nウインドウwidth, ConfigIni.nウインドウheight); // #23510 2010.10.31 yyagi: to recover window size. width and height are able to get from Config.ini.\r
- base.InactiveSleepTime = TimeSpan.FromMilliseconds((float)(ConfigIni.n非フォーカス時スリープms)); // #23568 2010.11.3 yyagi: to support valiable sleep value when !IsActive\r
- // #23568 2010.11.4 ikanick changed ( 1 -> ConfigIni )\r
-#if WindowedFullscreen\r
- this.t全画面・ウィンドウモード切り替え(); // #30666 2013.2.2 yyagi: finalize settings for "Maximized window mode"\r
-#endif\r
- actFlushGPU = new CActFlushGPU();\r
- //---------------------\r
- #endregion\r
-\r
- DTX = null;\r
-\r
- #region [ Skin の初期化 ]\r
- //---------------------\r
- Trace.TraceInformation( "スキンの初期化を行います。" );\r
- Trace.Indent();\r
- try\r
- {\r
- Skin = new CSkin( CDTXMania.ConfigIni.strSystemSkinSubfolderFullName, CDTXMania.ConfigIni.bUseBoxDefSkin );\r
- CDTXMania.ConfigIni.strSystemSkinSubfolderFullName = CDTXMania.Skin.GetCurrentSkinSubfolderFullName( true ); // 旧指定のSkinフォルダが消滅していた場合に備える\r
- Trace.TraceInformation( "スキンの初期化を完了しました。" );\r
- }\r
- catch\r
- {\r
- Trace.TraceInformation( "スキンの初期化に失敗しました。" );\r
- throw;\r
- }\r
- finally\r
- {\r
- Trace.Unindent();\r
- }\r
- //---------------------\r
- #endregion\r
- //-----------\r
- #region [ Timer の初期化 ]\r
- //---------------------\r
- Trace.TraceInformation( "タイマの初期化を行います。" );\r
- Trace.Indent();\r
- try\r
- {\r
- Timer = new CTimer( CTimer.E種別.MultiMedia );\r
- Trace.TraceInformation( "タイマの初期化を完了しました。" );\r
- }\r
- finally\r
- {\r
- Trace.Unindent();\r
- }\r
- //---------------------\r
- #endregion\r
- //-----------\r
-\r
- #region [ FPS カウンタの初期化 ]\r
- //---------------------\r
- Trace.TraceInformation( "FPSカウンタの初期化を行います。" );\r
- Trace.Indent();\r
- try\r
- {\r
- FPS = new CFPS();\r
- Trace.TraceInformation( "FPSカウンタを生成しました。" );\r
- }\r
- finally\r
- {\r
- Trace.Unindent();\r
- }\r
- //---------------------\r
- #endregion\r
- #region [ act文字コンソールの初期化 ]\r
- //---------------------\r
- Trace.TraceInformation( "文字コンソールの初期化を行います。" );\r
- Trace.Indent();\r
- try\r
- {\r
- act文字コンソール = new C文字コンソール();\r
- Trace.TraceInformation( "文字コンソールを生成しました。" );\r
- act文字コンソール.On活性化();\r
- Trace.TraceInformation( "文字コンソールを活性化しました。" );\r
- Trace.TraceInformation( "文字コンソールの初期化を完了しました。" );\r
- }\r
- catch( Exception exception )\r
- {\r
- Trace.TraceError( exception.Message );\r
- Trace.TraceError( "文字コンソールの初期化に失敗しました。" );\r
- }\r
- finally\r
- {\r
- Trace.Unindent();\r
- }\r
- //---------------------\r
- #endregion\r
- #region [ Input管理 の初期化 ]\r
- //---------------------\r
- Trace.TraceInformation( "DirectInput, MIDI入力の初期化を行います。" );\r
- Trace.Indent();\r
- try\r
- {\r
- bool bUseMIDIIn = !DTXVmode.Enabled;\r
- Input管理 = new CInput管理( base.Window.Handle, bUseMIDIIn );\r
- foreach( IInputDevice device in Input管理.list入力デバイス )\r
- {\r
- if( ( device.e入力デバイス種別 == E入力デバイス種別.Joystick ) && !ConfigIni.dicJoystick.ContainsValue( device.GUID ) )\r
- {\r
- int key = 0;\r
- while( ConfigIni.dicJoystick.ContainsKey( key ) )\r
- {\r
- key++;\r