画像を反転・回転させる

キャラクタ画像の向きを変えたり回転させるにはBltFastではなくBltを使う。
日本語HELPなどに方法が書いてあるがサンプルコードがないので簡単に紹介したい。

1.Blt関数で出来る事

他にもいろいろあるが、自分が使うのはこのくらいだと思うので・・・

2.Bltメソッドの説明

Bltメソッドは、

  1. 転送先の位置とサイズ
  2. 転送元サーフェイス
  3. 転送元の座標値
を指定してブロック転送を行う。引数は5つで、内容は次のとおり。

  1. 転送先の位置とサイズ
    転送先の左上隅の座標値と右下隅の座標値を示すRECT構造体のポインタを指定。
  2. 転送元サーフェイス
    転送元サーフェイスのポインタを指定。
  3. 転送元の座標値
    転送元の左上隅の座標値と右下隅の座標値を示すRECT構造体のポインタを指定。
  4. ブロック転送の組み合わせ
    ブロック転送に効果をつける場合や特殊な処理をするときに指定。指定しないときはNULL。
  5. 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;

3.通常のBlt処理を関数化する

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
そのまま転送

4.効果をつけるBlt処理を関数化する

上記関数を、効果をつけて描画できるよう改造する。

//-----------------------------------------------------------------------------
// 関数名 : 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 度回転

[ TOP ]