透明色を使って描画する

TransparentBlt() で透明色を使って画像を描画します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 新規プロジェクト(ColorKey)を作成して下さい。
    透明色を使った描画は TransparentBlt() 関数を使います。
  2. TransparentBlt() 関数を使うときは wingdi.h をインクルードして、msimg32.lib をリンクして下さい。
        #include    <windows.h>
        #include    <wingdi.h>
        #pragma     once
        #pragma     comment(lib,"msimg32.lib")
        
  3. 透明色を設定した描画は、BitBlt() の代わりに TransparentBlt() を使うだけです。
    RGB(0,0,0) が透明色の設定で、今回は黒を使っています。
        BitBlt(hdc,xp,yp,bmp.bmWidth,bmp.bmHeight,hmdc,0,0,SRCCOPY);
    
        TransparentBlt(hdc,xp,yp,bmp.bmWidth,bmp.bmHeight,hmdc,0,0,
                       bmp.bmWidth,bmp.bmHeight,RGB(0,0,0));
        
  4. CALLBACK 関数の WM_PAINT: です。
    LoadBMP() で背景画像(あゆの画像)を描画します。
    ColorKey() で背景画像に重ねてキャラクタの画像(騎士の画像)を表示します。
    騎士の画像は、透明にする部分を黒で塗りつぶして下さい。
    LoadBMP() は BitBlt() で描画する関数で、ColorKey() は TransparentBlt() で描画する関数です。
        case WM_PAINT:
            hdc= BeginPaint (hWnd, &ps);
            LoadBMP(hWnd, "ayu.bmp", 0, 0);
            ColorKey(hWnd, "kishi.bmp", 80, 30);
            EndPaint(hWnd, &ps);
            break;
        
  5. 透明色で描画するには「透明部分以外を黒で塗りつぶしたマスク画像」が必要なのですが、TransparentBlt() で描画すると 毎回マスク画像が作成されるようです。
    マスク画像を毎回作成するのは時間のロスですが、特に描画速度を必要とするゲームプログラム以外では問題無いでしょう。
    描画の速度を上げる工夫は 「ちらつき」を抑えて描画 を参照して下さい。

【演習】

  1. 背景に表示する画像と上から重ねる画像を作成して下さい。
    上から重ねる画像は、透明にする部分を黒で塗りつぶして下さい。
    画像に黒が使われている時は、真の黒(0,0,0) を使わないで、ややうすい黒(8,8,8)を使います。
  2. LoadBMP() と ColorKey() を作成して、プログラムを完成させて下さい。
    画像を表示するには HDC が必要になりますが、HDC は hWnd から GetDC(hWnd) で取得することが出来ます。
    取得した HDC は用が済めば開放して下さい。
        HDC     hdc;
            hdc= GetDC(hWnd);
               :
            ReleaseDC(hWnd,hdc);
        
  3. 背景画像に重ねて表示したキャラクタの画像を上下左右の矢印キーで操作して下さい。

超初心者のプログラム入門(Win32API C++)