キャラクタ画像の向きを変えたり回転させるにはBltFast
ではなくBlt
を使う。
日本語HELPなどに方法が書いてあるがサンプルコードがないので簡単に紹介したい。
- 左右に反転
- 上下に反転
- 時計回りに 180 度回転
- 時計回りに 270 度回転
- 時計回りに 90 度回転
他にもいろいろあるが、自分が使うのはこのくらいだと思うので・・・
Bltメソッドは、
を指定してブロック転送を行う。引数は5つで、内容は次のとおり。
- 転送先の位置とサイズ
- 転送元サーフェイス
- 転送元の座標値
- 転送先の位置とサイズ
転送先の左上隅の座標値と右下隅の座標値を示すRECT構造体のポインタを指定。- 転送元サーフェイス
転送元サーフェイスのポインタを指定。- 転送元の座標値
転送元の左上隅の座標値と右下隅の座標値を示すRECT構造体のポインタを指定。- ブロック転送の組み合わせ
ブロック転送に効果をつける場合や特殊な処理をするときに指定。指定しないときはNULL。- DDBLTFX構造体のポインタ
効果の情報を入れるためのDDBLTFX構造体のポインタを指定。指定しないときはNULL。使用例1:普通に転送する場合
RECT rcDest, rcSrc;
SetRect(&rcDest, 100, 100, 164, 164);
SetRect(&rcSrc, 0, 0, 64, 64);
hRet = lpDDSOne->Blt(lpBltRect, lpDDSSrc, lpSrcRect, DDBLT_WAIT | DDBLT_KEYSRC, NULL); if (hRet != DD_OK) return FALSE;使用例2:効果をつける(左右反転の場合)
DDBLTFX ddBltFx;
RECT rcDest, rcSrc;
ddBltFx.dwSize = sizeof(ddBltFx);
ddBltFx.dwDDFX = DDBLTFX_MIRRORLEFTRIGHT;
SetRect(&rcDest, 100, 100, 164, 164);
SetRect(&rcSrc, 0, 0, 64, 64);
hRet = lpDDSOne->Blt(lpBltRect, lpDDSSrc, lpSrcRect, DDBLT_WAIT | DDBLT_KEYSRC| DDBLT_DDFX,&ddBltFx);
if (hRet != DD_OK) return FALSE;
BltFast関数と同様、Blt関数での描画処理を関数化したほうが利用しやすいと思うので、私は以下の関数を作成し、myDraw.cppに配置した。
//----------------------------------------------------------------------------- // 関数名 : myBlt() // 機能概要: サーフェース間の画像転送 // 引 数 : lpBltRect:転送先の矩形 lpDDSOne:転送先サーフェース // lpDDSSrc:転送元サーフェース lpSrcRect:転送元の矩形 // dwTrand:転送フラグ //----------------------------------------------------------------------------- HRESULT myBlt(LPRECT lpBltRect, LPDIRECTDRAWSURFACE7 lpDDSOne, LPDIRECTDRAWSURFACE7 lpDDSSrc, LPRECT lpSrcRect, DWORD dwTrand) { HRESULT hRet; while (TRUE) { hRet = lpDDSOne->Blt(lpBltRect, lpDDSSrc, lpSrcRect, DDBLT_WAIT | dwTrand, NULL); if (hRet == DD_OK) break; if (hRet == DDERR_SURFACELOST) { hRet = RestoreDraw(); if (hRet != DD_OK) break; } if(hRet != DDERR_WASSTILLDRAWING) break; } return hRet; }転送フラグの種類(抜粋)
- 1.DDBLT_KEYSRC
- カラーキーに指定された色を転送しない(透明色)
- 2.NULL
- そのまま転送
上記関数を、効果をつけて描画できるよう改造する。
//----------------------------------------------------------------------------- // 関数名 : myBlt() // 機能概要: サーフェース間の画像転送 // 引 数 : lpBltRect:転送先の矩形 lpDDSOne:転送先サーフェース // lpDDSSrc:転送元サーフェース lpSrcRect:転送元の矩形 // dwTrand:転送フラグdwFx:効果フラグ//----------------------------------------------------------------------------- HRESULT myBlt(LPRECT lpBltRect, LPDIRECTDRAWSURFACE7 lpDDSOne, LPDIRECTDRAWSURFACE7 lpDDSSrc, LPRECT lpSrcRect, DWORD dwTrand,DWORD dwFx) { HRESULT hRet;DDBLTFX ddBltFx;ddBltFx.dwSize = sizeof(ddBltFx);ddBltFx.dwDDFX = dwFx;while (TRUE) { hRet = lpDDSOne->Blt(lpBltRect, lpDDSSrc, lpSrcRect, DDBLT_WAIT | dwTrand,&ddBltFx); if (hRet == DD_OK) break; if (hRet == DDERR_SURFACELOST) { hRet = RestoreDraw(); if (hRet != DD_OK) break; } if(hRet != DDERR_WASSTILLDRAWING) break; } return hRet; }使用例1:通常どおり使用する(効果をつけない)
hRet = myBlt(&outRect, g_pDDSBack, g_pDDSChar, &rcRect, DDBLT_KEYSRC, NULL);使用例2:画像を上下反転して描画する(効果をつける)
hRet = myBlt(&outRect, g_pDDSBack, g_pDDSChar, &rcRect, DDBLT_DDFX |DDBLT_KEYSRC,DDBLTFX_MIRRORUPDOWN);効果フラグの種類(抜粋)
- 1.DDBLTFX_MIRRORLEFTRIGHT
- 左右に反転
- 2.DDBLTFX_MIRRORUPDOWN
- 上下に反転
- 3.DDBLTFX_ROTATE180
- 時計回りに 180 度回転
- 4.DDBLTFX_ROTATE270
- 時計回りに 270 度回転
- 5.DDBLTFX_ROTATE90
- 時計回りに 90 度回転