DirectXで遊ぼう | 上のページ |
- 概要
DirectDrawの最も中心となるオブジェクトです。
各オブジェクトへの橋渡しであり、スクリーン制御を行う上でのファンクションを提供します。
以下の内容について解説します。
- サンプルプログラム
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でやるべき事はほとんど済んでいます。
- IDirectDrawを生成する
DirectDrawCreate関数を使用します。
この関数に与えるパラメータは、通常はオブジェクトを格納する領域を渡すだけで良いです。
生成したIDirectDrawオブジェクトはLPDIRECTDRAW変数に返値をセットする事によって、 今後ファンクションを呼び出す為の参照ポインタとなります。
LPDIRECTDRAW ddraw; // IDirectDrawのポインタ HRESULT r; // 関数の返値 r = DirectDrawCreate(NULL,&ddraw,NULL); if(r != DD_OK){ // // IDirectDraw生成失敗(r:エラーコード) // }DirectDrawCreateの返値がDD_OKになると、正しくオブジェクトが生成した事になります。
- 制御レベルを設定する
次の必要なのは、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
- スクリーンモードを変更する
排他モードを使用する場合、スクリーンモードを任意に設定する事ができます。
例えば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文のそれぞれの値は上から横ドット数,縦ドット数,ピクセル数となっています。
引き渡す値ですがこれはハードウェアに依存するので、無理な値を設定してはいけません。
- DirectDrawを開放する
IDirectDrawオブジェクトはCOMモデルを採用しており、プログラムの終了時等で開放する必要があります。
開放その物は非常に簡単です。
ddraw->Release();
上のページ |