DirectXで遊ぼう 上のページ

IDirectDraw
  1. 概要

    DirectDrawの最も中心となるオブジェクトです。
    各オブジェクトへの橋渡しであり、スクリーン制御を行う上でのファンクションを提供します。

    以下の内容について解説します。


  2. サンプルプログラム

    DirectDrawを制御する上で必要な処理がいくつかあるので、それらをまとめて解説します。
    IDirectDrawは、DirectDrawCreateという関数を使用する事により生成します。

    以下は、640×480ドット,256色モードにするサンプルプログラムです。
    LPDIRECTDRAW ddraw;             // IDirectDrawのポインタ
    HRESULT r;                      // 関数の返値
    
    #define DD_COOPERATIVELEVEL     (DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN)
    #define DD_WIDTH                640
    #define DD_HEIGHT               480
    #define DD_BPP                  8
    
    r = DirectDrawCreate(NULL,&ddraw,NULL);
    if(r != DD_OK){
        //
        // IDirectDraw生成失敗(r:エラーコード)
        //
    }
    
    r = ddraw->SetCooperativeLevel(hwnd,DD_COOPERATIVELEVEL);
    if(r != DD_OK){
        ddraw->Release();
    
        //
        // SetCooperativeLevel失敗(r:エラーコード)
        //
    }
    
    r = ddraw->SetDisplayMode(DD_WIDTH,DD_HEIGHT,DD_BPP);
    if(r != DD_OK)`
        ddraw->Release();
    
        //
        // SetDisplayMode失敗(r:エラーコード)
        //
    }
    
    これだけで、IDirectDrawでやるべき事はほとんど済んでいます。

  3. IDirectDrawを生成する

    DirectDrawCreate関数を使用します。
    この関数に与えるパラメータは、通常はオブジェクトを格納する領域を渡すだけで良いです。
    生成したIDirectDrawオブジェクトはLPDIRECTDRAW変数に返値をセットする事によって、 今後ファンクションを呼び出す為の参照ポインタとなります。
    LPDIRECTDRAW ddraw;                 // IDirectDrawのポインタ
    HRESULT r;                          // 関数の返値
    
    r = DirectDrawCreate(NULL,&ddraw,NULL);
    if(r != DD_OK){
        //
        // IDirectDraw生成失敗(r:エラーコード)
        //
    }
    
    DirectDrawCreateの返値がDD_OKになると、正しくオブジェクトが生成した事になります。

  4. 制御レベルを設定する

    次の必要なのは、DirectDrawの制御レベルを設定する事です。
    サンプルでは、2種類のパラメータ「排他」「フルスクリーン」を与えています。
    排他モードは他のアプリケーションの動作を停止し、全ての制御を自分自身に与えます。 これによってハードウェアの性能を十二分に発揮する事が可能になります。
    SetCooperativeLevel関数には、他に表示を行うウィンドゥハンドルを渡す必要があります。
    #define COOPERATIVELEVEL        (DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN)
    
    r = ddraw->SetCooperativeLevel(hwnd,COOPERATIVELEVEL);
    if(r != DD_OK){
        ddraw->Release();
    
        //
        // SetCooperativeLevel失敗(r:エラーコード)
        //
    }
    
    SetCooperativeLevelには他にもパラメータがあります。
    サンプルではフルスクリーン表示を行うようにしてますが、以下のようにするとウィンドゥ表示にする事もできます。
    #define COOPERATIVELEVEL        DDSCL_NORMAL
    

  5. スクリーンモードを変更する

    排他モードを使用する場合、スクリーンモードを任意に設定する事ができます。
    例えば1024×480ドットのスクリーン上で640×480ドット表示すると、画面が小さくなる物です。 人によってはわざわざ640×480ドットに切り替えてから起動を行うかもしれません。 そういった場合に、プログラム自身がスクリーンモードを切り替える事で、より簡単に大きな画面でプレイする事ができる訳です。
    #define DD_WIDTH                640
    #define DD_HEIGHT               480
    #define DD_BPP                  8
    
    r = ddraw->SetDisplayMode(DD_WIDTH,DD_HEIGHT,DD_BPP);
    if(r != DD_OK)`
        ddraw->Release();
    
        //
        // SetDisplayMode失敗(r:エラーコード)
        //
    }
    
    #define文のそれぞれの値は上から横ドット数,縦ドット数,ピクセル数となっています。
    引き渡す値ですがこれはハードウェアに依存するので、無理な値を設定してはいけません。

  6. DirectDrawを開放する

    IDirectDrawオブジェクトはCOMモデルを採用しており、プログラムの終了時等で開放する必要があります。
    開放その物は非常に簡単です。
    ddraw->Release();
    



上のページ