DIRECTX1 DirectDraw 2 サーフェス

DirectDrawのFlipの使い方について説明します。

DirectDrawのプライマリサーフェスを作るときに

ddsd.dwBackBufferCount = 1;

という行を入れておきました。これはプライマリサーフェスを作るときについでにバックバッファというサーフェスを一つ作るという指示です。これで作成したバックバッファのポインタは、

ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
lpDDSFrontBuffer->GetAttachedSurface(&ddscaps, &lpBackBuffer);

で使えるようになります。これはバックバッファをプライマリサーフェスにアタッチするというコマンドで、これでFlipが使えるようになります。

Flipというのは、

ddx.lpDDSFrontBuffer->Flip(NULL, DDFLIP_WAIT);

のように書きます。これでフロンとバッファとバックバッファが入れ替わってバックバッファが表に表示されます。

キーダウンハンドラに以下のようにコードを入れてみましょう。まずはキーUPでビットマップをロードします。ビットマップは始めに使ったものと別なものをインポートしておいてください。
 

 if(nChar == VK_UP){
 ddx.MakeOff1();
 
 //----- ビットマップをロードする
 CBitmap Bitmap;
 
 CDC DC;
 DC.CreateCompatibleDC(0);
 Bitmap.LoadBitmap(IDB_BITMAP2);
 DC.SelectObject(&Bitmap);
 
 //----- ビットマップをバックバッファに転送
 HDC hdcSurf;
 
 if(ddx.lpOS1->GetDC(&hdcSurf)== DD_OK){
  BitBlt(hdcSurf, 0,0,640, 480,DC,0,0,SRCCOPY);
  ddx.lpOS1->ReleaseDC(hdcSurf);
  DeleteDC(DC);
 }
 }
 

次はカーソルキーのDownに
 

 if(nChar == VK_DOWN){
  RECT rcSrc;
 
  rcSrc.top = 0;
  rcSrc.bottom = 200;
  rcSrc.left = 0;
  rcSrc.right = 200;
  ddx.lpBackBuffer->BltFast(100, 100, ddx.lpOS1, &rcSrc, DDBLTFAST_NOCOLORKEY);
 }
 

といれます。Downキーを押すと読み込んだサーフェスをバックバッファにコピーします。ビルドして実行ます。

1 スペースを押してバックサーフェスにCGをロードする。
2 リターンキーを押してFlipを実行して絵がでるのを確認する
3 カーソルのUP、Downを続けて押す。
4 リターンキーを押して、別なビットマップが重ねて表示されるのを確認する。

どうでしょうか、ちゃんと表示されましたか?

Flipを使って表示するときに注意することは、全部書きかえないといけない、ということです。ですから、アクションゲームや、シューティングゲームを作る場合、FlipするたびにBackBufferをすべてクリアして書き直す必要があります。ですから、背景、キャラクタ、の最低2つのサーフェスを持つ必要があります。手順としては

1 BackSurfaceをクリアする
2 背景を書き直す
3 キャラクタを全て書き直す
4 Flipで表示

アクション、シューティングでは、タイマで常に書き換えを行っているのでこのようになります。アドベンチャーゲームや、サウンドノベルなどでは必ずしもこのようにする必要はありませんが、そうするとDirectXを使う必要もあるのか、ということになります。

必要に応じてDirectXか、GDIを使う、ということになります。

これで一応、サーフェスが使えるようになりました。しかし、これだけでは実際にゲームを作ると不都合がでます。次の章でその他の説明をしましょう。