DIRECTX1 DirectDraw 5 サーフェス間の画像転送

転送と重ねあわせについて説明します。いままで説明無しで、サーフェス間の画像のコピーを使っていましたが、これは3通りの方法があります。

Blt,BltFast,それからデバイスコンテキストを使ったBitBltです。

最初はビットマップをロードする場合に使ったデバイスコンテキストを使う方法です。コードは以下の通り。
 

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

(A) は、リソースを読み込んだビットマップ用のデバイスコンテキストです。
(B) は、サーフェス用のデバイスコンテキストです。サーフェスにデバイスコンテキストを使えるということは、ビットマップとグラフィックをやり取りしたり、テキストを表示したりも出来るという事ですね。
(C) は、通常(いままで使っていた)BitBltですね。おなじみです。

次はBltFastの例です。BltFastは、Bltより早い転送です。しかし、サーフェスにクリッパーオブジェクトが設定されていると動かないので注意が必要です。下のコードは、キー入力すると、画像をコピーする例です。CDxDrawのオブジェクトは、ddx ですね。
 

if(nChar == VK_DOWN){
 RECT srcRect, objRect;
 
 SetRect(&objRect,0,0,200,200);//lx,ly,rx,ry
 SetRect(&srcRect,0,0,640,480);
 ClientToScreen(&objRect);
 
 ddx.lpDDSFrontBuffer->BltFast(objRect.left, objRect.top, ddx.lpOS1, &srcRect, DDBLTFAST_NOCOLORKEY);
}
 

次の例はBltです。BltFastに比較すると引数が違います。Bltは転送元、転送先の両方にRect構造体が必要です、ということは、画像を大きくしたり、小さくして転送することが出来るという意味です。下の例では、縦横2倍に拡大してコピーしています。
 

CRect srcRect, objRect;
SetRect(srcRect, 0,0,210,210);
SetRect(objRect, 0,0,420,420);
ClientToScreen(&objRect);
ddx.lpDDSFrontBuffer->Blt(&objRect, ddx.lpOS1, &srcRect, DDBLT_WAIT, NULL);
 

次の例は、背景にキャラクタを転送するときのように、抜き色を設定して転送する例です。

 

// カラーキー(透明色)を設定する
DWORD color = 0; //(透明色)をSETする
DDCOLORKEY ddck;
ddck.dwColorSpaceLowValue = color; // この二つが同じならこの色はカラーキーになる
ddck.dwColorSpaceHighValue = color;
ddx.lpOS1->SetColorKey(DDCKEY_SRCBLT,&ddck); //バックサーフェスにカラーキーを設定する
// カラーキーを使って転送する
CRect srcRect, objRect;
SetRect(srcRect, 0,0,420,420);
SetRect(objRect, 0,0,420,420);
ClientToScreen(&objRect);
ddx.lpDDSFrontBuffer->Blt(&objRect,
ddx.lpOS1,
&srcRect,
DDBLT_WAIT | DDBLT_KEYSRC ,
NULL);
 

カラーキーの指定は、0だと黒になります。中間色を指定したい場合は、ピクセルの色のビット数を調べてセットしなければなりません。

例として、24ビットの場合の緑をカラーキーにする場合はRGBの順に8ビット並びなので

color = 0x00ff00; となります。