IDirectDrawSurface7::Flip

前回は、プライマリーサーフェイスに、ビットマップをロードして貼り付けたサーフェイスのビット列を、Bltで転送することで描画をしていた・・・。

今回は、ダブルバッファリングのように、バックバッファにいったん書き込み、フリップと呼ばれる処理でプライマリーサーフェイスと交換する・・・。
これを繰り返すことで滑らかな高速描画が可能となる・・・。

今回は、test.bmpを背景に、新たにtest2.bmpを用意して、それが上下左右をキーボードで移動するような描画を実現する・・・。

f:id:BG1:20160811142341p:plain

test2.bmpを追加・・・。

f:id:BG1:20160811142531j:plain

こんな感じのもの・・・。

画像が2枚なので倍に増えた・・・。
それだけじゃなくて、バックバッファ用のddscapsBackBuffer、lpDDSBack、などが増えている・・・。
また、移動するのでxとyも・・・。

フリップはフルスクリーンでしかできない・・・。
フルスクリーンにした時、全体を描画できるように境界線やタイトルバーの部分が表示されないWS_POPUPにしている・・・。

フルスクリーンなので、協調レベル設定でDDSCL_EXCLUSIVE | DDSCL_FULLSCREENに・・・。

lpDD->SetDisplayModeで640x480の24bitカラーでディスプレイサイズを変更・・・。

今回はプライマリーサーフェイスが、バックバッファ付きの複合サーフェイスになるので、ddsd.dwFlagsは、DDSD_CAPS | DDSD_BACKBUFFERCOUNT、としてバックバッファの数を設定できるようにする・・・。
ddsd.ddsCaps.dwCapsは、DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX、としてフリップ可能な複合サーフェイス・・・。
でバックバッファの数は1・・・。

ddscapsBackBuffer.dwCapsをDDSCAPS_BACKBUFFERとして、lpDDSPrimary->GetAttachedSurfaceに渡すと、lpDDSBackにバックバッファのポインタが渡される・・・。

ここで注意なのはバックバッファもSetClipperしないといけないということ・・・。
これをやらないと画像がはみ出た時、描画されない・・・。

test.bmp同様、test2.bmpもロードしてそれを貼り付けたサーフェイスを用意・・・。

閉じるボタンのないウィンドウでフルスクリーンにすると元に戻せないので、エスケープキーを押したらウィンドウを閉じるように・・・。

test2.bmpが移動できるように、左右上下キーでxとyの値を変化させる・・・。

ただし、外へ出て行かないようにxとyの値に制限を掛ける・・・。

lpDDSBack->BltでバックバッファにlpDDSBitmapを描画・・・。(GetWindowRectいらなかったな・・・。)

位置を(x, y)として、lpDDSBack->BltでバックバッファにlpDDSBitmap2を描画・・・。

lpDDSPrimary->Flipでフリップする・・・。

IDirectDrawSurface7::Flip method (Windows)

f:id:BG1:20160811150101p:plain

最初はまず左上にある・・・。
右を押し続けると。

f:id:BG1:20160811150129p:plain

右端で止まる・・・。
下を押し続けると、

f:id:BG1:20160811150153p:plain

右下で止まる・・・。
左を押し続けると、

f:id:BG1:20160811150219p:plain

左下で止まる・・・。
上を押し続けると、

f:id:BG1:20160811150242p:plain

左上の元の場所に・・・。
ちょっと右を押した後、ちょっと下を押すと、

f:id:BG1:20160811150326p:plain

ちょっとだけ移動などもできる・・・。

Sample/dx/IDirectDrawSurface7/Flip/src/IDirectDrawSurface7 at master · bg1bgst333/Sample · GitHub