前回は、プライマリーサーフェイスに、ビットマップをロードして貼り付けたサーフェイスのビット列を、Bltで転送することで描画をしていた・・・。
今回は、ダブルバッファリングのように、バックバッファにいったん書き込み、フリップと呼ばれる処理でプライマリーサーフェイスと交換する・・・。
これを繰り返すことで滑らかな高速描画が可能となる・・・。
今回は、test.bmpを背景に、新たにtest2.bmpを用意して、それが上下左右をキーボードで移動するような描画を実現する・・・。
test2.bmpを追加・・・。
こんな感じのもの・・・。
画像が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)
最初はまず左上にある・・・。
右を押し続けると。
右端で止まる・・・。
下を押し続けると、
右下で止まる・・・。
左を押し続けると、
左下で止まる・・・。
上を押し続けると、
左上の元の場所に・・・。
ちょっと右を押した後、ちょっと下を押すと、
ちょっとだけ移動などもできる・・・。
Sample/dx/IDirectDrawSurface7/Flip/src/IDirectDrawSurface7 at master · bg1bgst333/Sample · GitHub