Develop and Download Open Source Software

Browse Subversion Repository

Diff of /trunk/DTXManiaプロジェクト/コード/全体/CDTXMania.cs

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 30 by kairera0467, Sat Mar 2 11:21:08 2013 UTC revision 32 by kairera0467, Wed Mar 6 07:48:18 2013 UTC
# Line 11  using System.Threading; Line 11  using System.Threading;
11  using System.Runtime.Serialization.Formatters.Binary;  using System.Runtime.Serialization.Formatters.Binary;
12  using SlimDX;  using SlimDX;
13  using SlimDX.Direct3D9;  using SlimDX.Direct3D9;
14    using SlimDX.Windows;
15  using FDK;  using FDK;
16  using SampleFramework;  using SampleFramework;
17  using DTXMania.Properties;  using DTXMania.Properties;
# Line 19  using DirectShowLib; Line 20  using DirectShowLib;
20    
21  namespace DTXMania  namespace DTXMania
22  {  {
23          internal class CDTXMania : Game      internal class CDTXMania : Game
24          {          {
25                  // プロパティ                  // プロパティ
26    
# Line 42  namespace DTXMania Line 43  namespace DTXMania
43          public static CApp App          public static CApp App
44          {          {
45              get;              get;
46              protected set;              private set;
47          }          }
48                  public static C文字コンソール act文字コンソール                  public static C文字コンソール act文字コンソール
49                  {                  {
# Line 320  namespace DTXMania Line 321  namespace DTXMania
321                    
322          public static void t初期化(CApp app)          public static void t初期化(CApp app)
323          {          {
324              CDTXMania.App = app;              //CDTXMania.App = app;
325              //CDTXMania.SoundDevice = null;                                                     // ユーザ依存              //CDTXMania.SoundDevice = null;                                                     // ユーザ依存
326              //CDTXMania.rc演奏用タイマ = null;                            // Global.Bass 依存(つまりユーザ依存)              //CDTXMania.rc演奏用タイマ = null;                            // Global.Bass 依存(つまりユーザ依存)
327          }          }
# Line 437  namespace DTXMania Line 438  namespace DTXMania
438                          return true;                          return true;
439                  }                  }
440                  #endregion                  #endregion
441            /// <summary>
442            /// <para>Direct3Dデバイスの生成、変更、リセットを行う。</para>
443            /// <para>新しい設定と現在の設定とを比較し、生成、変更、リセットのいずれかを実行する。</para>
444            /// <para>ウィンドウのクライアントサイズはバックバッファに等しく設定される。</para>
445            /// <para>処理に成功すれば true を返す。処理に失敗すれば、準正常系は false を返し、異常系は例外を発出する。</para>
446            /// </summary>
447            public bool tDirect3Dデバイスを生成・変更・リセットする(CD3DSettings newD3DSettings, Size sz論理画面, uint wsウィンドウモード時のウィンドウスタイル, uint ws全画面モード時のウィンドウスタイル, bool bマウスカーソルの表示を制御する)
448            {
449                if (this.Window == null)
450                    throw new InvalidOperationException("ウィンドウが未生成のままDirect3D9デバイスを生成しようとしました。");
451    
452                  // Game 実装              //bool b初めての生成 = (this.currentD3DSettings == null);
453                //var oldD3DSettings = (b初めての生成) ? null : this.currentD3DSettings.Clone();
454                bool bウィンドウモードにする = (newD3DSettings.PresentParameters.Windowed);
455                bool b全画面モードにする = !bウィンドウモードにする;
456                //bool b全画面からウィンドウへの切替えである = !b初めての生成 && !oldD3DSettings.PresentParameters.Windowed && bウィンドウモードにする;
457                //bool bウィンドウから全画面への切替えである = (b初めての生成 || oldD3DSettings.PresentParameters.Windowed) && b全画面モードにする;
458                #region [ ウィンドウのクライアントサイズをバックバッファに合わせる。]
459                //-----------------
460                if (this.Window.ClientSize.Width != newD3DSettings.PresentParameters.BackBufferWidth ||
461                    this.Window.ClientSize.Height != newD3DSettings.PresentParameters.BackBufferHeight)
462                {
463                    this.Window.ClientSize = new Size(newD3DSettings.PresentParameters.BackBufferWidth, newD3DSettings.PresentParameters.BackBufferHeight);
464                }
465                //-----------------
466                #endregion
467                #region [ Win32メッセージをあるだけ処理。]
468                //-----------------
469                CWin32.WindowMessage msg;
470    
471                while (CWin32.PeekMessage(out msg, IntPtr.Zero, 0, 0, CWin32.PM_REMOVE))
472                {
473                    CWin32.TranslateMessage(ref msg);
474                    CWin32.DispatchMessage(ref msg);
475                }
476    
477                //-----------------
478                #endregion
479    
480                #region [ Direct3D9デバイスをリセットまたは新規生成し、リソースを復元する。]
481                //-----------------
482                //bool bリセットだけでOK = (!b初めての生成 && oldD3DSettings.bデバイスの再生成が不要でリセットだけで済む(newD3DSettings));
483    
484                //if (bリセットだけでOK)
485                {
486                    #region [ デバイスのリセット ]
487                    //-----------------
488                    //this.OnUnmanageリソースを解放する();
489    
490                    //if (this.D3D9Device.Reset(newD3DSettings.PresentParameters) != ResultCode.DeviceLost)
491                    {
492                        Trace.TraceInformation("Direct3D9 デバイスをリセットしました。");
493                        //this.OnUnmanageリソースを生成する();
494                        //bリセットだけでOK = true;
495                    }
496                    //else
497                    {
498                        //Trace.TraceWarning("Direct3D9 デバイスのリセットに失敗しました。続けて、デバイスの新規生成を行います。");
499                        //bリセットだけでOK = false;         // 後段で新規生成する
500                    }
501                    //-----------------
502                    #endregion
503                }
504    
505                //if (!bリセットだけでOK) // ← "else" にしないこと。前段でリセットに失敗した場合、bリセットでOK = false に変えてここに来るため。
506                {
507                    #region [ デバイスの新規生成 ]
508                    //-----------------
509                    //this.OnManageリソースを解放する();
510                    //this.OnUnmanageリソースを解放する();
511                    /*
512                    C共通.tDisposeする(this.D3D9Device);
513                    this.D3D9Device = new Device(           // 失敗したら異常系とみなし、そのまま例外をthrow。
514                        this.Direct3D,
515                        newD3DSettings.nAdaptor,
516                        newD3DSettings.DeviceType,
517                        newD3DSettings.PresentParameters.DeviceWindowHandle,
518                        newD3DSettings.CreateFlags,
519                        newD3DSettings.PresentParameters);
520    
521                    */
522                    Trace.TraceInformation("Direct3D9 デバイスを生成しました。");
523                    //this.D3D9Device.SetDialogBoxMode(true);
524    
525                    //this.OnManageリソースを生成する();
526                    //this.OnUnmanageリソースを生成する();
527                    //-----------------
528                    #endregion
529                }
530                //-----------------
531                #endregion
532    
533                //this.currentD3DSettings = newD3DSettings.Clone(); // 成功したので設定を正式に保存する。
534    
535                //this.OnD3Dデバイスステータスの初期化();
536    
537                return true;
538            }
539            public bool tDirect3Dデバイスを生成・変更・リセットする(CD3DSettings newD3DSettings, Size sz論理画面, uint wsウィンドウモード時のウィンドウスタイル, uint ws全画面モード時のウィンドウスタイル)
540            {
541                return this.tDirect3Dデバイスを生成・変更・リセットする(newD3DSettings, sz論理画面, wsウィンドウモード時のウィンドウスタイル, ws全画面モード時のウィンドウスタイル, true);
542            }
543            public bool tDirect3Dデバイスを生成・変更・リセットする(CD3DSettings newD3DSettings, Size sz論理画面)
544            {
545                return this.tDirect3Dデバイスを生成・変更・リセットする(newD3DSettings, sz論理画面, uint.MaxValue, uint.MaxValue, true);
546            }
547            public bool tDirect3Dデバイスを生成・変更・リセットする(CD3DSettings newD3DSettings)
548            {
549                return this.tDirect3Dデバイスを生成・変更・リセットする(newD3DSettings, Size.Empty, uint.MaxValue, uint.MaxValue, true);
550            }
551    
552            public void tDirect3Dデバイスをクリアする()
553            {
554                //this.D3D9Device.Clear(ClearFlags.Target, this.colorデバイスクリア色, 0.0f, 0);
555            }
556                    // Game 実装
557                  protected override void Initialize()                  protected override void Initialize()
558                  {                  {
559  //                      new GCBeep();  //                      new GCBeep();
# Line 1042  namespace DTXMania Line 1156  namespace DTXMania
1156                                                          CDTXMania.Pad.st検知したデバイス.Clear();       // 入力デバイスフラグクリア(2010.9.11)                                                          CDTXMania.Pad.st検知したデバイス.Clear();       // 入力デバイスフラグクリア(2010.9.11)
1157    
1158                                                          r現在のステージ.On非活性化();                                                          r現在のステージ.On非活性化();
1159  #if dshow  //#if dshow
1160                              stage演奏ドラム画面.actFOStageClear.On活性化(this.Device);                              stage演奏ドラム画面.actFOStageClear.On活性化(CDTXMania.app.Device);
1161  #endif  //#endif
1162                                                          if( !ConfigIni.bギタレボモード )                                                          if( !ConfigIni.bギタレボモード )
1163                                                          {                                                          {
1164                                                                  Trace.TraceInformation( "----------------------" );                                                                  Trace.TraceInformation( "----------------------" );
# Line 1431  for (int i = 0; i < 3; i++) { Line 1545  for (int i = 0; i < 3; i++) {
1545                          }                          }
1546                          #endregion                          #endregion
1547                  }                  }
1548            /// <summary>
1549                    /// <para>ここには、対応するイベントハンドラのないイベントをハンドルするコードを書く。</para>
1550                    /// </summary>
1551                    protected void WndProc( ref Message m )
1552                    {
1553                            #region [ WM_COPYDATA: 二重起動された StrokeStyleT.exe からコマンドライン行が送られてきたら、それを取得してアクション実行予約を行う。]
1554                            //-----------------
1555                            if( m.Msg == CWin32.WM_COPYDATA )
1556                            {
1557                                    // コマンドライン行を取得。
1558                                    var copyData = (CWin32.COPYDATA) m.GetLParam( (new CWin32.COPYDATA()).GetType() );
1559                                    
1560                                    // コマンドライン登録(アクション実行予約)
1561                                    //Global.PlayerMode.arrayコマンドライン = null;
1562                                    //if( copyData.cbData > 0 )
1563                                    //      Global.PlayerMode.arrayコマンドライン = copyData.lpData.Split( new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries );
1564                            }
1565                            //-----------------
1566                            #endregion
1567                            #region [ WM_DSGRAPHNOTIFY: DirectShow グラフからのイベントを受信し、処理を行う。]
1568                            //-----------------
1569                            else if( m.Msg == CDirectShow.WM_DSGRAPHNOTIFY )
1570                            {
1571                                    int nインスタンスID = m.LParam.ToInt32();
1572                                    CDirectShow dsイベント発信者 = null;
1573                                    bool b発信者が背景動画である = false;
1574    
1575                                    #region [ イベント発信者(CDirectShow) を特定する。]
1576                                    //-----------------
1577                                    // このインスタンスID は、今のところ以下のいずれかである。
1578                                    // ・背景動画
1579                                    // ・仮想ドラムキット
1580                                    // なので、これらを順に見ていって、イベント発信者を特定する。
1581                                            dsイベント発信者 = CDirectShow.tインスタンスを返す( nインスタンスID );
1582                                            b発信者が背景動画である = false;
1583                                    //-----------------
1584                                    #endregion
1585    
1586                                    if( dsイベント発信者 == null )
1587                                            return;         // 特定に失敗したら無視。
1588    
1589                                    #region [ イベント発信者からすべてのイベントを受け取り、処理する。]
1590                                    //-----------------
1591                                    IMediaEventEx mediaEventEx = dsイベント発信者.MediaEventEx;
1592    
1593                                    if( mediaEventEx == null )
1594                                            return;         // 既に DirectShow の終了処理が始まっている場合は何もしない。
1595    
1596                                    // この辺りの処理の参考URL:
1597                                    // http://msdn.microsoft.com/ja-jp/library/cc370589.aspx
1598    
1599                                    EventCode eventCode;
1600                                    IntPtr param1, param2;
1601                                    while( mediaEventEx.GetEvent( out eventCode, out param1, out param2, 0 ) == CWin32.S_OK )       // イベントがなくなるまで
1602                                    {
1603                                            // イベント処理。
1604    
1605                                            if( eventCode == EventCode.Complete )
1606                                            {
1607                                                    #region [ 再生完了 ]
1608                                                    //-----------------
1609                                                    if( dsイベント発信者.bループ再生 )
1610                                                    {
1611                                                            if( dsイベント発信者.bループ再生 )                          // ループ指定ありなら
1612                                                                    dsイベント発信者.t再生位置を変更( 0.0 );  // すぐ再生開始。
1613                                                    }
1614                                                    else
1615                                                    {
1616                                                            if( b発信者が背景動画である )
1617                                                            {
1618                                                                    dsイベント発信者.b再生中 = false;
1619                                                                    dsイベント発信者.t再生停止();                                // 背景動画は終了しても巻き戻さない。
1620                                                            }
1621                                                            else
1622                                                            {
1623                                                                    dsイベント発信者.b再生中 = false;
1624                                                                    dsイベント発信者.t再生停止();
1625                                                                    dsイベント発信者.t再生位置を変更( 0.0 );  // 再生完了しても再生は続くので、先頭に戻して
1626                                                                    dsイベント発信者.t再生準備開始();                  // 次の再生に備えて準備しておく。
1627                                                            }
1628                                                    }
1629                                                    //-----------------
1630                                                    #endregion
1631                                            }
1632    
1633                                            // イベントを解放。
1634    
1635                                            mediaEventEx.FreeEventParams( eventCode, param1, param2 );
1636                                    }
1637                                    //-----------------
1638                                    #endregion
1639                            }
1640                            //-----------------
1641                            #endregion
1642                            #region [ WM_CLOSE: 終了指示フラグを立てる。立てるだけ。]
1643                            //-----------------
1644                            if( m.Msg == CWin32.WM_CLOSE )
1645                            {
1646                                    CDTXMania.App.bWM_CLOSEを受け取った = true;
1647                                    return;
1648                            }
1649                            //-----------------
1650                            #endregion
1651    
1652                            WndProc( ref m );
1653                    }
1654    
1655    
1656                  // その他                  // その他

Legend:
Removed from v.30  
changed lines
  Added in v.32

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