では、オフスクリーンサーフェイスにキャラクターイメージを読み込んだ後、このイメージを他の場所へ転送します。
で、ただ転送するだけでなく、透明色を使用した転送が出来ます。その場合、どの色を透明色にするかをサーフェイス毎に設定しておかなければなりません。
では、透明色の指定方法を以下に記します。
まず、DDCOLORKEY構造体のメンバに透明色にしたい色を指定します。DDCOLORKEY構造体は以下のようになっています。
メンバ変数は2つあります。パレット番号のLowValueからHighValueの範囲を透明色とするらしいのですが(未確認)、
普段は1色しか透明色として使用しないので、LowもHighも同じ値にします。そうしたら、DirectDrawサーフェイスのメンバである
「SetColorKey」を呼び出します。構文は以下の通りです。
| 書式 | HRESULT SetColorKey( DWORD dwFlags, LPDDCOLORKEY lpDDColorKey );
|
| dwFlags | 透明色を指定する場合はDDCKEY_SRCBLTを指定する。これは、転送元サーフェイスの指定した色以外を転送する事を意味する。転送元カラーキーとも言う。
他にもDDCKEY_DESTBLTというのがあるが、これは転送先の指定した色の部分にのみ転送する。転送先カラーキーとも言う。こっちは滅多に使用しないので解説省略だぃ(いつか解説するかも)。
|
| lpDDColorKey | DirectDrawSurface オブジェクトの新しいカラーキー値を含んでいる DDCOLORKEY 構造体へのポインタ。 |
| 戻り値 |
成功するとDD_OKが返ってくるらしい。
|
さて、今回はパレット1番の紫色(パレット番号は0から始まります)を透明色として使用する事にします。
そうしたら、今度はデータ転送です。
データ転送をするには、転送先のサーフェースがメンバ関数「BltFast」を呼び出します。
「BltFast」の構文は以下の通りです。
| 書式 | HRESULT BltFast( DWORD dwX, DWORD dwY, LPDIRECTDRAWSURFACE lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwTrans );
|
| dwX,dwY | 転送先のXおよびY座標 |
| lpDDSrcSurface | 転送元のサーフェイスへのポインタ。言い忘れてたかもしれませんが
LPDIRECTDRAWSURFACE型は、これだけでポインタなので&はいりません。
|
| lpSrcRect | 転送元の領域を指定したRECT構造体へのポインタ。RECT構造体については下で詳しく解説しています。 |
| dwTrans | 転送タイプ。
DDBLTFAST_NOCOLORKEYは、透明色無しの転送。
DDBLTFAST_SRCCOLORKEYは、透明色有り(転送元カラーキーを使用)の転送
DDBLTFAST_WAITは、何らかの原因で転送出来ない時に、転送できるまで待つという指定。
これらはOR演算(|)で同時に複数指定できます。
|
| 戻り値 |
成功するとDD_OKが返ってくるらしい。
|
BltFastを使用するには、RECTと呼ばれる構造体のメンバに転送元の領域を指定する必要があります。RECT構造体は
以下のように定義されています。
例えば、転送元の画像のX,Y座標が32,0から64,32だとする場合は
というように指定します。こうして転送元の範囲を指定したらBltFastを呼び出します。
転送先がバックバッファ(lpBack)、転送先のX、Y座標32,32、転送元がオフスクリーンサーフェイス(lpWork)とした場合の
転送(透明色を使用 する/しない)の書き方は以下の通りです。
ただ、転送タイプの指定「DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT」というのが非常に長いため、ソースの無駄遣いのような気になります(爆)。
このフラグをテーブル化し、数値で指定するようにしたのが自作関数「Blt」というわけです。