fade-in, fade-out で文字を表示する

Back Buffer を取得して、3Dモデルの上から fade-in, fade-out で文字を表示します。

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

プログラムの説明

  1. #define と #include と Direct3D の領域です。
    myd3d が MyD3D Object Class の定義です。
    hFont1 に画面に表示する大きな文字フォントを設定します。
    M_1 が fade-in, fade-out を制御する変数で、1を設定すると fade-in が始まります。
    M_dt が fade-in と fade-out の区別と切り替え速度です。
        #include    "MyD3D.h"
    
        //Global Area
        MyD3D                   *myd3d           = NULL;    // MyD3D Object Class
        HWND                    g_hWnd           = NULL;
        LPDIRECT3DDEVICE9       g_pDEV           = NULL;
        LPD3DXMESH              g_pMesh          = NULL;
        bool                    g_bActive        = false;   // アクティブ状態
        LPDIRECT3DSURFACE9      g_pBackBuffer    = NULL;    // Back Buffer Surface
        D3DXVECTOR3             ViewForm(0.0f,0.0f,-200.0f);
        HFONT                   hFont1,hFontOld;
        int                     M_1 = 0;                    // TITLE  1 → 1000 → 0
        int                     M_dt= 0;                    // TITLE  +n:fade-in  -n:fade-out
        
  2. WinMain() 関数は何時もと同じです。
  3. Direct Graphics の初期化です。
    Object Class をインスタンス化して、DirectX のインターフェースを取得します。
    トーラスのメッシュを生成します。
    GetBackBuffer() で Back Buffer を取得します。
    SetMyFont() で大きな文字フォントを設定します。
        HRESULT InitGraphics(void)
        {   HRESULT hr;
    
            myd3d= new MyD3D(g_hWnd);
            myd3d->InitD3D(&g_pDEV);
            //トーラスメッシュの生成
            D3DXCreateTorus(g_pDEV,16,40,32,32,&g_pMesh,NULL);
            //Back Buffer を取得
            hr= g_pDEV->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&g_pBackBuffer);
            if (FAILED(hr))
            {   MessageBox(NULL,"GetBackBuffer Error","Error Message", MB_OK);
                return E_FAIL;
            }
            hFont1= myd3d->SetMyFont((LPCTSTR)"MS 明朝", 96, 0);
            return  S_OK;
        }
        
  4. 描画処理のソースコードです。
    Clear() で画面をクリアしてトーラスを表示します。
    M_1>0 のとき fade-in, fade-out で文字を表示します。
    M_1 の値で文字の色を計算します。
    背景色と同じ色(青)からオレンジに、そしてオレンジから青に戻します。
    Sprite の画像を使うとアルファ・ブレンディングが使えるのですが、今回は TextOut で書いています。
    M_1 の値は M_dt ずつアップされ 1000 に達するとダウンされます。
        void Draw(void)
        {   HDC         hDC;
            HRESULT     hr;
            int         r,g,b;
    
            g_pDEV->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,150),1.0f,0);
            if (SUCCEEDED(g_pDEV->BeginScene()))
            {   g_pDEV->BeginScene();
                SetupMatrices();
                g_pMesh->DrawSubset(0);
                g_pDEV->EndScene();
            }
            //fade-in, fade-out で文字を表示
            if (M_1>0)
            {   if (g_pBackBuffer!=NULL)
                {   hr= g_pBackBuffer->GetDC(&hDC);
                    if (!FAILED(hr))
                    {   r= M_1/4;
                        g= r/2;
                        b= 150-r;
                        if (b<0)      b=0;
                        SetTextColor(hDC,RGB(r,g,b));
                        SetBkMode(hDC,TRANSPARENT);
                        hFontOld= (HFONT)SelectObject(hDC, hFont1);
                        TextOut(hDC,100,160,"DirectX 9",9);
                        SelectObject(hDC, hFontOld);
                        g_pBackBuffer->ReleaseDC(hDC);
                    }
                    else    MessageBox(NULL,"GetDC Error","Error Message", MB_OK);
                }
                M_1+= M_dt;
                if (M_1>=1000)  M_dt= 0-M_dt;
            }
            g_pDEV->Present(NULL,NULL,NULL,NULL);
        }
        
  5. CALLBACK 関数です。
    Enter キーがタイプされるとアニメーションを開始します。
    M_dt の値で fade-in, fade-out の速度を設定します。
    ESCAPE キーでウインドウを閉じます。
            case WM_KEYDOWN:
                switch(wParam)
                {   case VK_ESCAPE:     // [ESCAPE]キーでウインドウを閉じる
                        PostMessage(hWnd,WM_CLOSE,0,0);
                        break;
                    case VK_RETURN:     //Enter キーでアニメーション開始
                        M_1= 1;
                        M_dt= 5;
                        break;
                }
                break;
        
  6. 描画環境を設定する関数では、タイマを取得してY軸を中心に回転しています。
        void  SetupMatrices(void)
        {   RECT            rect;
            D3DXMATRIX      matWorld;
            D3DXMATRIX      matView;
            D3DXMATRIX      matProj;
    
            GetClientRect(g_hWnd,&rect);
            //World 座標をY軸を中心に自動回転
            D3DXMatrixRotationY(&matWorld,timeGetTime()/1000.0f);
            g_pDEV->SetTransform(D3DTS_WORLD,&matWorld);
            //View 座標の設定
            D3DXMatrixLookAtLH(&matView,&ViewForm,
                               &D3DXVECTOR3(0.0f,0.0f,0.0f),&D3DXVECTOR3(0.0f,1.0f,0.0f));
            g_pDEV->SetTransform(D3DTS_VIEW,&matView);
            //透視変換の設定
            D3DXMatrixPerspectiveFovLH(&matProj,D3DXToRadian(45.0f),(float)rect.right/(float)rect.bottom,100,1000);
            g_pDEV->SetTransform(D3DTS_PROJECTION,&matProj);
            //Material と Light の設定
            myd3d->SetMaterial(0.8f,0.7f,0.0f);
            myd3d->SetLight();
        }
        
  7. オブジェクトを開放する処理です。
    文字 Font や Back Buffer も開放して下さい。
        void Cleanup(void)
        {
            DeleteObject(hFont1);
            SAFE_RELEASE(g_pBackBuffer);
            SAFE_RELEASE(g_pMesh);
            SAFE_DELETE(myd3d);
        }
        

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

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

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

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