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; となります。