透明色を設定して Sprite を表示する

DirectX の D3DXCreateTextureFromFileEx で黒を ColorKey(透明色)に設定して画像を回転しながら描画します。
透明色を設定した PNG 画像を使うと、プログラムで透明色の設定をしなくても透明になるので試してみて下さい。

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

プログラムの説明

  1. 新規作成で空のプロジェクト(Spcolkey)を作成してプログラムファイルとヘッダファイルをプロジェクトに追加して下さい。
    myd3d.h と myd3d.cpp は Object Class Library から取得して下さい。
    ファイル名 ファイルの説明
    spcolkey.cpp 「プログラムの説明」を参考に作成して下さい
    myd3d.h MyD3D Object Class ヘッダファイル
    myd3d.cpp MyD3D Object Class プログラムファイル
  2. #define と #include と Global Area の定義です。
    ImgFile[] は表示するイメージファイルで、透明色の部分を黒(0,0,0)で塗りつぶして下さい。
    透明色を使う場合は JPEG を避けて、BMP または GIF 形式を使って下さい。
    Global Area の定義と WinMain() はいつもと同じです。
        #define     NAME    "DirectX9 Colorkey"
        #include    "MyD3D.h"
    
        // Global Area
        HINSTANCE               g_hInst     = NULL;
        HWND                    g_hWnd      = NULL;
        MyD3D                   *myd3d      = NULL;     // MyD3D Object Class
        LPDIRECT3DDEVICE9       g_pDEV      = NULL;     // Direct3DDevice interface
        D3DPRESENT_PARAMETERS   g_D3DPP;                // D3DDeviceの設定
        LPD3DXSPRITE            g_pSprite   = NULL;     // スプライト
        LPDIRECT3DTEXTURE9      g_pTexture  = NULL;     // スプライトに使うテクスチャ
        bool                    g_bActive   = false;    // アクティブ状態
        bool                    g_bLost     = false;    // デバイスの消失フラグ
        char                    ImgFile[]   = "c:\\data\\test\\kishi.bmp";
        
  3. Direct3D のデバイスを設定して Sprite を生成します。
    透明色(ColorKey)を設定するときは LoadTextureBlack() を使います。
    LoadTextureBlack() では、黒(0,0,0) を透明色に設定しています。
    画像に黒色が使われているときは (8,8,8) ぐらいに設定して下さい。
        HRESULT InitDXGraphics(void)
        {   HRESULT  hr;
    
            // Direct3D デバイスの設定
            myd3d= new MyD3D(g_hWnd);
            myd3d->InitD3D(&g_pDEV);
            g_D3DPP= myd3d->D3DPPWin;
            // スプライト作成
            hr = D3DXCreateSprite(g_pDEV, &g_pSprite);
            if (FAILED(hr))
                return DXTRACE_ERR("InitDXGraphics D3DXCreateSprite", hr);
            // テクスチャの読み込み
            g_pTexture= myd3d->LoadTextureBlack(ImgFile);
            return S_OK;
        }
        
  4. Sprite に ColorKey を設定して、回転しながら描画する関数です。
    透明色を使うときは Begin(D3DXSPRITE_ALPHABLEND) で始めます。
    &D3DXVECTOR3(64,64,0) は回転する画像の中心位置で、今回描画した画像は 128*128 のサイズです。
        HRESULT Draw(void)
        {   D3DXMATRIX      matWorld,matWork;
    
            D3DXMatrixRotationZ(&matWorld,timeGetTime()/1000.0f);
            D3DXMatrixTranslation(&matWork,128.0f,128.0f,0.0f);
            matWorld= matWorld*matWork;
            g_pSprite->SetTransform(&matWorld);
            g_pDEV->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(200,150,0),1.0f,0);
            // シーンの描画開始
            if (SUCCEEDED(g_pDEV->BeginScene()))
            {   // シーンの描画(スプライトの描画)
                g_pSprite->Begin(D3DXSPRITE_ALPHABLEND);
                g_pSprite->Draw(g_pTexture,NULL,&D3DXVECTOR3(64,64,0),NULL,0xffffffff);
                g_pSprite->End();
                // シーンの描画終了
                g_pDEV->EndScene();
            }
            // シーンの表示
            return g_pDEV->Present(NULL, NULL, NULL, NULL);
        }
        
  5. WndProc(), CleanupDXGraphics() はいつもと同じです。

【NOTE】

  1. テクスチャを入力する DirectX の関数の説明です。
    D3DXCreateTextureFromFileEx() でパラメータを省略して画像を入力します。
    画像サイズが2のベキ乗に調整されます。
    hr = D3DXCreateTextureFromFile(pDEV,MapFile,&Texture);
  2. 黒を透明色に設定して画像を入力します。
    第三パラメータと第四パラメータを D3DX_DEFAULT にすると2のベキ乗に画像サイズが調整されます。
        hr= D3DXCreateTextureFromFileEx(pDEV,MapFile,D3DX_DEFAULT,D3DX_DEFAULT,
              1,0,D3DFMT_UNKNOWN,D3DPOOL_MANAGED,D3DX_DEFAULT,D3DX_DEFAULT,
              D3DCOLOR_XRGB(0,0,0),NULL,NULL,&Texture);
        
  3. D3DXCreateTextureFromFileEx() の第三パラメータと第四パラメータは画像の幅と高さです。
    ここに画像サイズを設定すると2のベキ乗に束縛されることなく実際の画像サイズで格納することができます。
        hr= D3DXCreateTextureFromFileEx(pDEV,MapFile,ImgWidth,ImgHeight,
              1,0,D3DFMT_UNKNOWN,D3DPOOL_MANAGED,D3DX_DEFAULT,D3DX_DEFAULT,
              D3DCOLOR_XRGB(0,0,0),NULL,NULL,&Texture);
        
  4. 第三パラメータと第四パラメータにサイズを設定するときは、D3DXGetImageInfoFromFile() でサイズを取得します。
        {   D3DXIMAGE_INFO  ImageInfo;
    
            //画像ファイル情報を取得
            hr= D3DXGetImageInfoFromFile(_T(ImgFile),&ImageInfo);
            if (FAILED(hr))
            {   MessageBox(NULL,ImgFile,"Image Info Error",MB_OK);
                return FALSE;
            }
            Width=  ImageInfo.Width;
            Height= ImageInfo.Height;
        

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

超初心者のプログラム入門(DirectX9 game program)