バックバッファを作成するには、プライマリサーフェイスを
複合プライマリサーフェイスとして作成します。複合プライマリサーフェイスとして作成すると
、プライマリサーフェイス以外に、指定した数のサーフェイス(バックバッファ)が自動作成されます。
その後、バックバッファ(サーフェイス)の情報を取得すれば、
バックバッファへ描画する事ができます。
では、まず複合プライマリサーフェイスを作成します。
第3回でも記述した通り、サーフェイスを作成するにはDDSURFACEDESC構造体のdwFlagに使用するメンバを指定します。
プライマリサーフェイスだけなら、DDSD_CAPSだけでも良いのですが、今回は複合プライマリサーフェイスとしてバックバッファも作成するので
DDSD_BACKBUFFERCOUNTも同時に指定します。そうしたらdwBackBufferCountに1を指定します。ここは作成するバックバッファの数を指定するのですが、今回は1つだけ作成します。バックバッファは複数あると、管理しにくくなるという私の独断です(゜゜)☆O(--;)oばこ
さて、ddsCaps.dwCapsは3つ指定しています。DDSCAPS_PRIMARYSURFACEは、作成するサーフェイスがプライマリサーフェイスである事、DDSCAPS_FLIPは、フリッピングを行えるサーフェイスである事、DDSCAPS_COMPLEXは複合サーフェイスである事を
それぞれ表します。というか、ここらは応用のしようが無いので丸暗記で結構です。
この後、lpDD->CreateSurface(&ddsd,&lpFront,NULL);を実行すると、同時にフロントバッファ、バックバッファを作成し、lpFrontにはフロントバッファ(兼プライマリサーフェイス)が格納されます。
で、これだけではバックバッファへ描画できないので、次にバックバッファを取得します。
GetAttachedSurfaceを使用すると、DDSCAPS構造体のメンバdwCapsへ指定した能力を持つサーフェイスを取得する事が出来ます。
ですから、この関数を使用して、さきほど作成したバックバッファを取得します。ちなみに構文は以下の通りです。
| 書式 | HRESULT GetAttachedSurface( LPDDSCAPS lpDDSCaps, LPDIRECTDRAWSURFACE FAR *lplpDDAttachedSurface );
|
| lpDDSCaps | 取得したいサーフェイス情報を詰め込んだDDSCAPS構造体へのポインタ。 今回はddscapsのアドレスを引き渡しています。 |
| lplpDDAttachedSurface | 取得したサーフェイスを格納する変数へのポインタ。 今回はlpBackのアドレスを引き渡す。 |
| 戻り値 |
成功した場合はDD_OKが返ってくるらしい。
|
これで、lpBackにサーフェイスを取得出来ました。また、このサーフェイスは、プライマリサーフェイス等と同じような扱いが出来ます。
ですから、GDIを使用して描画すると言った事も、なんなく出来ます。